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
Was this helpful?