iptables 是 Linux 非常強大的工具,可以藉由此工具控制核心 netfilter ,針對從 Lay 2 - 4 訊框、封包等各種攔截及過濾,並且還具備 NAT、路由、頻管合併等各式高階功能。
1. Iptables 簡介
iptables 是 Linux 很早的防火牆介面管理工具 ( 控制核心 netfilter ),目前僅能控制 IPv4 ,如果要控制 IPv6 需使用 ip6tables ,另外 RHEL 8 還有一種簡易的防火牆管理工具 firewalld ,不過同時間只能有一種存在,如果要使用 iptables 需要停用 firewalld (systemctl disable firewalld --now
)。
三種管理工具
RHEL 8 的防火牆管理工具:
firewalld
: firewalld
工具用於簡單且容易的防火牆規則管理。
nftables
: 使用 nftables
最新的管理工具,除了防火牆之外能夠操作更複雜的網路管理。
iptables
: RHEL 的 iptables API 使用的是 nf_tables
,此 API 為較新版的功能,也能將 iptables 規則轉換成 nftables。
1.1. Iptables 表架構
Iptables 總共有四張表:
- filter - 封包過濾也是所謂的 Netfilter 核心的防火牆功能。
- nat - NAT (Network Address Translation) 。
- mangle - 破壞表可以修改封包內容。
- raw - 加速封包穿越防火牆。
2. 查看 iptables 設定 ( Filter 表)
1
2
3
4
5
6
7
8
9
|
[root@servera ~]# iptables -t filter -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
|
1
2
3
|
[root@servera ~]# iptables -L INPUT
Chain INPUT (policy ACCEPT)
target prot opt source destination
|
Default Table
預設 table 就是查看 filter , -t filter
參數可以省略。
3. 設定預設政策
預設 iptable 任何一個 chain 都是 ACCEPT ,對於 INPUT 來說不是一件很好的規則,對於 INPUT chain 都會改成 DROP 拒絕所有的封包進入後,再針對需求開放。
1
|
[root@servera ~]# iptables -P INPUT DROP
|
Warning
練習 iptables 一定要避免遠端操控機器,避免操作不當導致 SSH 連線斷線,如果要遠端操作務必先開放 tcp/22 連線規則後再修改預設政策。
4. 開放 172.25.250.0/24 網段可以使用 SSH 服務
參數簡述:
- -A : 指定 Filter 的 Chain (INPUT 、 OUTPUT、 FORWARD)增加規則。
- -s : 來源地址或網段。
- -d : 目的地址或網段。
- -p : 協定 ( TCP、 UDP 、ICMP 等) 。
- --dport : 目的地址的阜號 。
- -j : 條件匹配後的動作 ( ACCEPT 、 DROP 、 LOG) 。
1
2
3
4
5
|
[root@servera ~]# iptables -A INPUT -s 172.25.250.0/24 -p tcp --dport 22 -j ACCEPT
[root@servera ~]# iptables -nL INPUT
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT tcp -- 172.25.250.0/24 0.0.0.0/0 tcp dpt:22
|
加速 List 顯示
如果沒有加上 -n
參數系統會自動作 DNS 名稱解析,會使得列表一旦多時顯示速度很慢,加上 -n
參數強迫只顯示 IP 而不顯示解析的名稱。
5. 開放本機 Localhost 能訪問自己全部服務
iptables 強大到連自己的 loopback 介面都可以封鎖,如果要做 loopback 測試必須要開放 localhost。
1
2
3
4
5
6
|
[root@servera ~]# iptables -A INPUT -s 127.0.0.1 -j ACCEPT
[root@servera ~]# iptables -nL
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT tcp -- 172.25.250.0/24 0.0.0.0/0 tcp dpt:22
ACCEPT all -- 127.0.0.1 0.0.0.0/0
|
6. 開放任一網路能訪問 http 服務
這就是最常使用的開 port ,當架設好一個 Web 服務希望所有來源端都能訪問的方式。
1
2
3
4
5
6
7
|
[root@servera ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
[root@servera ~]# iptables -nL INPUT
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT tcp -- 172.25.250.0/24 0.0.0.0/0 tcp dpt:22
ACCEPT all -- 127.0.0.1 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
|
7. 開放 172.25.250.11 主機能發送 ICMP 封包
如果要限定固定主機能使用 ping 到本機,可以用限定IP方式來管理。
1
2
3
4
5
6
7
8
|
[root@servera ~]# iptables -A INPUT -p ICMP -s 172.25.250.11 -j ACCEPT
[root@servera ~]# iptables -nL INPUT
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT tcp -- 172.25.250.0/24 0.0.0.0/0 tcp dpt:22
ACCEPT all -- 127.0.0.1 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
ACCEPT icmp -- 172.25.250.11 0.0.0.0/0
|
8. 保存機制
上述所有的規則都是設定在記憶體內的,一旦開機就全部失效。
8.1. 使用 iptables service 服務
透過 iptables-save 直接保存。
缺點
透過 iptables-save 可以很方便直接保存在資料庫,缺點是如果規則很大量,一旦重複內容的主機異動要修改就很麻煩,需要手動一個一個修訂,如果撰寫成腳本就能使用變數改一行即可。
8.2. 撰寫一個 shell script ,並託管給 systemd 開機自動啟動
8.2.1. 撰寫 Shell Script,並賦予僅 root 擁有權限。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
cat >> /usr/sbin/my-iptables << EOF
#!/bin/bash
# Delete ALL of rule
iptables -F
iptables -P INPUT DROP
iptables -A INPUT -s 172.25.250.0/24 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -s 127.0.0.1 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p ICMP -s 172.25.250.11 -j ACCEPT
EOF
chmod 700 /usr/sbin/my-iptables
|
8.2.2. 撰寫 system service 單元,並交由 systemd 託管。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
cat >> /lib/systemd/system/my-iptable.service << EOF
[Unit]
Description=iptables-rule
[Service]
ExecStart=/usr/sbin/my-iptables
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable my-iptable.service
|
9. 小結
iptables 工具十分強大,目前僅介紹最基本的 filter 表最基礎功能,另外曾經學習過 Cisco 網路設備的 ACL 會發現其使用方式與 iptable 十分相似,等於會了 iptables 規則設定 ACL 規則就很容易,反之亦然。
允許所有來源 192.168.50.0/24 網段封包可以存取指定主機 10.10.10.10 的 tcp/80 服務。
1
2
3
4
|
# Iptables
iptables -A OUTPUT -s 192.168.50.0/24 -d 10.10.10.10 -p tcp --dport 80 -j ACCEPT
# ACL
access-list 101 permit tcp 192.168.50.0 0.0.0.255 10.10.10.10 0.0.0.0 ep 80
|