Linux iptables 命令行操作常用指令

iptables 是 Linux 中重要的訪問控制手段,是俗稱的 Linux 防火牆系統的重要組成部分。這裏記錄了iptables 防火牆規則的一些常用的操作指令。

下面的操作以 CentOS 爲基礎介紹,應該對不同的 Linux 發行版都差不多。在 CentOS 5.x 和 6.x 中,iptables 是默認安裝的(如果沒有安裝,先安裝 iptables 即可)。如果對 iptables 的工作流程不太瞭解,可以先讀讀這篇 iptables 工作流程的通俗理解

下面的操作指的是直接從 Linux 命令行輸入的指令,也可以寫成 .sh 文件批處理執行。

1. 基本操作

查看 IPTABLES 版本

rpm -q iptables

這裏返回的結果類似於 iptables-1.4.7-9.el6.i686

查看當前 IPTABLES 規則

service iptables status

或者

iptables -L --line-numbers

該命令會以列表的形式顯示出當前使用的 iptables 規則,每一條規則前面的編號可以用來做爲其它操作——例如後面的刪除操作——的參數,很有用。顯示的結果類似於,

# service iptables status
Table: filter
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
2 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
5 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
num target prot opt source destination
1 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
num target prot opt source destination

顯示出該 iptables 中有一個表 filter,其中在 INPUT chain 中有 5 條規則,在 FORWARD chain 中有 1 條規則,在 OUTPUT chain 中沒有規則。

查看幫助

操作指令也是直接在終端輸入,

iptables --help

可以查看 iptables 的幫助信息:

Usage: iptables -[AD] chain rule-specification [options]
iptables -I chain [rulenum] rule-specification [options]
iptables -R chain rulenum rule-specification [options]
iptables -D chain rulenum [options]
iptables -[LS] [chain [rulenum]] [options]
iptables -[FZ] [chain] [options]
iptables -[NX] chain
iptables -E old-chain-name new-chain-name
iptables -P chain target [options]
iptables -h (print this help information)

指令Commands:
Either long(單詞,以 -- 做前導) or short(字母,區分大小寫,以 - 做前導) options are allowed.
--append -A chain Append to chain
--delete -D chain Delete matching rule from chain
--delete -D chain rulenum
Delete rule rulenum (1 = first) from chain
--insert -I chain [rulenum]
Insert in chain as rulenum (default 1=first)
--replace -R chain rulenum
Replace rule rulenum (1 = first) in chain
--list -L [chain [rulenum]]
List the rules in a chain or all chains
--list-rules -S [chain [rulenum]]
Print the rules in a chain or all chains
--flush -F [chain] Delete all rules in chain or all chains
--zero -Z [chain [rulenum]]
Zero counters in chain or all chains
--new -N chain Create a new user-defined chain
--delete-chain
-X [chain] Delete a user-defined chain
--policy -P chain target
Change policy on chain to target
--rename-chain
-E old-chain new-chain
Change chain name, (moving any references)
參數(選項)Options:
[!] --proto -p proto protocol: by number or name, eg. `tcp'
[!] --source -s address[/mask][...]
source specification
[!] --destination -d address[/mask][...]
destination specification
[!] --in-interface -i input name[+]
network interface name ([+] for wildcard)
--jump -j target
target for rule (may load target extension)
--goto -g chain
jump to chain with no return
--match -m match
extended match (may load extension)
--numeric -n numeric output of addresses and ports
[!] --out-interface -o output name[+]
network interface name ([+] for wildcard)
--table -t table table to manipulate (default: `filter')
--verbose -v verbose mode
--line-numbers print line numbers when listing
--exact -x expand numbers (display exact values)
[!] --fragment -f match second or further fragments only
--modprobe= try to insert modules using this command --set-counters PKTS BYTES set the counter during insert/append [!] --version -V print package version.

2. iptables 規則中各指令(command)的含義

各種指令如下(前面的幫助信息中列出來的第一大塊內容)。既可以使用長指令(單詞,以 — 做前導),也可以使用短指令字母,區分大小寫,以 – 做前導),例如,

iptables --append chain firewall-rule

等價於,

iptables -A chain firewall-rule

下面介紹各種指令。因爲形式都一樣,下面針對 –append -A 作詳細介紹,其它的只介紹其作用。舉例時僅使用短指令。

