Contents

Linux - Iptables Filter 表規則管理

iptables 是 Linux 非常強大的工具,可以藉由此工具控制核心 netfilter ,針對從 Lay 2 - 4 訊框、封包等各種攔截及過濾,並且還具備 NAT、路由、頻管合併等各式高階功能。

1. Iptables 簡介

iptables 是 Linux 很早的防火牆介面管理工具 ( 控制核心 netfilter ),目前僅能控制 IPv4 ,如果要控制 IPv6 需使用 ip6tables ,另外 RHEL 8 還有一種簡易的防火牆管理工具 firewalld ,不過同時間只能有一種存在,如果要使用 iptables 需要停用 firewalld (systemctl disable firewalld --now)。

https://i.imgur.com/K7M9DNL.png
From access.redhat.com

三種管理工具

RHEL 8 的防火牆管理工具:

  1. firewalld: firewalld 工具用於簡單且容易的防火牆規則管理。
  2. nftables: 使用 nftables 最新的管理工具,除了防火牆之外能夠操作更複雜的網路管理。
  3. iptables: RHEL 的 iptables API 使用的是 nf_tables ,此 API 為較新版的功能,也能將 iptables 規則轉換成 nftables。

1.1. Iptables 表架構

Iptables 總共有四張表:

  1. filter - 封包過濾也是所謂的 Netfilter 核心的防火牆功能。
  2. nat - NAT (Network Address Translation) 。
  3. mangle - 破壞表可以修改封包內容。
  4. 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  

2.1.1 只查看 INPUT chain 規則

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 服務

參數簡述:

  1. -A : 指定 Filter 的 Chain (INPUT 、 OUTPUT、 FORWARD)增加規則。
  2. -s : 來源地址或網段。
  3. -d : 目的地址或網段。
  4. -p : 協定 ( TCP、 UDP 、ICMP 等) 。
  5. --dport : 目的地址的阜號 。
  6. -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 直接保存。

1
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


如果你還沒有註冊 Like Coin,你可以在文章最下方看到 Like 的按鈕,點下去後即可申請帳號,透過申請帳號後可以幫我的文章按下 Like,而 Like 最多可以點五次,而你不用付出任何一塊錢,就能給我寫這篇文章的最大的回饋!