Linux 下如何設置防火墻,你會嗎
防火墻,顧名思義,就是用一睹墻隔絕了外部的攻擊,讓墻里面的環境相對安全
在 Linux 中,防火墻是以一個守護進程的方式存在,服務的名字是 firewalld,它能夠定義一組規則來控制外部傳入系統中的網絡流量,規則允許的流量才能進入系統,規則禁止的流量會被攔下
簡介
firewalld 提供了一個動態定制規則的方式,我們可以實時 創建、更改和刪除規則
firewalld 使用區域和服務的概念來簡化流量管理。區域是預定義的規則集,網絡接口可以分配給區域。流量能否進入主機取決于計算機連接的網絡以及為網絡設置的安全級別。所有預定義的規則,對各服務的傳入流量,都有一些必要的設置
服務是通過端口和外部應用通訊的,而防火墻就是根據端口進行流量過濾的,Linux 的防火墻默認是關閉所有端口的,如果要允許服務和外部應用進行通訊,必須開啟服務的端口,但是某些區域 ( 例如:trusted ),默認是允許所有流量通過的
- 區域
防火墻能夠根據用戶設置的信任級別把網絡劃分成許多的區域,一個網絡連接只能歸屬于一個區域,一個區域能容納很多的網絡連接
系統默認的所有區域存儲在 /usr/lib/firewalld/zones 目錄中,它們可以應用在網絡接口上 , 下面的截圖展示了各區域默認配置
block : 對于外部主動主動發起的連接,主機會返回一個 icmp 包來拒絕,但主機可以向外部主動發起連接
dmz: 非軍事區域內的計算機可以公開訪問,但是對于內部網絡,只接受指定的連接
drop:對于傳入的網絡數據包,主機直接拒接,不返回任何消息包,只允許從主機傳出數據包
external:用于使用偽裝的外部網絡,尤其是路由器,為了防止網絡中其他計算機的攻擊,僅接受指定的傳入連接
home: 用于在家里使用,此時,對于網絡中的計算機,大多比較信任,也是僅接受指定的傳入連接
internal:用于內部網絡,此時,對于網絡中的計算機,大多比較信任,也是僅接受指定的傳入連接
public:用于公共區域,此時,不能信任網絡中的計算機,僅接受指定的傳入連接
trusted:接受所有的網絡連接
work:用于工作區域,此時,對于網絡中的計算機,大多比較信任,但也僅接受指定的傳入連接
在上述區域中,public 是安裝防火墻時默認的區域,當有網絡連接到達時,會將它分配到默認區域里
安裝
一般發行版的 Linux 都預裝了防火墻,如果沒有裝的話,可以使用下面的命令進行安裝
- yum install firewalld -y
啟動、關閉防火墻
- systemctl start firewalld # 啟動防火墻服務
- systemctl stop firewalld # 關閉防火墻服務
設置開機啟動、禁止開機啟動
- systemctl enable firwalld # 開機啟動防火墻服務
- systemctl disable firwalld # 禁止開機啟動防火墻服務
常用選項
firewall-cmd 是防火墻配置管理工具,它的參數較多,下表列出常用的參數及作用,更多參數自行通過 man 命令進行查看
選項 | 說明 |
---|---|
--state | 防火墻開啟狀態 |
--reload | 重新加載防火墻規則 |
--get-default-zone | 獲取默認區域 |
--set-default-zone=xxx | 設置默認區域為 xxx |
--list-all --zone=xxx | 列出 xxx 區域中所有允許的子項 |
--list-all-zones | 列出所有區域中所有允許的子項 |
--permanent --new-zone=xxx | 增加一個永久的新區域 |
--permanent --delete-zone=xxx | 移除一個已存在的永久區域 |
--list-ports --zone=xxx | 列出 xxx 區域中添加的端口 |
--add-port=x --zone=xxx | xxx 區域中添加 x 端口 |
--remove-port=x --zone=xxx | xxx區域中移除 x 端口 |
--query-port=x --zone=xxx | 查詢 xxx 區域中是否已添加 x 端口 |
--list-services=x --zone=xxx | 列出 xxx 區域中所有允許的服務器 |
--query-service=x --zone=xxx | 查詢是否允許 xxx 區域中 x 服務的流量 |
--add-service=x --zone=xxx --timeout= t | 允許 xxx 區域中 x 服務的流量,超時時間 t |
--remove-service=x --zone=xxx | 從 xxx 區域中移除 x 服務 |
常用操作
- 運行時和永久
對防火墻規則的修改有運行時和永久兩種模式
運行時模式又稱為當前生效模式,是默認的模式,它在防火墻服務重新加載、重啟服務,重啟系統時會失效
--permanent 是設置永久的選項,設置之后不會立馬生效,需要重啟服務、重新加載防火墻服務或者系統重啟才生效
沒有 --permanent 選項,修改的僅僅是運行時的配置,另外,--permanent 選項并不是對所有的選項都有效
如果要運行時和永久都生效的話,需要運行時和永久性各設置一次,也即 運行時不帶 --permanent ,而永久性時則需添加該選項
例如:現在設置 public 區域允許 80 端口 TCP 流量通過,并且運行時和永久性都都生效,具體的設置如下
- [root@cghost23 ~]# firewall-cmd --zone=public --list-port --permanent
- [root@cghost23 ~]# firewall-cmd --zone=public --list-port
- [root@cghost23 ~]# firewall-cmd --zone=public --add-port=80/tcp
- success
- [root@cghost23 ~]# firewall-cmd --zone=public --add-port=80/tcp --permanent
- success
- [root@cghost23 ~]# firewall-cmd --zone=public --list-port --permanent
- 80/tcp
- [root@cghost23 ~]# firewall-cmd --zone=public --list-port
- 80/tcp
設置之前,運行時和永久都禁止 80 端口的流量通過,設置后,都允許通過,--add-port=80/tcp 是設置運行時,--add-port=80/tcp --permanent 是設置永久
- 查看防火墻狀態
防火墻未啟用
- [root@cghost23 ~]# firewall-cmd --state
- not running
防火墻已啟用
- [root@cghost23 ~]# firewall-cmd --state
- running
- 重新加載
--reload 選項是重新加載防火墻規則,并保持活躍連接的狀態
- [root@cghost23 ~]# firewall-cmd --reload
- success
需要注意的是,重新加載會導致已經添加的運行時的規則丟失
- [root@cghost23 ~]# firewall-cmd --zone=public --add-port 80/tcp
- success
- [root@cghost23 ~]# firewall-cmd --zone=public --list-port
- 80/tcp
- [root@cghost23 ~]# firewall-cmd --reload
- success
- [root@cghost23 ~]# firewall-cmd --zone=public --list-port
- [root@cghost23 ~]#
上面的示例中,先設置 public 區域允許 80 端口通過 TCP 協議的流量,通過 --zone=public --list-port 選項的結果確認設置成功了
重新加載防火墻規則,然后再次查詢 public 區域中所有已經允許流量通過的端口號,從上述結果中可以知道之前的設置丟失了
要想重新加載之后配置依然生效的話,需要添加永久選項 --permanent
- [root@cghost23 ~]# firewall-cmd --zone=public --add-port 80/tcp --permanent
- success
- [root@cghost23 ~]# firewall-cmd --zone=public --list-port --permanent
- 80/tcp
- [root@cghost23 ~]# firewall-cmd --reload
- success
- [root@cghost23 ~]# firewall-cmd --zone=public --list-port --permanent
- 80/tcp
- [root@cghost23 ~]# firewall-cmd --zone=public --list-port
- 80/tcp
可以看到,在添加了 --permanent 選項后,重新加載防火墻規則,之前的設置依然是有效的,所以,如果想要添加的規則永久生效,需要加上 --permanent 選項
- 當前默認區域
新的網絡連接,默認是分配到防火墻 public 區域的,這個默認區域可以通過下面的命令獲取
- [root@cghost23 ~]# firewall-cmd --get-default-zone
- public
下面的命令是設置默認區域為 public,由于當前默認區域已經是 public 了,所以會提示當前默認區域已經是 public
- [root@cghost23 ~]# firewall-cmd --set-default-zone=public
- Warning: ZONE_ALREADY_SET: public
- 列出所有可用的區域
- [root@cghost23 ~]# firewall-cmd --get-zones
- block dmz drop external home internal public trusted work
- 添加和刪除新區域
添加一個新的永久的區域 myzone,添加新區域需要加上 --permanent 選項,之后再重新加載一下就可以生效了
- [root@cghost23 ~]# firewall-cmd --new-zone=myzone --permanent
- success
- [root@cghost23 ~]# firewall-cmd --reload
- success
- [root@cghost23 ~]# firewall-cmd --zone=myzone --list-all
- myzone
- interfaces:
- sources:
- services:
- ports:
- masquerade: no
- forward-ports:
- icmp-blocks:
- rich rules:
移除區域 myzone,同樣,移除一個已存在的區域也需要加上 --permanent 選項,并且需要重新加載才會生效
- [root@cghost23 ~]# firewall-cmd --delete-zone=myzone --permanent
- success
- [root@cghost23 ~]# firewall-cmd --reload
- success
- [root@cghost23 ~]# firewall-cmd --zone=myzone --list-all
- Error: INVALID_ZONE: myzone
- 查詢區域允許的服務和端口
使用 --list-all 選項可查詢默認區域中允許的服務以及端口, 下面的結果中 services 和 ports 分別表示允許的服務和端口
- [root@cghost23 ~]# firewall-cmd --list-all
- public (default, active)
- interfaces: ens33
- sources:
- services: dhcpv6-client samba-client ssh
- ports: 80/tcp
- masquerade: no
- forward-ports:
- icmp-blocks:
- rich rules:
如果需要查詢指定區域所有允許的服務和端口,可以加上 --zone = xxx 選項, xxx 表示指定的區域,比如:下面的命令是查詢 trusted 區域允許的服務和端口
- [root@cghost23 ~]# firewall-cmd --zone=trusted --list-all
- trusted
- interfaces:
- sources:
- services:
- ports:
- masquerade: no
- forward-ports:
- icmp-blocks:
- rich rules:
- 查看是否允許指定服務的流量通過
不指定區域時,默認區域是 public, 下面是查看默認區域是否允許 SSH 以及 HTTPS 流量
- [root@cghost23 ~]# firewall-cmd --query-service=ssh
- yes
- [root@cghost23 ~]# firewall-cmd --query-service=https
- no
如果查看其它區域,則需要指定具體的區域
- [root@cghost23 ~]# firewall-cmd --zone=public --query-service=ssh
- yes
- [root@cghost23 ~]# firewall-cmd --zone=trusted --query-service=ssh
- no
- 允許和禁止指定服務的流量通過
public 區域允許 samba-client 服務的流量通過
- [root@cghost23 ~]# firewall-cmd --add-service=samba-client --zone=public
- success
- [root@cghost23 ~]# firewall-cmd --query-service=samba-client --zone=public
- yes
public 區域禁止 samba-client 服務的流量
- [root@cghost23 ~]# firewall-cmd --remove-service=samba-client --zone=public
- success
- [root@cghost23 ~]# firewall-cmd --query-service=samba-client --zone=public
- no
- 查看是否允許指定端口的流量通過
查看 public 區域所有允許的端口
- [root@cghost23 ~]# firewall-cmd --list-port --zone=public
- 80/tcp 6379/tcp 6000-6010/tcp
查看 public 區域是否允許 6379 端口的 TCP 流量通過
- [root@cghost23 ~]# firewall-cmd --list-port --zone=public
- 80/tcp 6379/tcp 6000-6010/tcp
- 允許和禁止指定端口的流量通過
public 區域允許 8080 端口的 TCP 流量通過,也可以理解為對外開啟 8080 端口
- [root@cghost23 ~]# firewall-cmd --add-port=8080/tcp --zone=public
- success
- [root@cghost23 ~]# firewall-cmd --list-port --zone=public
- 80/tcp 6379/tcp 8080/tcp 6000-6010/tcp
public 區域禁止 8080 端口的 TCP 流量
- [root@cghost23 ~]# firewall-cmd --remove-port=8080/tcp --zone=public
- success
- [root@cghost23 ~]# firewall-cmd --list-port --zone=public
- 80/tcp 6379/tcp 6000-6010/tcp
小結
本文講解了 Linux 中的防火墻服務 firewalld 的一些常用操作,防火墻作為公網與內網之間的流量屏障,對系統至關重要,所以,熟練掌握防火墻的知識是很有必要的