我的Linux生活日記 23.防火牆-firewalld
firewalld
今天來跟大家介紹防火牆。在日常生活中還是得設定防火牆確保陌生人不會隨意進入自己的主機中。在Debian 為底的系統中主要是以 ufw(簡易防火牆) 為主,但是在網站系統中我比較會以 firewalld 為主,畢竟在伺服器里都會有一個或是兩個以上的網段、網卡要管理。今天就介紹比較常用的設定方式。
另外在 debian 10 有安裝 KVM 或是 ubuntu 20.04 LTS 有安裝 docker 就不建議使用 firewalld ,因為當前版本會導致KVM 網路 或是 docker 網路異常。此問題在下一個發行版才有獲得解決。
zone-區域簡介
firewalld 的概念事先將網卡劃分區塊(zone),每張網卡就好比是家裡的每一扇門,而區域就是主臥、客廳、室外。我舉幾個比較常用的區域:
- public
顧名思義就是公眾區域,好比家裡的大門是通往外面的世界,逼安只會允許公開的服務接口通過,如:22
- trusted
就像是自己房間區域一樣,可以允許所有的連線連接主機裡面的服務。
- libvirt
libvirt 是比校特殊的區域,主要是處理 KVM 的網路介面。而且只有 KVM 的網路介面可以到此區域,同時KVM 網路介面也無法加入到其他區域。原因可能是是過度
階段,未來版本可能就沒有了。
安裝防火牆
- Debian
Debian 如果要使用firewalld 建議先將預設的防火牆移除在安裝 firewalld
apt remove ufw
apt install firewalld
- CentOS7
yum install firewalld
查詢版本
firewall-cmd --version
新增網卡至特定區域
- 先查詢網卡
ip addr
- 設定網卡
sudo firewall-cmd --permanent --zone=trusted --change-interface=eth0
檢視防火牆規則
firewall-cmd --list-all
查詢那協正在運作的 zone
firewall-cmd --get-active-zones
重新讀取設定
firewall-cmd --reload
下列範例我都會加 --permanent
永久設置選項,加了此選項必須重新讀取才會生效。如果不加永久選項,執行設定之後就會立刻生效,但是重新開機會是重新啟動 firewalld 就會回到設定前的狀態。
新增/刪除 服務
採用服務規則時要記住實際上只會開預設的port,例如http
預設是走 80
,如果網頁伺服器實際上是走 10010
一樣會被擋下來唷!
常見的連接埠可以參考linux 這份文件 /etc/services
當然更多資訊可以從這裡得知 Service Name and Transport Protocol Port Number Registry
- 新增
firewall-cmd --permanent --add-service=http
- 移除
firewall-cmd --permanent --remove-service=http
新增/刪除 port
- 新增
firewall-cmd --permanent --zone=public --add-port=4848/tcp
- 移除
firewall-cmd --permanent --zone=public --remove-port=4848/tcp
允許特定網段、IP 通過
這部份我是直接用 rich-rule
處理,因為我就是不想多記一點指令。
- 新增
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.56.1" accept'
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.56.0/24" accept'
- 移除
firewall-cmd --permanent --zone=public --remove-rich-rule='rule family="ipv4" source address="192.168.56.1" accept'
firewall-cmd --permanent --zone=public --remove-rich-rule='rule family="ipv4" source address="192.168.56.0/24" accept'
允許特定網段、IP 通過 指定 port
- 新增
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.56.1" port protocol="tcp" port="33899" accept'
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.56.0/24" port protocol="tcp" port="33899" accept'
- 移除
firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" source address="192.168.56.1" port protocol="tcp" port="33899" accept'
firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" source address="192.168.56.0/24" port protocol="tcp" port="33899" accept'
iptables
有項需求是這樣的:有一台虛擬機有安裝資料庫 MySQL,在資安規劃上只允許系統 網頁伺服器 及 控制主機 向 資料庫服務 連接,而且禁止該虛擬機連到其他設備。
上述需求要怎麼完成呢?如果是昨天說到的防火牆 firewalld 是可以做到的,但是在維護上會很困難,因為 firewalld的主要原則是網路流向從外進入主機嚴謹,從主機內部到外部網路環境寬鬆,而上述需求剛剛好跟 firewalld 衝突。不同的需求有不同合適工具可以達成,今天就用 iptables
完成這項需求。
需求分析
設定之前必須先規劃防火牆,但是規劃之前做重要的事釐清網路環境。首先必須先知道該虛擬機的網卡IP。
$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 7c:2a:31:fa:6b:7b brd ff:ff:ff:ff:ff:ff
inet 192.168.1.11/24 brd 192.168.1.255 scope global dynamic noprefixroute wlp1s0
valid_lft 85410sec preferred_lft 85410sec
inet6 2404:0:8038:d3bf:1182:9247:af40:4002/64 scope global dynamic noprefixroute
valid_lft 297sec preferred_lft 117sec
inet6 fe80::3c62:bfc7:cd45:4644/64 scope link noprefixroute
valid_lft forever preferred_lft forever
然後連線的 網頁伺服器主機IP 有:192.168.56.3、192.168.56.4。控制台主機IP是:192.168.56.90。
另外這台主機操作方式主要是透過 ssh 遠端操控的,所以有一項隱性需求:必須保持 SSH 連線暢通。
還有很重要一項,必須讓其他主機 ping 的到該虛擬機,因為該網路是公共空間,有不同人共同管理。
所以這次範例的防火牆規劃是這樣的:
- 允許 port 3306 對 192.168.56.3、192.168.56.4 開放。
- 允許 port ssh 對 192.168.56.90 開放。
- 允許 ping。
- 其餘連線一律丟棄。
- 對外連線一律不通。
實做
iptables 設定一有一個原則:開放最小的優先設定,越大越後設定。
- 清空 iptables 規則
iptables -F
iptables -X
iptables -Z
- INPUT: 新增 lo 網卡
iptables -I INPUT 1 0 -i lo -j ACCEPT
- INPUT: 允許 port 3306 對 192.168.56.3、192.168.56.4 開放
iptables -I INPUT 2 -i eth0 -s 192.168.56.3/32 -p tcp -m multiport --destination-port 3306 -j ACCEPT
iptables -I INPUT 3 -i eth0 -s 192.168.56.4/32 -p tcp -m multiport --destination-port 3306 -j ACCEPT
- INPUT: 允許 port ssh 對 192.168.56.90 開放。
iptables -I INPUT 4 -i eth0 -s 192.168.56.90/32 -p tcp -m multiport --destination-port 22 -j ACCEPT
- INPUT: icmp
iptables -A INPUT -i eth0 -s 0.0.0.0/32 -p icmp --icmp-type 8 -j ACCEPT
- INPUT: 其餘連線一律丟棄。
iptables -A INPUT -i eth0 -s 0.0.0.0/0 -j DROP
- OUTPUT: 允許 port 3306 對 192.168.56.3、192.168.56.4 開放
iptables -I OUTPUT 1 -i eth0 -s 192.168.56.3/32 -p tcp -m multiport --destination-port 3306 -j ACCEPT
iptables -I OUTPUT 2 -i eth0 -s 192.168.56.4/32 -p tcp -m multiport --destination-port 3306 -j ACCEP
- OUTPUT: 允許 port ssh 對 192.168.56.90 開放。
iptables -I OUTPUT 3 -i eth0 -s 192.168.56.90/32 -p tcp -m multiport --destination-port 22 -j ACCEPT
- OUTPUT: icmp
iptables -I OUTPUT 4 -i eth0 -s 0.0.0.0/32 -p icmp --icmp-type 8 -j ACCEPT
- OUTPUT: 對外連線一律不通。
iptables -A OUTPUT -i eth0 -s 0.0.0.0/0 -j DROP
iptables -A OUTPUT -s x.x.x.x/32 -j DROP
service iptables save
- 儲存連線
- CentOS6
service iptables save
- CentOS7
iptables-save > /etc/sysconfig/iptables
設定防火牆有一點必須注意,要竭盡可能離主機近一點,因為總有手臭、恍神的時候,把自己擋在防火牆外。這時候 螢幕、鍵盤、滑鼠 或是 console 就重要了。
參考資料
Red Hat Enterprise Linux 4: 安全性設定手冊 附錄 C. 常見的連接埠
Libvirt managed bridge won’t use firewalld zone after reboot