另外,指令後面所帶的參數/選項,如果以 [ ] 包括,則表示該參數/選項可省略(有缺省值)。

–APPEND -A

指令形式,

iptables -A chain firewall-rule
  • -A chain – 指定規則應該添加到的 chain 的名稱。例如,使用 INPUT 將會把規則添加到默認的 INPUT(入站)鏈的末尾,而使用 OUTPUT 則會將規則添加到出站鏈的末尾。
  • firewall-rule – 包含各種參數選項的防火牆規則,一次一條規則

“-A” 的意思是附加(append),並不是添加(Add)的意思。它是將規則添加到已有的防火牆鏈(chain)的末尾的操作指令。這是特別重要的,因爲規則在 iptables 中的位置非常重要,所以千萬要記住, -A 的意思是將規則添加到末尾。因爲一般情況下 iptables 中最後一條規則是丟棄所有數據包。如果你已經有了一條這樣的規則,使用 -A 參數添加的規則將會在丟棄規則之後,以至於新規則根本無法起作用。如果要插入到中間位置,需要用 -I 指令。

如果不理解 chain(鏈)的含義,最好先讀讀 iptables fundamentals

–DELETE -D

從 chain 中刪除與指定規則匹配,或指定編號的條目。

形式,

iptables -D chain firewall-rule

表示從 chain 中刪除對應規則 firewall-rule 的那一條目。這種形式刪除規則比較麻煩,通常用下面的形式

iptables -D chain rulenum

刪除 chain 中編號爲 rulenum 的那條規則。1 表示第一條。

–INSERT -I

形式,

 iptables -I chain [rulenum] firewall-rule

將 firewall-rule 添加爲 chain 中的第 rulenum 條規則,原先的第 rulenum 條及以後各條的需要順次 +1。如上面一樣,1 表示該 chain 中第一條。默認爲 1,即,如果沒有指定 rulenum 則將該 chain 中第一條規則替換掉。

–REPLACE -R

形式,

iptables -R chain [rulenum] firewall-rule

將 chain 中原來的第 rulenum 條規則替換爲 firewall-rule。如果沒有指定 rulenum,則替換該 chain 中第一條。

–LIST -L

形式,

iptables -L [chain [rulenum]]

列出 chain 或者所有 chain(當未指定 chain 名稱時)中的 第 rulenum 條規則或者所有規則(當未指定 rulenum 時)。不過要注意,如果未指定 chain 則不能帶 rulenum 參數。

如果在 -L 後再加上 –line-numbers,則表示在每條規則前面顯示序號。如,

iptables -L --line-numbers

–LIST-RULES -S

形式,

iptables -S [chain [rulenum]]

打印出 chain 或者所有 chain(當未指定 chain 名稱時)中的 第 rulenum 條規則或者所有規則(當未指定 rulenum 時)。不過要注意,如果未指定 chain 則不能帶 rulenum 參數。

–FLUSH -F

形式,

iptables -F [chain]

清空 chain 或所有 chain (當未指定 chain 名稱時)中的規則。

–ZERO -Z

形式,

iptables -Z [chain [rulenum]]

把 chain 或者所有 chain(當未指定 chain 名稱時)的包及字節的計數器清空。

–NEW -N

形式,

--new -N chain

創建一個名稱爲 chain 的新鏈。

–DELETE-CHAIN -X

形式,

iptables -X [chain]

刪除用戶自定義 chain 或者所有用戶自定義 chain(當未指定 chain 名稱時)。該指令不影響預設規則(如 INPUT、OUTPUT、FORWARD 等)。

–POLICY -P

形式,

iptables -P chain target

改變 chain 的策略爲 target。

–RENAME-CHAIN -E

形式,

iptables -E old-chain new-chain

將 old-chain 名稱更改爲 new-chain。這樣做可以使所有引用 old-chain 的規則失效。

3. iptables 規則中各參數的含義

各種參數如下(前面的幫助信息中列出來的第二大塊內容)。

-P 代表協議(PROTOCOL)

  • 指明當前規則針對的傳輸協議(如 TCP、UDP、ICMP 等)
  • 可能的參數值有:tcp, udp, icmp, all
  • 使用 “all” 表示適用於所有協議。而如果在規則中不指定 -p 參數,則默認使用 “all” 參數。一般不使用 “all” 這個值,要麼指定某個特定的協議,要麼就指定 -p 參數。
  • -p 的參數值既可以用名稱(如 tcp)也可以用協議對應的數值(如 6 代表 tcp 協議)
  • /etc/protocols 文件中包含了所有允許的協議名稱和相應數值
  • 也可以用長的參數名 –protocol

