iptables 指令入門

iptables 是一套 Linux 下的防火牆,可以按需要建立 iptables 規則,允許或阻擋網路流量。但透過 SSH 設定 iptables 時要格外小心,因為如果設定錯誤,可能會阻擋外部連線,需要到機器面前進行修復,多年前我試過輸入一道錯誤的 iptables 指令,搞到要立即趕到 data center 修復。

iptables 設定時主要分三種類型,分別是 INPUT, FORWARD 及 OUTPUT。

INPUT: 這個行為是外來的連線,例如從遠端 SSH 到伺服器,iptables 會將這個連線定義為 INPUT。

FORWARD: 這是外來的連線,但最終目的地不是伺服器本身,只是轉送到其他機器,例如路由器,除了 routing, NAT 等網路服務外,一般上不會用到這種類型。

OUTPUT: 從本機連接到外部的連線,這個可以允許或阻擋本機連接對外的服務。

而 iptables 對匹配連線會有三種不同動作:

Accept: 允許連線。

Drop: 將連接 Drop 掉,就像連線從未建立,不會反回錯誤。

Reject:不允許連線,但會反回錯誤

現在來看看 iptables 的實例,首先輸入以下指令列出目前 iptables 的規則:

# iptables -nvL

假如想阻擋所有從 1.2.3.4 的連線,語法是這樣:

# iptables -A INPUT -s 1.2.3.4 -j DROP

上面的 iptables 指令,”-A” 是建立規則的意思,-s 後是指定目標 IP.

假如想阻擋成個 class c 的網路,語法改成這樣:

# iptables -A INPUT -s 1.2.3.0/24 -j DROP

或者

# iptables -A INPUT -s 1.2.3.0/255.255.255.0 -j DROP

看過阻擋 IP 地址後,iptables 同樣可以阻擋 port 的連線,例如想阻擋 ip 1.2.3.4 連線到 SSH, 只要加上 –dport 參數:

# iptables -A INPUT -p tcp –dport ssh -s 1.2.3.4 -j DROP

如果要定義其他的 port, 將上面 ssh 改成想阻擋的 port 即可,可以是服務名稱,或者是 port 數字。而 -p 是 protocol 的意思,上面是阻擋 tcp 類型的連線。

如果要將所有 SSH 的連線阻擋,只要將 ip 的部份刪除即可:

# iptables -A INPUT -p tcp –dport ssh -j DROP

當設定好 iptables 後,要將規則儲存,否則下次重新開機設定會消失,又要重新設定。要儲存 iptables 設定,輸入以下指令:

Redhat / CentOS:

# /sbin/service iptables save

Debian / Ubuntu:

$ sudo /sbin/iptables-save



Leave a Reply