firewalld防火牆

由於omv本身的防火牆功能較陽春(系統主動建立的連線設定問題多),改用firewalld防火牆

sudo apt remove --purge ufw
sudo apt install firewalld

sudo systemctl status firewalld 的錯誤訊息

debian 10 firewalld 0.6.3 Error: COMMAND_FAILED: '/usr/sbin/ip6tables-restore -w -n' failed: ip6tables-restore v1.8.2 (nf_tables): line 4: RULE_REPLACE failed (No such file or directory): rule in chain OUTPUT 解決辦法

vim /etc/firewalld/firewalld.conf

有個InvividualCalls=no 把它改成InvividualCalls=yes

儲存離開

sudo systemctl restart firewalld

# 啟動 firewalld 服務
systemctl start firewalld
# 停止 firewalld 服務
systemctl stop firewalld
# 設定開機自動啟動 firewalld 服務
systemctl enable firewalld
# 列出所有設定
sudo firewall-cmd --list-all

重要設置:白名單 IP 位址

方法一(推薦)

#若要將特定的 IP 位址設定為白名單,讓它可以連接任何的連接埠,這樣做很快便完成:
# 將 172.16.10.80 加入白名單
firewall-cmd --zone=public   --add-rich-rule='rule family="ipv4" source address="172.16.10.80/32" accept'
# 將 120.115.4.0/24 列為 public 區域的白名單,馬上生效
firewall-cmd --zone=public \
  --add-rich-rule='rule family="ipv4" source address="120.115.4.0/24" accept'
#將以上設定寫入常駐服務
sudo firewall-cmd --runtime-to-permanent

方法二

# 永久將 120.115.4.0/24 列為 public 區域的白名單,需reload
sduo firewall-cmd --zone=public \
  --add-rich-rule='rule family="ipv4" source address="120.115.4.0/24" accept' \
  --permanent
 sudo firewall-cmd --reload

關閉白名單IP(請先把ssh服務開通,不然就通通不通)

firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="120.115.4.0/24" service name="ssh" accept'
 firewall-cmd --zone=public --remove-rich-rule='rule family="ipv4" source address="120.115.4.0/24" accept'

指定zone的網路介面

sudo firewall-cmd --zone=public --change-interface=eno1
sudo firewall-cmd --get-zone-of-interface=eno1
sudo firewall-cmd --runtime-to-permanent

cat /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>
  <interface name="eno1"/>
  <rule family="ipv4">
    <source address="120.115.4.0/24"/>
    <service name="ssh"/>
    <accept/>
  </rule>
  <rule family="ipv4">
    <source address="120.115.4.0/24"/>
    <accept/>
  </rule>
</zone>

查詢區域設定

列出 firewalld 中已經定義好的區域,執行:

# 列出所有的區域
firewall-cmd --get-zones

設定預設 ZONE

firewall-cmd --set-default-zone=public

列出所有的區域與內容

sudo firewall-cmd --list-all-zones

查詢public zone永久設定值

sudo firewall-cmd --zone=public --list-all --permanent

區域簡介

firewalld 的區域(zone)可用來設定網路連線、介面等所處的運作環境,對內使用的區域其防火牆規則會較為寬鬆,反之若是對外的區域其規則會較為嚴謹。

一條網路連線或介面只能隸屬於一個區域,我們可以自訂區域的設定,也可以直接從 firewalld 預設的幾個區域中選擇:

區域

描述

drop

任何往內的封包都會被丟棄,只允許往外傳送的封包。

block

任何來自於外部的連線都會被阻擋,只允許自己系統主動建立的連線。

public

公開區域,預設不信任其他電腦與網路,只有被允許的連線才能進入。通常大部分的連線設定都會放在這裡。

external

公開區域,適用於 NAT 網路環境。

dmz

非軍事區域(demilitarized zone,有點像是放在外頭的危險區域),允許外部的連線進入,但其對內的連線則有限制,只有被允許的連線才能連進內部網路。

work

公司內部等工作區域,在此區域中不應該會有惡意的攻擊者。只有被允許的連線可以進入。