-S 代表源地址(SOURCE)

  • 指定數據包的源地址
  • 可以是 ip 地址,或者網絡地址,或者主機名(hostname)
  • 例如:-s 192.168.1.101 表示針對特定的 ip 地址
  • 對於網絡掩碼,使用 /mask。例如,“-s 192.168.1.0/24″ 表示網絡掩碼爲 255.255.255.0 的所有 192.168.1.x 地址都匹配。
  • 如果不指定 -s 參數,默認匹配所有源地址
  • 也可以用長參數名 –src 或者 –source

-D 代表目的地址(DESTINATION)

  • 指定數據包的目的地址
  • 使用方式與上面的 “-s” 一樣(不同之處僅在於 -s 指源,而 -d 表示目的地址)
  • 也可以用長參數名 –dst 或者 –destination

-J 代表跳轉(TARGET)

  • j 的意思是 “jump”(跳轉) 到目標
  • 指定當某個數據包滿足該規則的時候的就跳轉到的下一個處理規則,而不再順序執行後面的規則判斷
  • 可能的值有:ACCEPT, DROP, QUEUE, RETURN,分別表示接受、丟棄、進入隊列,返回(跳出,通常是從某個 chain 中跳回到調用該 chain 的上層 chain)
  • 也可以跳轉到某個自定義的 chain 中,使用該 chain 的名稱做爲跳轉目標

-I 代表 IN INTERFACE(入站接口)

  • i 表示 “input interface”(輸入接口,即,指定網絡數據處理的網卡,一般 eth0 即表示第一塊有線網卡的外網接口,lo 表示局域網接口)
  • 可以直接理解爲 “-i” 表示接口。不過,-i 和 -o 都表示接口,-i 表示輸入時的接口,而 -o 特指輸出用的接口。
  • 指定數據包進入 INPUT、FORWARD 和 PREROUTING 鏈時經由的接口。
  • 例如:-i eth0 表示該規則應該針對從 eth0 接口進來的數據包。
  • 如果不指定 -i 參數,則經由系統中所有可用的接口進入的數據包都可以匹配該規則。
  • 也可以使用長參數 –in-interface

-O 代表 OUT INTERFACE(出站接口)

  • o 表示 “output interface”(出站經由接口)
  • 指定發送出去的數據包進入 INPUT、FORWARD 和 PREROUTING 鏈時經由的接口。
  • 如果不指定 -o 參數,則經由系統中所有可用的接口發出的數據包都可以匹配該規則。
  • 也可以使用長參數 –out-interface

4. 其它防火牆參數選項

上面某些防火牆參數還有屬於它自己的參數選項,可以與其配合使用。下面是一些常用的選項。

要使用這些參數選項,需要指定相應的參數,例如,要使用 “–sport” 選項,應該在規則中指定 “-p tcp” (或者 “-p udp”)等參數。

注意:所有這些選項前面都是 –(2個短橫線 – )。

–SPORT 表示 SOURCE PORT (源端口,用於 -P TCP, 或者 -P UDP)

  • 默認匹配所有端口(未特別指定時)
  • 可以指定端口號(數字),也可以指定端口名稱。例如,默認的 SSH 端口號碼爲 22,名稱爲 ssh,可以表示爲 “–sport 22″ 或者 “–sport ssh”。
  • /etc/services 文件包含了所有允許的端口名稱和對應的端口號碼。
  • 在規則中使用號碼比使用名稱要好(效率高些)
  • 要匹配一個端口範圍,使用英文半角冒號(:),如 22:100 匹配從 22 到 100 的所有端口號。
  • 也可以使用長名稱 –source-port

–DPORT 表示 DESTINATION PORT (目的端口,-P TCP, 或者 -P UDP)

  • 與 –sport 的用法相同,區別僅在於對象是目的端口
  • 也可以使用長名稱 –destination-port

–TCP-FLAGS 表示 TCP FLAGS (用於 -P TCP)

  • 可以使用英文半角逗號(,)來指定多個 TCP 狀態標識
  • 可能值有:SYN, ACK, FIN, RST, URG, PSH。可以全用,也可以不用。

