名詞解釋
在具體介紹 zone 之前,先給大家介紹幾個(gè)相關(guān)的名詞,因?yàn)槿绻焕斫膺@幾個(gè)名詞 zone 就無(wú)從入手。
- target:目標(biāo),可以理解為默認(rèn)行為,有四個(gè)可選值:default、ACCEPT、REJECT、DROP,如果不設(shè)置默認(rèn)為default
- service:表示一個(gè)服務(wù)
- port:端口,使用 port 可以不通過(guò) service 而直接對(duì)端口進(jìn)行設(shè)置
- interface:接口,可以理解為網(wǎng)卡
- source:源地址,可以是 ip 地址也可以是 ip 地址段
- icmp-block:icmp 報(bào)文阻塞,可以按照 icmp 類(lèi)型進(jìn)行設(shè)置
- masquerade:ip 地址偽裝,也就是按照源網(wǎng)卡地址進(jìn)行 NAT 轉(zhuǎn)發(fā)
- forward-port:端口轉(zhuǎn)發(fā)
- rule:自定義規(guī)則
哪個(gè)zone在起作用
我們知道每個(gè) zone 就是一套規(guī)則集,但是有那么多 zone,對(duì)于一個(gè)具體的請(qǐng)求來(lái)說(shuō)應(yīng)該使用哪個(gè)zone(哪套規(guī)則)來(lái)處理呢?這個(gè)問(wèn)題至關(guān)重要,如果這點(diǎn)不弄明白其他的都是空中樓閣,即使規(guī)則設(shè)置的再好,不知道怎樣用、在哪里用也不行。
對(duì)于一個(gè)接受到的請(qǐng)求具體使用哪個(gè) zone,firewalld 是通過(guò)三種方法來(lái)判斷的:
1、source,也就是源地址
2、interface,接收請(qǐng)求的網(wǎng)卡
3、firewalld.conf 中配置的默認(rèn) zone
這三個(gè)的優(yōu)先級(jí)按順序依次降低,也就是說(shuō)如果按照 source 可以找到就不會(huì)再按 interface去查找,如果前兩個(gè)都找不到才會(huì)使用第三個(gè),也就是講過(guò)的在f irewalld.conf 中配置的默認(rèn) zone。
配置source
source 是在 zone 的 xml 文件中配置的,其格式為
<zone>
<source address="address[/mask]"/>
</zone>
只要我們將 source 節(jié)點(diǎn)放入相應(yīng)的 zone 配置文件中就可以了,節(jié)點(diǎn)的 address 屬性就是源地址,不過(guò)我們要注意相同的 source 節(jié)點(diǎn)只可以在一個(gè) zone 中進(jìn)行配置,也就是說(shuō)同一個(gè)源地址只能對(duì)于一個(gè) zone,另外,直接編輯xml文件之后還需要reload才可以起作用。
另外,我們當(dāng)然也可以使用 firewall-cmd 命令進(jìn)行配置,這里主要有五個(gè)相關(guān)命令(參數(shù))
firewall-cmd [--permanent] [--zone=zone] --list-sources
firewall-cmd [--permanent] [--zone=zone] --query-source=source[/mask]
firewall-cmd [--permanent] [--zone=zone] --add-source=source[/mask]
firewall-cmd [--zone=zone] --change-source=source[/mask]
firewall-cmd [--permanent] [--zone=zone] --remove-source=source[/mask]
分別來(lái)介紹一下
- --list-sources:用于列出指定 zone 的所有綁定的 source 地址
- --query-source:用于查詢(xún)指定 zone 是否跟指定 source 地址進(jìn)行了綁定
- --add-source:用于將一個(gè) source 地址綁定到指定的 zone
- --change-source:用于改變 source 地址所綁定的 zone,如果原來(lái)沒(méi)有綁定則進(jìn)行綁定,這樣就跟 --add-source 的作用一樣了
- --remove-source:用于刪除 source 地址跟 zone 的綁定
可以看到上面的命令中有兩個(gè)可選參數(shù):--permanent 和 --zone,--permanent 表示是否存儲(chǔ)到配置文件中(如果存儲(chǔ)到配置文件中這不會(huì)立即生效),--zone 用于指定所要設(shè)置的zone,如果不指定則使用默認(rèn) zone。
[root@OpsNote ~]# firewall-cmd --zone=drop --list-all
drop
interfaces:
sources:
services:
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
[root@OpsNote ~]# firewall-cmd --zone=drop --add-source=1.2.3.5
success
[root@OpsNote ~]# firewall-cmd --zone=drop --list-all
drop
interfaces:
sources: 1.2.3.5
services:
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
[root@OpsNote ~]#
將 1.2.3.5 綁定到 drop 這個(gè) zone 中,所有來(lái)自 1.2.3.5 這個(gè) ip 的連接將會(huì)被 drop 。
配置interface
相關(guān)的 firewall-cmd 命令為
firewall-cmd [--permanent] [--zone=zone] --list-interfaces
firewall-cmd [--permanent] [--zone=zone] --add-interface=interface
firewall-cmd [--zone=zone] --change-interface=interface
firewall-cmd [--permanent] [--zone=zone] --query-interface=interface
firewall-cmd [--permanent] [--zone=zone] --remove-interface=interface
可以在網(wǎng)卡配置文件中進(jìn)行配置,比如可以在
/etc/sysconfig.NETwork-scripts/ifcfg-eno16777728 文件中添加下面的配置
ZONE=public
這行配置就相當(dāng)于下面的命令
[root@OpsNote ~]# firewall-cmd --zone=public --change-interface=eno16777728
這樣配置之后來(lái)自 eno16777728 的連接就會(huì)使用 public 這個(gè) zone 進(jìn)行管理(如果source匹配了其他的 zone 除外)。
配置默認(rèn)zone
默認(rèn) zon e的配置是通過(guò) firewalld.conf 配置文件的 DefaultZone 配置項(xiàng)來(lái)配置的,當(dāng)然也可以使用firewall-cmd命令來(lái)配置,通過(guò) --get-default-zone 來(lái)獲取默認(rèn)zone的值
[root@OpsNote ~]# firewall-cmd --get-default-zone
public
[root@OpsNote ~]# firewall-cmd --set-default-zone=internal
success
[root@OpsNote ~]# firewall-cmd --get-default-zone
internal
[root@OpsNote ~]#
使用下面的命令來(lái)查看當(dāng)前所有起作用的zone
[root@OpsNote ~]# firewall-cmd --get-active-zones
drop
sources: 1.2.3.5
internal
interfaces: eno16777728
[root@OpsNote ~]# firewall-cmd --zone=drop --remove-source=1.2.3.5
success
[root@OpsNote ~]# firewall-cmd --get-active-zones
internal
interfaces: eno16777728
[root@OpsNote ~]#
firewalld 還給我們提供了反向查詢(xún)的命令,也就是根據(jù) source 或者 interface 查詢(xún)所對(duì)應(yīng)的 zone,其命令如下
firewall-cmd --get-zone-of-interface=interface
firewall-cmd --get-zone-of-source=source[/mask]
zone 規(guī)則配置
target
zone 規(guī)則中首先最重要的是 target 的設(shè)置,他默認(rèn)可以取四個(gè)值:default、ACCEPT、REJECT、DROP,firewall-cmd 命令如下
firewall-cmd --permanent [--zone=zone] --get-target
firewall-cmd --permanent [--zone=zone] --set-target=target
這里的--permanent不是可選的,也就是說(shuō)使用firewall-cmd命令也不可以讓他直接生效,也需要reload才可以。
service
配置命令為
firewall-cmd [--permanent] [--zone=zone] --list-services
firewall-cmd [--permanent] [--zone=zone] --add-service=service [--timeout=seconds]
firewall-cmd [--permanent] [--zone=zone] --remove-service=service
firewall-cmd [--permanent] [--zone=zone] --query-service=service
具體每個(gè)命令的含義大家對(duì)照上面的 source 很容易就理解了,--add 命令中多了一個(gè)--timeout選項(xiàng)
--add-service中的--timeout的含義是這樣的:添加一個(gè)服務(wù),但是不是一直生效而是生效一段時(shí)間,過(guò)期之后自動(dòng)刪除。
這個(gè)選項(xiàng)非常有用,比如我們想暫時(shí)開(kāi)放一個(gè)端口進(jìn)行一些特殊的操作(比如遠(yuǎn)程調(diào)試),等處理完成后再關(guān)閉,不過(guò)有時(shí)候我們處理完之后就忘記關(guān)閉了,而現(xiàn)在的 --timeout 選項(xiàng)就可以幫我們很好地解決這個(gè)問(wèn)題,我們?cè)诖蜷_(kāi)的時(shí)候就可以直接設(shè)置一個(gè)時(shí)間,到時(shí)間之后他自動(dòng)就可以關(guān)閉了。--timeout 和 --permanent 是不可以一起使用的。
port
配置命令為
firewall-cmd [--permanent] [--zone=zone] --list-ports
firewall-cmd [--permanent] [--zone=zone] --add-port=portid[-portid]/protocol [--timeout=seconds]
firewall-cmd [--permanent] [--zone=zone] --remove-port=portid[-portid]/protocol
firewall-cmd [--permanent] [--zone=zone] --query-port=portid[-portid]/protocol
icmp-block
icmp-block 是按照 icmp 的類(lèi)型進(jìn)行設(shè)置阻塞,比如我們不想接受 ping 報(bào)文就可以使用下面的命令來(lái)設(shè)置
[root@OpsNote ~]# firewall-cmd --add-icmp-block=echo-request
相應(yīng)操作命令
firewall-cmd [--permanent] [--zone=zone] --list-icmp-blocks
firewall-cmd [--permanent] [--zone=zone] --add-icmp-block=icmptype [--timeout=seconds]
firewall-cmd [--permanent] [--zone=zone] --remove-icmp-block=icmptype
firewall-cmd [--permanent] [--zone=zone] --query-icmp-block=icmptype
masquerade
masquerade 大家應(yīng)該都比較熟悉,其作用就是ip地址偽裝,也就是NAT轉(zhuǎn)發(fā)中的一種,具體處理方式是將接收到的請(qǐng)求的源地址設(shè)置為轉(zhuǎn)發(fā)請(qǐng)求網(wǎng)卡的地址,這在路由器等相關(guān)設(shè)備中非常重要,比如大家很多都使用的是路由器連接的局域網(wǎng),而想上互聯(lián)網(wǎng)就得將我們的ip地址給修改一下,要不大家都是192.168.1.XXX的內(nèi)網(wǎng)地址,那請(qǐng)求怎么能正確返回呢?所以在路由器中將請(qǐng)求實(shí)際發(fā)送到互聯(lián)網(wǎng)的時(shí)候就會(huì)將請(qǐng)求的源地址設(shè)置為路由器的外網(wǎng)地址,這樣請(qǐng)求就能正確地返回給路由器了,然后路由器再根據(jù)記錄返回給我們發(fā)送請(qǐng)求的主機(jī)了,這就是 masquerade。
操作命令為
firewall-cmd [--permanent] [--zone=zone] --add-masquerade [--timeout=seconds]
firewall-cmd [--permanent] [--zone=zone] --remove-masquerade
firewall-cmd [--permanent] [--zone=zone] --query-masquerade
forward-port
進(jìn)行端口轉(zhuǎn)發(fā),比如我們要將在80端口接收到tcp請(qǐng)求轉(zhuǎn)發(fā)到8080端口可以使用下面的命令
[root@OpsNote ~]# firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080
success
[root@OpsNote ~]#
forward-port 還支持范圍轉(zhuǎn)發(fā),比如我們還可以將80到85端口的所有請(qǐng)求都轉(zhuǎn)發(fā)到8080端口,這時(shí)只需要將上面命令中的 port 修改為80-85即可。
相關(guān)操作命令如下
firewall-cmd [--permanent] [--zone=zone] --list-forward-ports
firewall-cmd [--permanent] [--zone=zone] --add-forward-port=port=portid[-portid]:proto=protocol[:toport=portid[-portid]][:toaddr=address[/mask]][--timeout=seconds]
firewall-cmd [--permanent] [--zone=zone] --remove-forward-port=port=portid[-portid]:proto=protocol[:toport=portid[-portid]][:toaddr=address[/mask]]
firewall-cmd [--permanent] [--zone=zone] --query-forward-port=port=portid[-portid]:proto=protocol[:toport=portid[-portid]][:toaddr=address[/mask]]
rule
rule 的操作命令如下
firewall-cmd [--permanent] [--zone=zone] --list-rich-rules
firewall-cmd [--permanent] [--zone=zone] --add-rich-rule='rule' [--timeout=seconds]
firewall-cmd [--permanent] [--zone=zone] --remove-rich-rule='rule'
firewall-cmd [--permanent] [--zone=zone] --query-rich-rule='rule'
這里的參數(shù) 'rule' 代表一條規(guī)則語(yǔ)句,比如要設(shè)置地址為1.2.3.4的source就可以寫(xiě)成source address="1.2.3.4",也就是直接寫(xiě)標(biāo)簽名,然后跟著寫(xiě)屬性就可以了,我們來(lái)看個(gè)例子
[root@OpsNote ~]# firewall-cmd --add-rich-rule='rule family="ipv4" source address="1.2.3.4" drop'
這條規(guī)則就會(huì)將1.2.3.4這個(gè)源地址的連接全部給drop掉。
使用rule結(jié)合--timeout我們可以實(shí)現(xiàn)一些非常好玩和有用的功能,比如我們可以寫(xiě)個(gè)自動(dòng)化腳本,當(dāng)發(fā)現(xiàn)有異常的連接時(shí)就可以添加一條rule將其相應(yīng)的地址drop掉,而且還可以使用--timeout給設(shè)置個(gè)時(shí)間段,過(guò)了之后再自動(dòng)開(kāi)放!
實(shí)驗(yàn)
1.網(wǎng)站服務(wù)器環(huán)境的搭建
(1)驗(yàn)證firewalld在網(wǎng)站服務(wù)器上是否啟動(dòng)并且正常運(yùn)行
[root@web ~]# systemctl status firewalld
(2)安裝httpd和mod_ssl軟件包
[root@web ~]# yum install -y httpd mod_ssl
(3)啟用并啟動(dòng)httpd服務(wù)
[root@web ~]# systemctl start httpd
[root@web ~]# systemctl enable httpd
(4)創(chuàng)建網(wǎng)站首頁(yè)測(cè)試頁(yè)index.html
[root@web ~]# vi /var/www/html/index.html
test web
(5)更改ssh的監(jiān)聽(tīng)端口,并重啟服務(wù),關(guān)閉SElinux
[root@web ~]# setenforce 0
[root@web ~]# vi /etc/ssh/sshd_config
Port 12345
[root@web ~]# systemctl restart sshd
2.在網(wǎng)站服務(wù)器上配置firewalld防火墻
(1)設(shè)置默認(rèn)區(qū)域?yàn)閐mz區(qū)域
[root@web ~]# firewall-cmd --set-default-zone=dmz
(2)為dmz區(qū)域打開(kāi)https服務(wù)并添加TCP的12345端口
[root@web ~]# firewall-cmd --zone=dmz --add-service=https --permanent
[root@web ~]# firewall-cmd --zone=dmz --add-port=12345/tcp --permanent
(3)禁止ping
[root@web ~]# firewall-cmd --add-icmp-block=echo-request --zone=dmz --permanent
(4)因?yàn)轭A(yù)定于的ssh服務(wù)已經(jīng)更改了端口,所以要將預(yù)定于ssh服務(wù)移除
[root@web ~]# firewall-cmd --zone=dmz --remove-service=ssh --permanent
(5)重新加載firewalld配置。并查看之前的配置
[root@web ~]# firewall-cmd --reload
[root@web ~]# firewall-cmd --list-all
dmz (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: https
ports: 12345/tcp
protocols:
masquerade: no
forward-ports:
sourceports:
icmp-blocks: echo-request
rich rules:
3.在網(wǎng)關(guān)服務(wù)器上配置firewalld防火墻
(1)驗(yàn)證firewalld在網(wǎng)關(guān)服務(wù)器上是否啟動(dòng)并且正在運(yùn)行
[root@gateway-server ~]# systemctl status firewalld
(2)設(shè)置默認(rèn)區(qū)域?yàn)閑xternal區(qū)域,并查看配置結(jié)果
[root@gateway-server ~]# firewall-cmd --set-default-zone=external
[root@gateway-server ~]# firewall-cmd --list-all
external (active)
target: default
icmp-block-inversion: no
interfaces: eth0 eth1 eth2
sources:
services: ssh
ports:
protocols:
masquerade: yes
forward-ports:
sourceports:
icmp-blocks:
rich rules:
(3)將eth1網(wǎng)卡配置到trusted區(qū)域,將eth2配置到dmz區(qū)域
[root@gateway-server ~]# firewall-cmd --change-interface=eth1 --zone=trusted
[root@gateway-server ~]# firewall-cmd --change-interface=eth2 --zone=dmz
(4)查看配置情況
[root@gateway-server ~]# firewall-cmd --get-active-zone
dmz
interfaces: eth2
external
interfaces: eth0
trusted
interfaces: eth1
(5)在企業(yè)內(nèi)網(wǎng)測(cè)試計(jì)算機(jī)上訪(fǎng)問(wèn)網(wǎng)站服務(wù)器
https:192.168.2.10
(6)關(guān)閉SELinux,更改ssh的監(jiān)聽(tīng)端口,并重啟服務(wù)
[root@gateway-server ~]# setenforce 0
[root@gateway-server ~]# vi /etc/ssh/sshd_config
Port 12345
[root@gateway-server ~]# systemctl restart sshd
(7)配置external區(qū)域添加TCP的12345端口
[root@gateway-server ~]# firewall-cmd --zone=external --add-port=12345/tcp --permanent
(8)配置external區(qū)域移除ssh服務(wù)
[root@gateway-server ~]# firewall-cmd --zone=external --remove-service=ssh --permanent
(9)配置external區(qū)域禁止ping
[root@gateway-server ~]# firewall-cmd --zone=external --add-icmp-block=echo-request --permanent
(10)重新加載防火墻配置
[root@gateway-server ~]# firewall-cmd --reload
(11)在互聯(lián)網(wǎng)測(cè)試機(jī)上通過(guò)ssh登錄網(wǎng)關(guān)
[root@localhost ~]# ssh -p 12345 100.1.1.10
(12)在企業(yè)內(nèi)網(wǎng)測(cè)試機(jī)上ssh登錄web網(wǎng)站服務(wù)器的12345端口
[root@localhost ~]# ssh -p 12345 192.168.2.10
4.配置IP偽裝與端口轉(zhuǎn)發(fā)
內(nèi)網(wǎng)用戶(hù)通過(guò)網(wǎng)關(guān)服務(wù)器共享上網(wǎng)
(1)外網(wǎng)測(cè)試機(jī)搭建網(wǎng)站服務(wù),并添加測(cè)試網(wǎng)頁(yè)
[root@localhost ~]# hostname internet
[root@localhost ~]# bash
[root@internet ~]# yum install -y httpd
[root@internet ~]# vi /var/www/html/index.html
internet web
[root@internet ~]# systemctl enable httpd
[root@internet ~]# systemctl start httpd
(2)在企業(yè)內(nèi)網(wǎng)測(cè)試機(jī)上訪(fǎng)問(wèn)外網(wǎng)網(wǎng)站,結(jié)果是可以訪(fǎng)問(wèn)的
http://100.1.1.20
(3)在dmz的網(wǎng)站服務(wù)器上測(cè)試,同樣可以訪(fǎng)問(wèn)
http://100.1.1.20
(4)查看網(wǎng)關(guān)服務(wù)器的external區(qū)域是否開(kāi)啟了地址偽裝
[root@internet ~]# firewall-cmd --list-all --zone=external
external
target: default
icmp-block-inversion: no
interfaces:
sources:
services: ssh
ports:
protocols:
masquerade: yes
forward-ports:
sourceports:
icmp-blocks:
rich rules:
(5)源地址192.168.1.0/24網(wǎng)段的地址開(kāi)啟IP偽裝
在網(wǎng)關(guān)服務(wù)器上關(guān)閉external的地址偽裝,添加富規(guī)則,要求external區(qū)域內(nèi)源地址為192。168.1.0/24網(wǎng)段的地址開(kāi)啟地址IP偽裝
[root@gateway-server ~]# firewall-cmd --remove-masquerade --zone=external
[root@gateway-server ~]# firewall-cmd --zone=external --add-rich='rule family=ipv4 source address=192.168.1.0/24 masquerade'
(6)在dmz的網(wǎng)站服務(wù)器上測(cè)試訪(fǎng)問(wèn)外網(wǎng),應(yīng)該不能訪(fǎng)問(wèn)外網(wǎng)
http://100.1.120
5.配置端口轉(zhuǎn)發(fā)實(shí)現(xiàn)互聯(lián)網(wǎng)用戶(hù)訪(fǎng)問(wèn)內(nèi)部web服務(wù)器
(1)在網(wǎng)關(guān)服務(wù)器上配置端口轉(zhuǎn)發(fā)
[root@gateway-server ~]# firewall-cmd --zone=external --add-forward-port=port=443:proto=tcp:toaddr=192.168.2.10
(2)在互聯(lián)網(wǎng)測(cè)試機(jī)上訪(fǎng)問(wèn)內(nèi)部web服務(wù)器,可以訪(fǎng)問(wèn)成功
http://100.1.1.10
(3)端口轉(zhuǎn)發(fā)也可以使用富規(guī)則,這樣就可以更大程度的控制端口轉(zhuǎn)發(fā)規(guī)則,如給內(nèi)網(wǎng)的web服務(wù)器申請(qǐng)類(lèi)=了一個(gè)新的公網(wǎng)ip地址100.1.1.15,需要將新的公網(wǎng)地址100.1.1.15配置在網(wǎng)關(guān)服務(wù)器的外網(wǎng)接口eth0上,作為第二個(gè)Ip地址
firewall-cmd --zone=external --add-rich-rule="rule2 family="ipv4" source address="192.168.2.0/24" masquerade"
[root@gateway-server ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=static
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR1=100.1.1.15
PREFIX1=24
IPADDR0=100.1.1.10
PREFIX=24
[root@gateway-server ~]# systemctl restart NetworkManager
[root@gateway-server ~]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:ae:7f:64 brd ff:ff:ff:ff:ff:ff
inet 100.1.1.10/8 brd 100.255.255.255 scope global eth0
valid_lft forever preferred_lft forever
inet 100.1.1.15/24 brd 100.1.1.255 scope global eth0
valid_lft forever preferred_lft forever
使用富規(guī)則配置端口轉(zhuǎn)發(fā)
[root@gateway-server ~]# firewall-cmd --zone=external --add-rich-rule='rule family=ipv4 destination address=100.1.1.15/32 forward-port port=443 protocol=tcp to-addr=192.168.2.10'
在互聯(lián)網(wǎng)測(cè)試機(jī)上訪(fǎng)問(wèn),可以訪(fǎng)問(wèn)成功
http://10.1.1.15
本文轉(zhuǎn)自:https://www.cnblogs.com/-xuan/p/10640241.html






