firewall-cmd

Linux上新用的防火牆軟件,跟iptables差不多的工具

補充說明

firewall-cmd 是 firewalld的字符界面管理工具,firewalld是centos7的一大特性,最大的好處有兩個:支持動態更新,不用重啓服務;第二個就是加入了防火牆的“zone”概念。

firewalld跟iptables比起來至少有兩大好處:

  1. firewalld可以動態修改單條規則,而不需要像iptables那樣,在修改了規則後必須得全部刷新纔可以生效。
  2. firewalld在使用上要比iptables人性化很多,即使不明白“五張表五條鏈”而且對TCP/IP協議也不理解也可以實現大部分功能。

firewalld自身並不具備防火牆的功能,而是和iptables一樣需要通過內核的netfilter來實現,也就是說firewalld和 iptables一樣,他們的作用都是用於維護規則,而真正使用規則幹活的是內核的netfilter,只不過firewalld和iptables的結 構以及使用方法不一樣罷了。

命令格式

1firewall-cmd [選項 ... ]

選項

通用選項

1-h, --help    # 顯示幫助信息;
2-V, --version # 顯示版本信息. (這個選項不能與其他選項組合);
3-q, --quiet   # 不打印狀態消息;

狀態選項

1--state                # 顯示firewalld的狀態;
2--reload               # 不中斷服務的重新加載;
3--complete-reload      # 中斷所有連接的重新加載;
4--runtime-to-permanent # 將當前防火牆的規則永久保存;
5--check-config         # 檢查配置正確性;

日誌選項

1--get-log-denied         # 獲取記錄被拒絕的日誌;
2--set-log-denied=<value> # 設置記錄被拒絕的日誌,只能爲 'all','unicast','broadcast','multicast','off' 其中的一個;

實例

 1# 安裝firewalld
 2yum install firewalld firewall-config
 3
 4systemctl start  firewalld # 啓動
 5systemctl stop firewalld  # 停止
 6systemctl enable firewalld # 啓用自動啓動
 7systemctl disable firewalld # 禁用自動啓動
 8systemctl status firewalld # 或者 firewall-cmd --state 查看狀態
 9
10# 關閉服務的方法
11# 你也可以關閉目前還不熟悉的FirewallD防火牆,而使用iptables,命令如下:
12
13systemctl stop firewalld
14systemctl disable firewalld
15yum install iptables-services
16systemctl start iptables
17systemctl enable iptables

配置firewalld

 1firewall-cmd --version  # 查看版本
 2firewall-cmd --help     # 查看幫助
 3
 4# 查看設置:
 5firewall-cmd --state  # 顯示狀態
 6firewall-cmd --get-active-zones  # 查看區域信息
 7firewall-cmd --get-zone-of-interface=eth0  # 查看指定接口所屬區域
 8firewall-cmd --panic-on  # 拒絕所有包
 9firewall-cmd --panic-off  # 取消拒絕狀態
10firewall-cmd --query-panic  # 查看是否拒絕
11
12firewall-cmd --reload # 更新防火牆規則
13firewall-cmd --complete-reload
14# 兩者的區別就是第一個無需斷開連接,就是firewalld特性之一動態添加規則,第二個需要斷開連接,類似重啓服務
15
16
17# 將接口添加到區域,默認接口都在public
18firewall-cmd --zone=public --add-interface=eth0
19# 永久生效再加上 --permanent 然後reload防火牆
20 
21# 設置默認接口區域,立即生效無需重啓
22firewall-cmd --set-default-zone=public
23
24# 查看所有打開的端口:
25firewall-cmd --zone=dmz --list-ports
26
27# 加入一個端口到區域:
28firewall-cmd --zone=dmz --add-port=8080/tcp
29# 若要永久生效方法同上
30 
31# 打開一個服務,類似於將端口可視化,服務需要在配置文件中添加,/etc/firewalld 目錄下有services文件夾,這個不詳細說了,詳情參考文檔
32firewall-cmd --zone=work --add-service=smtp
33 
34# 移除服務
35firewall-cmd --zone=work --remove-service=smtp
36
37# 顯示支持的區域列表
38firewall-cmd --get-zones
39
40# 設置爲家庭區域
41firewall-cmd --set-default-zone=home
42
43# 查看當前區域
44firewall-cmd --get-active-zones
45
46# 設置當前區域的接口
47firewall-cmd --get-zone-of-interface=enp03s
48
49# 顯示所有公共區域(public)
50firewall-cmd --zone=public --list-all
51
52# 臨時修改網絡接口(enp0s3)爲內部區域(internal)
53firewall-cmd --zone=internal --change-interface=enp03s
54
55# 永久修改網絡接口enp03s爲內部區域(internal)
56firewall-cmd --permanent --zone=internal --change-interface=enp03s