–ICMP-TYPE 表示 ICMP TYPE (ICMP 類型,用於 -P ICMP)

  • 當使用 icmp 協議 “-p icmp” 的時候,可以使用 “–icmp-type” 特別指定 ICMP 類型
  • 例如,使用 “–icmp-type 0″ 表示 “Echo Reply”,“–icmp-type 8″ 表示 “Echo”。

5. 用於僅允許入站 SSH 連接的 iptables 示例

在瞭解了各種 iptables 參數以及參數選項之後,再來看看下面的實例。

在這個例子中,我們的目標是:僅允許 SSH 連接到服務器,而其它所有連接都被禁止(包括 ping)。

警告:如果設置不當,可能會使系統無法通過網絡訪問,所以在玩 VPS 的時候要特別注意。不過如果是 Linode VPS 的話,它提供了 LISH 接口,可以讓你象訪問本地系統一樣的操作 VPS,倒也不用太擔心,只是有些麻煩而已。如果是別的 VPS,我就不太瞭解了。總之,萬事小心!最好在本地的虛擬機裏面測試這些玩意兒,否則把自己擋在了 VPS 外面無法通過 SSH 來連接控制檯,那可就不好玩了。

1. 刪除已有的規則

如果已經有了某些規則,需要先備份一下,以後恢復起來也方便,

service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]

默認保存爲 /etc/sysconfig/iptables。我們可以將這個文件再備份一下,

cp /etc/sysconfig/iptables /etc/sysconfig/iptables.x0

然後清空所有規則,從頭開始,

iptables -F

當我們完成下面的設置後,就只能通過 SSH 連接服務器,而無法 ping 通或者訪問服務器上的別的服務(如網站)了。切記不要在生產環境中玩。

2. 僅允許 SSH

下面開始設置使得服務器只接受 SSH 連接(不限制發起連接的位置),假設 SSH 使用了默認的端口 22.

使用下面的規則,讓服務器接受所有通過 22 號端口進入的連接。

iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT

上面的指令中包含了 4 個部分:

  • “-A INPUT” – 表示我們要在 INPUT 鏈的最後增加後面的規則。所以這條規則將會應用於入站的數據包。
  • “-i eth0″ – 表示檢查通過 eth0 接口進入的數據包,看看是否匹配此規則。
  • “-p tcp –dport 22″ – 該規則針對的是 TCP 數據包,並且使用了 -p 參數的選項 “–dport 22″ 來指定該規則針對的是要發送到服務器 22 號端口(即 SSH 端口)的數據包。
  • “-j ACCEPT” – 跳轉到 ACCEPT,即接受滿足這些匹配規則的數據包的傳輸。

用普通話來講,上面的規則就是說:所有從 eth0 接口傳入的 SSH 連接都接受。

3. 丟棄所有其它包

指明瞭系統可以接受的連接之後,一般要設置一條“丟棄”規則,將所有那些沒有打算接受的數據包統統拋棄。

這樣的規則應該放到 INPUT 鏈的最末位置。

要丟棄所有數據包(因爲在剛纔的那條接受 SSH 連接的規則的後面,所以不會影響到剛纔那條規則),使用下面的命令添加規則,

iptables -A INPUT -j DROP

4. 查看 SSH 規則和測試

要查看剛纔添加的規則,使用命令 iptables -L,下面同時給了該命令的輸出結果。

# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh
DROP       all  --  anywhere             anywhere

從上面的結果可以看到,規則是按照我們輸入的順序排列的,

  • 第一條接受所有傳入的 SSH 連接;
  • 第二條丟棄所有剩下(與第一條不匹配)的數據包。

如果不想一條條的從命令行輸入這些規則命令,最好創建一個腳本文件(shell script)來包含所有規則,然後自動執行。例如,

# vi iptables.sh
iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -j DROP

# sh -x iptables.sh
+ iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT
+ iptables -A INPUT -j DROP

# iptables -L INPUT
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh
DROP       all  --  anywhere             anywhere

看了上面的 iptables 命令及其參數/選項之後,應該就可以看懂我的 VPS 安全策略中的 iptables 設置了。

上面的介紹針對的是 iptables,也就是針對 IPv4 的防火牆。IPv6 的與之類似,不過 IPv6 的防火牆是 ip6tables。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章