1. 程式人生 > 實用技巧 >52. firewalld 防火牆

52. firewalld 防火牆

1.防火牆

1.防火牆分類 ( 軟體 iptables、firewalld 硬體 )

 流入:PREROUTING --> INPUT --> OUTPUT

 轉發:PREROUTING --> FORWARD --> OUTPUT

 流出:POSTROUTETING --> PREROUTING

iptables -I INPUT -p tcp -dport 80 -j drop

   firewall-cmd --add-port=80/tcp     #操作簡單

2.安全

硬體環境

雲環境

從哪些方面打造安全環境

硬體環境: OSI七層模型順序說明

硬體層面: 電源 (UPS) 溫度監控 機櫃上鎖 磁碟報警 IDRAC

系統層面:

調整預設遠端連線的SSH埠

統一使用金鑰認證方式登陸

使用防火牆限制來源IP才能連線SSH

剛裝系統建議升級軟體、升級核心

服務層面:

mysql redis 建議設定比較複雜的密碼

不要有公網IP地址,縱使有也不要監聽在0.0.0.0

WEB應用:

1.HTTPS保證資料傳輸的安全

2.接入WAF(web應用防火牆) 請求引數不合規則攔截

3.安全寶 牛盾雲 安全狗 知道創宇 阿里雲

————————————————————————————————————————

雲上環境: OSI

系統層面:

1.安全組(控制來源的IP)

2.安騎士(免費版)、雲安全中心(收費版)

3.快照,使用快照需要購買儲存空間

服務層面:

mysql redis 建議設定比較複雜的密碼

不要有公網IP地址,縱使有也不要監聽在0.0.0.0

WEB應用:

1.HTTPS保證資料傳輸的安全

2.接入WAF(web應用防火牆) 請求引數不合規則攔截

3.安全寶 牛盾雲 安全狗 知道創宇 阿里雲

4.接入高防IP

資料層面:

備份

異地備份

考慮安全 考慮效能

效能差 安全弱

2.firewalld

firewalld介紹

firewalld是一個centos7以上系統的內建防火牆,非常之簡單。但是底層還是調的netfilter

firewalld核心概念

 區域:事先定義好的模板集合。

 選擇對應的區域,就能應用對應區域的模板規則。

區域需要捆綁網路介面的:

一個區域可以繫結多個網絡卡

 pubilc --> eth0 eth1 ( public中放行了80埠,就意味著對 eth0 eth1 的請求進行了規則控制 )、

一個網絡卡只能繫結一個區域

 eth0 --> public 區域 ( 拒絕22埠 )

 可以基於來源的IP進行規則的控制。( 結合多個區域規則來使用。 )

3.firewalld部署

1.啟動firewalld

[root@web01 ~]# systemctl start firewalld

2.檢視我們所處的區域

[root@web01 ~]# firewall-cmd --get-default-zone

public

3.檢視public規則明細

[root@web01 ~]# firewall-cmd --list-all

public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0 eth1
  sources:
  services: ssh dhcpv6-client
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

4. 使用firewalld各個區域規則結合配置

4.1 調整預設public區域拒絕所有流量,但如果來源IP是10.0.0.0/24網段則允許。