服務管理

 1# 顯示服務列表  
 2Amanda, FTP, Samba和TFTP等最重要的服務已經被FirewallD提供相應的服務,可以使用如下命令查看:
 3
 4firewall-cmd --get-services
 5
 6# 允許SSH服務通過
 7firewall-cmd --new-service=ssh
 8
 9# 禁止SSH服務通過
10firewall-cmd --delete-service=ssh
11
12# 打開TCP的8080端口
13firewall-cmd --enable ports=8080/tcp
14
15# 臨時允許Samba服務通過600秒
16firewall-cmd --enable service=samba --timeout=600
17
18# 顯示當前服務
19firewall-cmd --list-services
20
21# 添加HTTP服務到內部區域(internal)
22firewall-cmd --permanent --zone=internal --add-service=http
23firewall-cmd --reload     # 在不改變狀態的條件下重新加載防火牆

端口管理

 1# 打開443/TCP端口
 2firewall-cmd --add-port=443/tcp
 3
 4# 永久打開3690/TCP端口
 5firewall-cmd --permanent --add-port=3690/tcp
 6
 7# 永久打開端口好像需要reload一下,臨時打開好像不用,如果用了reload臨時打開的端口就失效了
 8# 其它服務也可能是這樣的,這個沒有測試
 9firewall-cmd --reload
10
11# 查看防火牆,添加的端口也可以看到
12firewall-cmd --list-all

直接模式

1# FirewallD包括一種直接模式,使用它可以完成一些工作,例如打開TCP協議的9999端口
2
3firewall-cmd --direct -add-rule ipv4 filter INPUT 0 -p tcp --dport 9000 -j ACCEPT
4firewall-cmd --reload

自定義服務管理

選項

 1(末尾帶有 [P only] 的話表示該選項除了與(--permanent)之外,不能與其他選項一同使用!)
 2--new-service=<服務名> 新建一個自定義服務 [P only]
 3--new-service-from-file=<文件名> [--name=<服務名>]
 4                      從文件中讀取配置用以新建一個自定義服務 [P only]
 5--delete-service=<服務名>
 6                      刪除一個已存在的服務 [P only]
 7--load-service-defaults=<服務名>
 8                      Load icmptype default settings [P only]
 9--info-service=<服務名>
