名詞解釋
在具體介紹 zone 之前,先給大家介紹幾個相關的名詞,因為如果不理解這幾個名詞 zone 就無從入手。
- target:目標,可以理解為默認行為,有四個可選值:default、ACCEPT、REJECT、DROP,如果不設置默認為default
- service:表示一個服務
- port:端口,使用 port 可以不通過 service 而直接對端口進行設置
- interface:接口,可以理解為網卡
- source:源地址,可以是 ip 地址也可以是 ip 地址段
- icmp-block:icmp 報文阻塞,可以按照 icmp 類型進行設置
- masquerade:ip 地址偽裝,也就是按照源網卡地址進行 NAT 轉發
- forward-port:端口轉發
- rule:自定義規則
哪個zone在起作用
我們知道每個 zone 就是一套規則集,但是有那么多 zone,對于一個具體的請求來說應該使用哪個zone(哪套規則)來處理呢?這個問題至關重要,如果這點不弄明白其他的都是空中樓閣,即使規則設置的再好,不知道怎樣用、在哪里用也不行。
對于一個接受到的請求具體使用哪個 zone,firewalld 是通過三種方法來判斷的:
1、source,也就是源地址
2、interface,接收請求的網卡
3、firewalld.conf 中配置的默認 zone
這三個的優先級按順序依次降低,也就是說如果按照 source 可以找到就不會再按 interface去查找,如果前兩個都找不到才會使用第三個,也就是講過的在f irewalld.conf 中配置的默認 zone。
配置source
source 是在 zone 的 xml 文件中配置的,其格式為
<zone>
<source address="address[/mask]"/>
</zone>
只要我們將 source 節點放入相應的 zone 配置文件中就可以了,節點的 address 屬性就是源地址,不過我們要注意相同的 source 節點只可以在一個 zone 中進行配置,也就是說同一個源地址只能對于一個 zone,另外,直接編輯xml文件之后還需要reload才可以起作用。
另外,我們當然也可以使用 firewall-cmd 命令進行配置,這里主要有五個相關命令(參數)
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]
分別來介紹一下
- --list-sources:用于列出指定 zone 的所有綁定的 source 地址
- --query-source:用于查詢指定 zone 是否跟指定 source 地址進行了綁定
- --add-source:用于將一個 source 地址綁定到指定的 zone
- --change-source:用于改變 source 地址所綁定的 zone,如果原來沒有綁定則進行綁定,這樣就跟 --add-source 的作用一樣了
- --remove-source:用于刪除 source 地址跟 zone 的綁定
可以看到上面的命令中有兩個可選參數:--permanent 和 --zone,--permanent 表示是否存儲到配置文件中(如果存儲到配置文件中這不會立即生效),--zone 用于指定所要設置的zone,如果不指定則使用默認 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 這個 zone 中,所有來自 1.2.3.5 這個 ip 的連接將會被 drop 。
配置interface
相關的 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
可以在網卡配置文件中進行配置,比如可以在
/etc/sysconfig.NETwork-scripts/ifcfg-eno16777728 文件中添加下面的配置
ZONE=public
這行配置就相當于下面的命令
[root@OpsNote ~]# firewall-cmd --zone=public --change-interface=eno16777728
這樣配置之后來自 eno16777728 的連接就會使用 public 這個 zone 進行管理(如果source匹配了其他的 zone 除外)。
配置默認zone
默認 zon e的配置是通過 firewalld.conf 配置文件的 DefaultZone 配置項來配置的,當然也可以使用firewall-cmd命令來配置,通過 --get-default-zone 來獲取默認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 ~]#
使用下面的命令來查看當前所有起作用的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 還給我們提供了反向查詢的命令,也就是根據 source 或者 interface 查詢所對應的 zone,其命令如下
firewall-cmd --get-zone-of-interface=interface
firewall-cmd --get-zone-of-source=source[/mask]
zone 規則配置
target
zone 規則中首先最重要的是 target 的設置,他默認可以取四個值:default、ACCEPT、REJECT、DROP,firewall-cmd 命令如下
firewall-cmd --permanent [--zone=zone] --get-target
firewall-cmd --permanent [--zone=zone] --set-target=target
這里的--permanent不是可選的,也就是說使用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
具體每個命令的含義大家對照上面的 source 很容易就理解了,--add 命令中多了一個--timeout選項
--add-service中的--timeout的含義是這樣的:添加一個服務,但是不是一直生效而是生效一段時間,過期之后自動刪除。
這個選項非常有用,比如我們想暫時開放一個端口進行一些特殊的操作(比如遠程調試),等處理完成后再關閉,不過有時候我們處理完之后就忘記關閉了,而現在的 --timeout 選項就可以幫我們很好地解決這個問題,我們在打開的時候就可以直接設置一個時間,到時間之后他自動就可以關閉了。--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 的類型進行設置阻塞,比如我們不想接受 ping 報文就可以使用下面的命令來設置
[root@OpsNote ~]# firewall-cmd --add-icmp-block=echo-request
相應操作命令
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 大家應該都比較熟悉,其作用就是ip地址偽裝,也就是NAT轉發中的一種,具體處理方式是將接收到的請求的源地址設置為轉發請求網卡的地址,這在路由器等相關設備中非常重要,比如大家很多都使用的是路由器連接的局域網,而想上互聯網就得將我們的ip地址給修改一下,要不大家都是192.168.1.XXX的內網地址,那請求怎么能正確返回呢?所以在路由器中將請求實際發送到互聯網的時候就會將請求的源地址設置為路由器的外網地址,這樣請求就能正確地返回給路由器了,然后路由器再根據記錄返回給我們發送請求的主機了,這就是 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
進行端口轉發,比如我們要將在80端口接收到tcp請求轉發到8080端口可以使用下面的命令
[root@OpsNote ~]# firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080
success
[root@OpsNote ~]#
forward-port 還支持范圍轉發,比如我們還可以將80到85端口的所有請求都轉發到8080端口,這時只需要將上面命令中的 port 修改為80-85即可。
相關操作命令如下
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'
這里的參數 'rule' 代表一條規則語句,比如要設置地址為1.2.3.4的source就可以寫成source address="1.2.3.4",也就是直接寫標簽名,然后跟著寫屬性就可以了,我們來看個例子
[root@OpsNote ~]# firewall-cmd --add-rich-rule='rule family="ipv4" source address="1.2.3.4" drop'
這條規則就會將1.2.3.4這個源地址的連接全部給drop掉。
使用rule結合--timeout我們可以實現一些非常好玩和有用的功能,比如我們可以寫個自動化腳本,當發現有異常的連接時就可以添加一條rule將其相應的地址drop掉,而且還可以使用--timeout給設置個時間段,過了之后再自動開放!
實驗
1.網站服務器環境的搭建
(1)驗證firewalld在網站服務器上是否啟動并且正常運行
[root@web ~]# systemctl status firewalld
(2)安裝httpd和mod_ssl軟件包
[root@web ~]# yum install -y httpd mod_ssl
(3)啟用并啟動httpd服務
[root@web ~]# systemctl start httpd
[root@web ~]# systemctl enable httpd
(4)創建網站首頁測試頁index.html
[root@web ~]# vi /var/www/html/index.html
test web
(5)更改ssh的監聽端口,并重啟服務,關閉SElinux
[root@web ~]# setenforce 0
[root@web ~]# vi /etc/ssh/sshd_config
Port 12345
[root@web ~]# systemctl restart sshd
2.在網站服務器上配置firewalld防火墻
(1)設置默認區域為dmz區域
[root@web ~]# firewall-cmd --set-default-zone=dmz
(2)為dmz區域打開https服務并添加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)因為預定于的ssh服務已經更改了端口,所以要將預定于ssh服務移除
[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.在網關服務器上配置firewalld防火墻
(1)驗證firewalld在網關服務器上是否啟動并且正在運行
[root@gateway-server ~]# systemctl status firewalld
(2)設置默認區域為external區域,并查看配置結果
[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網卡配置到trusted區域,將eth2配置到dmz區域
[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)在企業內網測試計算機上訪問網站服務器
https:192.168.2.10
(6)關閉SELinux,更改ssh的監聽端口,并重啟服務
[root@gateway-server ~]# setenforce 0
[root@gateway-server ~]# vi /etc/ssh/sshd_config
Port 12345
[root@gateway-server ~]# systemctl restart sshd
(7)配置external區域添加TCP的12345端口
[root@gateway-server ~]# firewall-cmd --zone=external --add-port=12345/tcp --permanent
(8)配置external區域移除ssh服務
[root@gateway-server ~]# firewall-cmd --zone=external --remove-service=ssh --permanent
(9)配置external區域禁止ping
[root@gateway-server ~]# firewall-cmd --zone=external --add-icmp-block=echo-request --permanent
(10)重新加載防火墻配置
[root@gateway-server ~]# firewall-cmd --reload
(11)在互聯網測試機上通過ssh登錄網關
[root@localhost ~]# ssh -p 12345 100.1.1.10
(12)在企業內網測試機上ssh登錄web網站服務器的12345端口
[root@localhost ~]# ssh -p 12345 192.168.2.10
4.配置IP偽裝與端口轉發
內網用戶通過網關服務器共享上網
(1)外網測試機搭建網站服務,并添加測試網頁
[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)在企業內網測試機上訪問外網網站,結果是可以訪問的
http://100.1.1.20
(3)在dmz的網站服務器上測試,同樣可以訪問
http://100.1.1.20
(4)查看網關服務器的external區域是否開啟了地址偽裝
[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網段的地址開啟IP偽裝
在網關服務器上關閉external的地址偽裝,添加富規則,要求external區域內源地址為192。168.1.0/24網段的地址開啟地址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的網站服務器上測試訪問外網,應該不能訪問外網
http://100.1.120
5.配置端口轉發實現互聯網用戶訪問內部web服務器
(1)在網關服務器上配置端口轉發
[root@gateway-server ~]# firewall-cmd --zone=external --add-forward-port=port=443:proto=tcp:toaddr=192.168.2.10
(2)在互聯網測試機上訪問內部web服務器,可以訪問成功
http://100.1.1.10
(3)端口轉發也可以使用富規則,這樣就可以更大程度的控制端口轉發規則,如給內網的web服務器申請類=了一個新的公網ip地址100.1.1.15,需要將新的公網地址100.1.1.15配置在網關服務器的外網接口eth0上,作為第二個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
使用富規則配置端口轉發
[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'
在互聯網測試機上訪問,可以訪問成功
http://10.1.1.15
本文轉自:https://www.cnblogs.com/-xuan/p/10640241.html