pubilc 預設區域
trusted 白名單
drop 黑名單
  1. 預設eth0 eth1都走public,那麼我們可以將public的所有規則給清空。
    [root@web01 ~]# firewall-cmd --remove-service=ssh
    success
    [root@web01 ~]# firewall-cmd --remove-service=dhcpv6-client
    success
  2. 將來源IP是10.0.0.0/24 走trusted區域。
    [root@web01 ~]# firewall-cmd --add-source=10.0.0.0/24 --zone=trusted
    success
    [root@web01 ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0 eth1
  sources:
  services:
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

[root@web01 ~]# firewall-cmd --list-all --zone=trusted

trusted (active)
  target: ACCEPT
  icmp-block-inversion: no
  interfaces:
  sources: 10.0.0.0/24
  services:
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
  1. 過載會清空所有配置的規則
    [root@web01 ~]# firewall-cmd --reload
    success

4.2 使用firewalld放行埠和移除埠

  1. 新增埠
    [root@web01 ~]# firewall-cmd --add-port=8080/tcp
  2. 永久新增埠
    [root@web01 ~]# firewall-cmd --add-port=8080/tcp --permanent
  3. 新增多個埠
    [root@web01 ~]# firewall-cmd --add-port={9000,9005}/tcp
  4. 移除埠
    [root@web01 ~]# firewall-cmd --remove-port=9000/tcp
    success

4.3 使用firewalld放行服務和移除埠

( http-->80 https-->443 ssh-->22 )

 [root@web01 ~]# firewall-cmd --add-service=http

 [root@web01 ~]# firewall-cmd --add-service=https

 [root@web01 ~]# firewall-cmd --add-service=nfs

 [root@web01 ~]# vim /usr/lib/firewalld/services/http.xml

4.4 埠轉發

firewall-cmd --permanent --zone=<區域> --add-forward-port=port=<源埠號>:proto=<協議>:toport=<目標埠號>:toaddr=<目標IP地址>

10.0.0.1 10.0.0.7:5555 -->172.16.1.8:22

[root@web01 ~]# firewall-cmd --add-forward-port=port=5555:proto=tcp:toport=22:toaddr=172.16.1.8

[root@web01 ~]# firewall-cmd --add-masquerade

5. 富規則

[root@Firewalld ~]# man firewalld.richlanguage # 獲取富規則手冊

 rule
        [source]
        [destination]
        service|port|protocol|icmp-block|masquerade|forward-port
        [log]
        [audit]
        [accept|reject|drop]


rule [family="ipv4|ipv6"]
source address="address[/mask]" [invert="True"]
service name="service name"
port port="port value" protocol="tcp|udp"
forward-port port="port value" protocol="tcp|udp" to-port="port value" 
to-addr="address"
accept | reject [type="reject type"] | drop
  1. 比如允許10.0.0.1主機能夠訪問80埠或http服務,允許172.16.1.0/24能訪問8080埠
[root@web01 ~]# firewall-cmd --add-rich-rule='rule family=ipv4 source address=10.0.0.1/32 service name=http accept'
[root@web01 ~]# firewall-cmd --add-rich-rule='rule family=ipv4 source address=172.16.1.0/24 port port="8080" protocol="tcp" accept'
  1. 預設public區域對外開放所有人能通過ssh服務連線,但拒絕172.16.1.0/24網段通過ssh連線伺服器
[root@web01 ~]# firewall-cmd --add-rich-rule='rule family=ipv4 source address="172.16.1.0/24" service name="ssh" drop'
  1. 使用firewalld,允許所有人能訪問http,https服務,但只有10.0.0.1主機可以訪問ssh服務
[root@web01 ~]# firewall-cmd --add-service={http,https}
[root@web01 ~]# firewall-cmd --remove-service=ssh
[root@web01 ~]# firewall-cmd --add-rich-rule='rule family="ipv4" source address="10.0.0.1/32" service name=ssh accept'
  1. 當用戶來源IP地址是10.0.0.1主機,則將使用者請求的5555埠轉發至後端172.16.1.8的22埠
[root@web01 ~]# firewall-cmd --add-rich-rule='rule family=ipv4 source address="10.0.0.1/32" forward-port port="5555" protocol="tcp" to-port="22" to-addr=172.16.1.8'
[root@web01 ~]# firewall-cmd --add-masquerade

iptables實現內部主機共享上網:

firewalld實現內部主機共享上網:

兩臺裝置:

一臺能上網 10.0.0.7    172.16.1.7
一臺不能上網 172.16.1.8
  1. 172.16.1.8閘道器指向172.16.1.7
    1.關閉eth0
    ifdown eth0
  2. 修改eth1網絡卡配置
    [root@web02 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1
TYPE=Ethernet
    BOOTPROTO=none
    DEFROUTE=yes
    NAME=eth1
    DEVICE=eth1
    ONBOOT=yes
    IPADDR=172.16.1.8
    PREFIX=24
    GATEWAY=172.16.1.7
    DNS1=223.5.5.5
  1. 重啟eth1的網絡卡
    ifdown eth1 && ifup eth1
  2. 172.16.1.7上面開啟forward轉發
    [root@web01 ~]# firewall-cmd --add-masquerade --permanent
    [root@web01 ~]# firewall-cmd --add-masquerade
  3. 客戶端測試是否能正常連線網路
    [root@web02 ~]# ping baidu.com
    PING baidu.com (39.156.69.79) 56(84) bytes of data.
    64 bytes from 39.156.69.79 (39.156.69.79): icmp_seq=1 ttl=127 time=27.6 ms
    64 bytes from 39.156.69.79 (39.156.69.79): icmp_seq=2 ttl=127 time=25.2 ms

NAT

DNAT:目標地址轉換 埠對映

SNAT:源地址轉換 共享上網