10                      顯示該服務的相關信息
11--path-service=<服務名>
12                      顯示該服務的文件的相關路徑 [P only]
13--service=<服務名> --set-description=<描述>
14                      給該服務設置描述信息 [P only]
15--service=<服務名> --get-description
16                      顯示該服務的描述信息 [P only]
17--service=<服務名> --set-short=<描述>
18                      給該服務設置一個簡短的描述 [P only]
19--service=<服務名> --get-short
20                      顯示該服務的簡短描述 [P only]
21                      
22--service=<服務名> --add-port=<端口號>[-<端口號>]/<protocol>
23                      給該服務添加一個新的端口(端口段) [P only]
24                      
25--service=<服務名> --remove-port=<端口號>[-<端口號>]/<protocol>
26                      從該服務上移除一個端口(端口段) [P only]
27                      
28--service=<服務名> --query-port=<端口號>[-<端口號>]/<protocol>
29                      查詢該服務是否添加了某個端口(端口段) [P only]
30                      
31--service=<服務名> --get-ports
32                      顯示該服務添加的所有端口 [P only]
33                      
34--service=<服務名> --add-protocol=<protocol>
35                      爲該服務添加一個協議 [P only]
36                      
37--service=<服務名> --remove-protocol=<protocol>
38                      從該服務上移除一個協議 [P only]
39                      
40--service=<服務名> --query-protocol=<protocol>
41                      查詢該服務是否添加了某個協議 [P only]
42                      
43--service=<服務名> --get-protocols
44                      顯示該服務添加的所有協議 [P only]
45                      
46--service=<服務名> --add-source-port=<端口號>[-<端口號>]/<protocol>
47                      添加新的源端口(端口段)到該服務 [P only]
48                      
49--service=<服務名> --remove-source-port=<端口號>[-<端口號>]/<protocol>
50                      從該服務中刪除源端口(端口段) [P only]
51                      
52--service=<服務名> --query-source-port=<端口號>[-<端口號>]/<protocol>
53                      查詢該服務是否添加了某個源端口(端口段) [P only]
54                      
55--service=<服務名> --get-source-ports
56                      顯示該服務所有源端口 [P only]
57                      
58--service=<服務名> --add-module=<module>
59                      爲該服務添加一個模塊 [P only]
60--service=<服務名> --remove-module=<module>
61                      爲該服務移除一個模塊 [P only]
62--service=<服務名> --query-module=<module>
63                      查詢該服務是否添加了某個模塊 [P only]
64--service=<服務名> --get-modules
65                      顯示該服務添加的所有模塊 [P only]
66--service=<服務名> --set-destination=<ipv>:<address>[/<mask>]
67                      Set destination for ipv to address in service [P only]
68--service=<服務名> --remove-destination=<ipv>
69                      Disable destination for ipv i service [P only]
70--service=<服務名> --query-destination=<ipv>:<address>[/<mask>]
71                      Return whether destination ipv is set for service [P only]
72--service=<服務名> --get-destinations
73                      List destinations in service [P only]

控制端口 / 服務

可以通過兩種方式控制端口的開放,一種是指定端口號另一種是指定服務名。雖然開放 http 服務就是開放了 80 端口,但是還是不能通過端口號來關閉,也就是說通過指定服務名開放的就要通過指定服務名關閉;通過指定端口號開放的就要通過指定端口號關閉。還有一個要注意的就是指定端口的時候一定要指定是什麼協議,tcp 還是 udp。知道這個之後以後就不用每次先關防火牆了,可以讓防火牆真正的生效。

1firewall-cmd --add-service=mysql        # 開放mysql端口
2firewall-cmd --remove-service=http      # 阻止http端口
3firewall-cmd --list-services            # 查看開放的服務
4firewall-cmd --add-port=3306/tcp        # 開放通過tcp訪問3306
5firewall-cmd --remove-port=80tcp        # 阻止通過tcp訪問3306
6firewall-cmd --add-port=233/udp         # 開放通過udp訪問233
7firewall-cmd --list-ports               # 查看開放的端口

僞裝 IP

1firewall-cmd --query-masquerade # 檢查是否允許僞裝IP
2firewall-cmd --add-masquerade   # 允許防火牆僞裝IP
3firewall-cmd --remove-masquerade# 禁止防火牆僞裝IP

端口轉發

端口轉發可以將指定地址訪問指定的端口時,將流量轉發至指定地址的指定端口。轉發的目的如果不指定 ip 的話就默認爲本機,如果指定了 ip 卻沒指定端口,則默認使用來源端口。 如果配置好端口轉發之後不能用,可以檢查下面兩個問題:

  1. 比如我將 80 端口轉發至 8080 端口,首先檢查本地的 80 端口和目標的 8080 端口是否開放監聽了
  2. 其次檢查是否允許僞裝 IP,沒允許的話要開啓僞裝 IP
1firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080   # 將80端口的流量轉發至8080
2firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.0.1 # 將80端口的流量轉發至192.168.0.1
3firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.0.1:toport=8080 # 將80端口的流量轉發至192.168.0.1的8080端口
  1. 當我們想把某個端口隱藏起來的時候,就可以在防火牆上阻止那個端口訪問,然後再開一個不規則的端口,之後配置防火牆的端口轉發,將流量轉發過去。
  2. 端口轉發還可以做流量分發,一個防火牆拖着好多臺運行着不同服務的機器,然後用防火牆將不同端口的流量轉發至不同機器。 來源:https://github.com/jaywcjlove/linux-command
最後修改於: Wednesday, January 31, 2024

相關文章:

翻譯: