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