firewall防火牆基礎配置


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM