Firewalld防火牆
Centos7 中集成了防火牆管理工具, Firewall系統動態防火牆管理器是作為默認的防火牆工具.
它支持規則動態更新,並加入zone區域概念.
Firewalld防火牆是在iptables基礎上新型的防火牆服務,它調用的是iptables
firewalld防火牆默認規則
在Firewalld防火牆規則設置中,從外部訪問服務器內部,如果沒有添加規則,默認是拒絕的
而從服務器內部訪問服務器外部則是默認放行的.
防火牆基本命令
#啟動停止命令:
systemctl start firewalld
systemctl stop firewalld
systemctl status firewalld
systemctl enable firewalld
#禁用舊版防火牆
systemctl mask iptables.service
systemctl mask ip6tables.service
#zone區域命令
firewall-cmd --get-default-zone #查看默認區域
firewall-cmd --get-active-zones #查看活躍的區域
#活躍區域規則查看:
[root@master ~]# firewall-cmd --list-all
public
target: default
icmp-block-inversion: no
interfaces:
sources:
services: ssh dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
[root@xuexi-001 ~]# firewall-cmd --list-all --zone=drop
drop
target: DROP #默認拒絕
icmp-block-inversion: no
interfaces: eth0 #網卡接口
sources: #源
services: #服務
ports: #端口
protocols: #端口轉換
masquerade: no #IP偽裝
forward-ports: #端口偽裝
source-ports: #源端口
icmp-blocks: #源ip
rich rules: #規則
## 檢查服務端口是否開放:
firewall-cmd --set-default-zone=public
[root@xuexi-001 ~]# firewall-cmd --zone=public --query-service=ssh
yes
firewall-cmd --add-masquerade #開啟IP偽裝
firewalld恢復默認規則:
恢復默認規則有兩種方式:
1. 命令行操作
[root@xuexi-001 ~]# firewall-cmd --set-default-zone=public
Warning: ZONE_ALREADY_SET: public
success
[root@xuexi-001 ~]# firewall-cmd --reload
success
2. 配置文件操作
[root@xuexi-001 ~]# vim /etc/firewalld/firewalld.conf
[root@xuexi-001 ~]# firewall-cmd --reload
success
無論那種方法修改都需要對防火牆執行重啟操作: firewall-cmd --reload
如果有規則存在,需要清空規則 如:
方法1:
[root@xuexi-001 ~]# firewall-cmd --remove-source=10.0.0.0/24 --zone=public --permanent
Warning: NOT_ENABLED: 10.0.0.0/24
success
方法2: 修改配置文件 vim /etc/firewalld/zones/public.xml
<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>Public</short>
<description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
<service name="ssh"/> #--- 對應規則
<service name="dhcpv6-client"/> #--- 對應規則
</zone>
刪除對應規則然后 firewall-cmd --reload 即可
firewalld實驗: 設置默認區域和白名單
使用默認區域 drop可以拒絕所有連接,在使用白名單配合后可以配置僅限於某個IP能夠連接到服務器
清理默認區域
1. 設置默認區域drop:
firewall-cmd --set-default-zone=drop
firewall-cmd --permanent --change-interface=eth0 --zone=drop
2. 檢查設置
[root@master ~]# firewall-cmd --get-default-zone
drop
3. 添加白名單:
[root@master ~]# firewall-cmd --add-source=10.0.0.0/24
success
[root@master ~]# firewall-cmd --add-source=192.168.0.0/24
success
#兩個網段一個是本機網段一個是虛擬機網段.
[root@master ~]# firewall-cmd --add-source=192.168.0.0/24 --permanent --zone=trusted
success
4. 檢查:
[root@master ~]# firewall-cmd --list-all
drop (active)
target: DROP
icmp-block-inversion: no
interfaces:
sources: 10.0.0.0/24 192.168.0.0/24
services:
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
[root@master ~]# firewall-cmd --list-all-zones
trusted (active)
target: ACCEPT
icmp-block-inversion: no
interfaces:
sources: 192.168.0.0/24
services:
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
[root@master ~]# firewall-cmd --list-all --zone=trusted
trusted (active)
target: ACCEPT
icmp-block-inversion: no
interfaces:
sources: 10.0.0.0/24 192.168.0.0/24
services:
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
5. 重載生效:
[root@master ~]# firewall-cmd --reload
success
策略配置
1. 安裝一個nginx,並啟動
yum install -y nginx
2. 測試從外部訪問nginx
發現無法訪問
3. 防火牆策略配置:
[root@xuexi-001 firewalld]# firewall-cmd --add-port=80/tcp
success
如果需要移除可以使用命令: firewall-cmd --remove-port=80/tcp 即可
添加80端口訪問后檢查防火牆如下:
[root@xuexi-001 firewalld]# firewall-cmd --list-all
public
target: default
icmp-block-inversion: no
interfaces:
sources:
services: ssh
ports: 80/tcp #------- 允許80
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
移除80端口后檢查防火牆如下:
[root@xuexi-001 firewalld]# firewall-cmd --list-all
public
target: default
icmp-block-inversion: no
interfaces:
sources:
services: ssh
ports: #--------- 沒有允許80
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
## 多端口添加:
[root@xuexi-001 firewalld]# firewall-cmd --permanent --add-port=8080/tcp --add-port=8080/udp
success
注意: --permanent 參數為永久生效的意思
## 刪除添加的端口[臨時刪除]:
[root@xuexi-001 firewalld]# firewall-cmd --remove-port=8080/udp
success
[root@xuexi-001 firewalld]# firewall-cmd --remove-port=8080/tcp
success
## 注意如果是永久有效的規則,還需要繼續配置永久失效[永久刪除]:
firewall-cmd --remove-port=8080/tcp --permanent
firewall-cmd --remove-port=8080/udp --permanent
#服務名方式添加和移除端口
案例: 添加nginx端口
[root@xuexi-001 firewalld]# firewall-cmd --add-service=http --add-service=https
success
檢查:
[root@xuexi-001 firewalld]# firewall-cmd --list-all
public
target: default
icmp-block-inversion: no
interfaces:
sources:
services: ssh http https
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
添加陌生服務端口
思考: 這些服務名我們知道哪些端口,但是是否也有一些陌生服務端口我們不知道的,這里面也沒有的呢? 如何自定義添加陌生服務端口?如:zabbix nfs php-fpm
檢查這些端口有沒有:
[root@xuexi-001 firewalld]# firewall-cmd --add-service=php-fpm
Error: INVALID_SERVICE: php-fpm
這些端口都是沒有被提供的,現在需要我們自定義添加端口.
所有服務端口其實都是定義了一個配置文件,它位於: /usr/lib/firewalld/services/ 目錄中,我們可以照葫蘆畫瓢,拷貝一份用於新服務配置
#配置php-fpm端口
[root@xuexi-001 firewalld]# cd /usr/lib/firewalld/services/
[root@xuexi-001 services]# cp http.xml php-fpm.xml
[root@xuexi-001 services]# vim php-fpm.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>WWW (HTTP)</short>
<description>HTTP is the protocol used to serve Web pages. If you plan to make your Web server publicly available, enable this option. This option is not required for viewing pages locally or developing Web pages.</description>
<port protocol="tcp" port="80"/>
</service>
改為:
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>WWW (HTTP)</short>
<description>HTTP is the protocol used to serve Web pages. If you plan to make your Web server publicly available, enable this option. This option is not required for viewing pages locally or developing Web pages.</description>
<port protocol="tcp" port="8000"/>
</service>
修改完成后,添加服務允許試試:
[root@xuexi-001 services]# firewall-cmd --reload #添加完了服務配置文件需要重載firewall
success
[root@xuexi-001 services]# firewall-cmd --add-service=zabbix # 這樣就可以自定義添加服務了.
success
#還是重啟服務有用,直接firewall-cmd --reload 有時候不生效.
[root@xuexi-001 services]# systemctl restart firewalld.service
添加完成后,通過命令就可以看到我們服務名 zabbix 已經添加成功.
[root@xuexi-001 services]# firewall-cmd --list-all
public
target: default
icmp-block-inversion: no
interfaces:
sources:
services: ssh zabbix
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
firewall端口轉發案例:
#語法:
firewall-cmd --permanent --zone=[區域,默認:public] --add-forward-port=port=[源端口]:proto=[協議名,如:tcp]:toport=[目標端口]:toaddr=<目標IP地址>
--permanent是永久生效.
#將80端口轉為8888端口
[root@xuexi-001 services]# firewall-cmd --add-forward-port=port=8888:proto=tcp:toport=80
success
#注意如果需要永久生效,記得尾部在添加 --permanent
[root@xuexi-001 services]# firewall-cmd --list-all
public
target: default
icmp-block-inversion: no
interfaces:
sources:
services: ssh http zabbix
ports:
protocols:
masquerade: no
forward-ports: port=8888:proto=tcp:toport=80:toaddr= #這里是添加后的規則
source-ports:
icmp-blocks:
rich rules:
例子:
將本地端口10.0.0.63:888端口轉發到后端10.0.0.64:22端口
命令:
[root@xuexi-001 ~]# firewall-cmd --add-forward-port=port=888:proto=tcp:toport=22:toaddr=10.0.0.64
success
[root@xuexi-001 ~]# firewall-cmd --add-masquerade #開啟IP偽裝
[root@xuexi-001 ~]# firewall-cmd --list-all
public
target: default
icmp-block-inversion: no
interfaces:
sources:
services: ssh
ports:
protocols:
masquerade: no
forward-ports: port=888:proto=tcp:toport=22:toaddr=10.0.0.64
source-ports:
icmp-blocks:
rich rules:
可以看到我們連接的IP是10.0.0.63的888端口,而我們進入服務器得到的IP是真實服務器: 10.0.0.64
案例1: 允許10.0.0.0/24網段中的 10.0.0.10主機訪問http服務,其他網段主機都不可以訪問,當前和永久生效
firewall-cmd --add-rich-rule='rule family=ipv4 source address=10.0.0.1/32 server name=http accept'
案例2: 拒絕10.0.0.0/24網段中的10.0.0.10主機發起的SSH請求,但是允許訪問http,當前和永久生效
firewall-cmd --permanent --zone=public --add-rich-rule='rule family=ipv4 source address=10.0.0.10/32 service name=ssh drop'
案例3: 將遠程10.0.0.10的主機請求 firewalld的5000端口轉發到后端10.0.0.20的22端口?
firewall-cmd --add-rich-rule='rule family=ipv4 source address=10.0.0.10/32 forward-port port="5551" protocol="top" to-port="22"'
firewalld共享上網
1. 開啟內核轉發
echo "net.ipv4.ip_forward = 1" >>/etc/sysctl.conf
2. 防火牆規則
firewall-cmd --add-masquerade --permanent
firewall-cmd --reload