home

家裡頭的網路區域,在此區域中不應該會有惡意的攻擊者。只有被允許的連線可以進入。

internal

內部網路區域,在此區域中不應該會有惡意的攻擊者。只有被允許的連線可以進入。

trusted

完全信任的區域,接受所有連線。

列出預設區域

# 列出預設區域
firewall-cmd --get-default-zone
public
若要更改 firewalld 預設的區域,可以執行

設定預設區域

# 設定預設區域
firewall-cmd --set-default-zone=work
firewall-cmd --get-default-zone

列出預先定義的服務名稱

# 列出預先定義的服務名稱
firewall-cmd --get-services

若要將指定的服務新增至指定的區域中,可執行:

# 將 http 服務新增至 public 區域中
sudo firewall-cmd --zone=public --add-service=http

上面這行指令只是暫時將 http 服務新增至 public 區域中,重新開機後這個設定就不見了,若測試沒問題,再將設定寫入設定檔,永久保存:

# 使用 --permanent(常駐) 永久將 http 服務新增至 public 區域中
sudo firewall-cmd --zone=public --permanent --add-service=http

sudo firwall-cmd --permanent --add-port=8000/tcp 插入防火墻規則,放通8000端口。

埠號的部分也可以用範圍的方式指定,一次開通多個連接埠:

# 開啟 udp 的 1812 至 1813 連接埠
sudo firewall-cmd --zone=public --add-port=1812-1813/udp

# 永久開啟 udp 的 1812 至 1813 連接埠
sudo firewall-cmd --zone=public --permanent --add-port=1812-1813/udp

移除服務

若要將指定的服務從某個區域中移除,可以執行:

# 將 http 服務從 public 區域中移除
sudo firewall-cmd --zone=public --remove-service=http

# 永久將 http 服務從 public 區域中移除
sudo firewall-cmd --zone=public --permanent --remove-service=http

如果是要移除自訂的通訊協定與埠號,則執行:

# 關閉  連接埠
sudo firewall-cmd --zone=public --remove-port=1812-1813/udp

# 永久關閉 連接埠
sudo firewall-cmd --zone=public --permanent --remove-port=1812-1813/udp

新增服務名稱

除了直接指定通訊協定與埠號之外,我們也可以自訂新的服務名稱,加入 firewalld 的服務名稱清單中,這樣就可以使用服務名稱的方式來設定開啟的服務,這樣做的好處是可以讓防火牆的設定看起來更容易理解,清楚說明埠號的用途。

若要使用名稱(如之前的8000/tcp),可以參考/usr/lib/firewalld/services 添加cloudcmd.xml到/etc/firewalld/cloudcmd.xml

<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>cloudcmd</short>
  <description>Cloud Commander is a file manager for the web. It includes a com$
  <port protocol="tcp" port="8000"/>
</service>

重新載入設定

# 重新載入設定
sudo firewall-cmd --reload
#add source IP 限制
firewall-cmd --zone=public \
  --add-rich-rule 'rule family="ipv4" source address="192.168.0.0/24" service name="http" accept' \
  --permanent
#remove source IP 限制
 firewall-cmd --zone=public   --remove-rich-rule 'rule family="ipv4" source address="192.168.0.0/24" service name="http" accept' --permanent

cat /etc/firewalld/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"/>
  <service name="cockpit"/>
  <service name="syncthing-gui"/>
  <service name="cloudcmd"/>
  <rule family="ipv4">
    <source address="192.168.0.0/24"/>
    <service name="http"/>
    <accept/>
  </rule>
</zone>

firewall-cmd --zone=public --add-source=120.115.4.29

firewall-cmd --zone=public --remove-source=120.115.4.29

firewall-cmd --runtime-to-permanent

用於apt-get

# DNS
-A INPUT -p tcp -m tcp --sport 53 -j ACCEPT
-A INPUT -p udp -m udp --sport 53 -j ACCEPT

# apt-get
-A INPUT -p tcp --sport 80 -j ACCEPT

Last updated