Intro Linux iptables

Intro Linux iptables

iptables是Linux上常用的防火牆軟件,iptables用來過濾網路封包,
正確的設定 iptables 規則可以有效提升 Linux 網路安全,網管人員設定開放哪些 IP 與哪些 Port,來阻擋駭客攻擊。

iptables 的設計結構可以分三層, Table -> Chains -> Rules , iptables 中可以包含多個 Table ,而一個 Table 又可以包含多個 Chain ,一個 Chain 也可以包含多個 Rule 。

Table :防火牆規則群組。
Chain:防火牆規則鏈。
Rule:防火牆規則。

Chains & Tables

1
iptables 內建有五個 Tables,分別是 Filter Table, NAT Table, Mangle Table, Raw Table, Security Table。

Filter Table

1
2
3
4
5
6
7
Filter Table 是 iptables 中預設的 table,如果你沒有新增自訂的 Table ,那麼 iptable 會使用 Filter Table 裡的設定來處理網路封包。

Filter Table 預設有三個 Chain : INPUT, OUTPUT, FORWARD, 分別用來處理三種不同的網路封包。

INPUT chain:處理由外部機器傳過來的封包。
OUTPUT Chain:處理本機傳出去給別台機器的封包。
FORWARD Chain:處理外部機器透過本機,要傳給第三方機器的封包,如果你的機器是一台 Router or Proxy,才會存在這種封包。

NAT Table : Network Address Translation

1
2
3
4
NAT Table 預設有二個 Chain : PREROUTING, POSTROUTING 。

PREROUTING chain : 再 Routing 之前轉換封包來源 IP 資訊,例如。
POSTROUTING chain : 再 Routing 之後轉換封包本機 IP 資訊,例如本機 IP 會寫成 127.0.0.1 ,但是傳送出去後,會轉換回對外開放的 IP 如 10.99.82.1。

Rule & Target

1
2
3
4
5
iptables 預設有三種 Target ,分別是 ACCEPT, REJECT, LOG 。

ACCEPT:接受這個封包
REJECT:拒絕這個封包
LOG: 記錄下這個封包, Log 寫入檔案 /var/log/message

如何使用 iptables

1
2
3
4
5
6
7
8
使用 iptables 前,前先確定你的系統有安裝以下兩個套件。

iptables
iptables-services

CentOS 安裝方式如下:

sudo yum install iptables-services iptables

清除已有iptables規則

1
2
3
使用 -F 參數可以清除 iptables 所有的 rule 。

sudo iptables -F

開放指定的端口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 允許本機訪問本機
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
# 允許已建立的或相關連的通行
iptables -A INPUT -m state -state ESTABLISHED,RELATED -j ACCEPT
# 允許所有本機向外的訪問
iptables -A OUTPUT -j ACCEPT
# 允許訪問22 port
iptables -A INPUT -p tcp -dport 22 -j ACCEPT
# 允許訪問80 port
iptables -A INPUT -p tcp -dport 80 -j ACCEPT
# 允許FTP服務的21和20 port
iptables -A INPUT -p tcp -dport 21 -j ACCEPT
iptables -A INPUT -p tcp -dport 20 -j ACCEPT
1).用DROP方法

iptables -A INPUT -p tcp -j DROP
2).用REJECT方法

iptables -A INPUT -j REJECT
iptables -A FORWARD -j REJECT

過濾IP

1
2
3
4
5
6
7
8
#擋掉某個IP的命令是
iptables -I INPUT -s 123.45.6.7 -j DROP
#封鎖某個網段即從123.0.0.1到123.255.255.254的命令
iptables -I INPUT -s 123.0.0.0/8 -j DROP
#封鎖一個class B 的IP網段即從123.45.0.1到123.45.255.254的命令
iptables -I INPUT -s 124.45.0.0/16 -j DROP
#封鎖一個class C 的IP網段即從123.45.6.1到123.45.6.254的命令是
iptables -I INPUT -s 123.45.6.0/24 -j DROP

查看已建立的iptables規則

1
2
3
4
iptables -L -n
v:顯示詳細信息,包括每條規則的匹配包數量和匹配字節數
x:在 v 的基礎上,禁止自動單位換算(K、M) vps偵探
n:只顯示IP地址和端口號,不將ip解析為域名

刪除已添加的iptables規則

1
2
3
4
5
6
7
8
9
將所有iptables以序號標記顯示,執行:
iptables -L -n -line-numbers
上面指令在 centOS 上測試結果:

Bad argument `-line-numbers'
Try `iptables -h' or 'iptables --help' for more information.
刪除INPUT裡序號為8的規則,執行:

iptables -D INPUT 8

iptables的開機啟動及規則保存

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
CentOS上可能會存在安裝好iptables後,iptables並不開機自啟動,可以執行一下:

chkconfig -level 345 iptables on
將其加入開機啟動。

CentOS上可以執行下列指令來儲存規則:

service iptables save
Debian/Ubuntu上iptables是不會保存規則的,請使用 iptables-save 指令可以儲存所有的 chain & rule 。

sudo iptables-save > /etc/iptables.rules
為了重啟服務器後,規則自動載入,我們建立以下文件:

sudo vim /etc/network/if-pre-up.d/iptables#!/bin/bash
iptables-save > /etc/iptables.rules
設定執行權限:

chmod +x /etc/network/if-pre-up.d/iptables

在 CentOS:
The /etc/sysconfig/iptables-config file stores information used by the kernel to set up packet filtering services at boot time or whenever the service is started.