iptables

Linux上常用的防火牆軟件

補充說明

iptables命令 是Linux上常用的防火牆軟件,是netfilter項目的一部分。可以直接配置,也可以通過許多前端和圖形界面配置。

語法

1iptables(選項)(參數)

選項

 1-t, --table table 對指定的表 table 進行操作, table 必須是 raw, nat,filter,mangle 中的一個。如果不指定此選項,默認的是 filter 表。
 2
 3# 通用匹配:源地址目標地址的匹配
 4-p:指定要匹配的數據包協議類型;
 5-s, --source [!] address[/mask] :把指定的一個/一組地址作爲源地址,按此規則進行過濾。當後面沒有 mask 時,address 是一個地址,比如:192.168.1.1;當 mask 指定時,可以表示一組範圍內的地址,比如:192.168.1.0/255.255.255.0。
 6-d, --destination [!] address[/mask] :地址格式同上,但這裏是指定地址爲目的地址,按此進行過濾。
 7-i, --in-interface [!] <網絡接口name> :指定數據包的來自來自網絡接口,比如最常見的 eth0 。注意:它只對 INPUT,FORWARD,PREROUTING 這三個鏈起作用。如果沒有指定此選項, 說明可以來自任何一個網絡接口。同前面類似,"!" 表示取反。
 8-o, --out-interface [!] <網絡接口name> :指定數據包出去的網絡接口。只對 OUTPUT,FORWARD,POSTROUTING 三個鏈起作用。
 9
10# 查看管理命令
11-L, --list [chain] 列出鏈 chain 上面的所有規則,如果沒有指定鏈,列出表上所有鏈的所有規則。
12
13# 規則管理命令
14-A, --append chain rule-specification 在指定鏈 chain 的末尾插入指定的規則,也就是說,這條規則會被放到最後,最後纔會被執行。規則是由後面的匹配來指定。
15-I, --insert chain [rulenum] rule-specification 在鏈 chain 中的指定位置插入一條或多條規則。如果指定的規則號是1,則在鏈的頭部插入。這也是默認的情況,如果沒有指定規則號。
16-D, --delete chain rule-specification -D, --delete chain rulenum 在指定的鏈 chain 中刪除一個或多個指定規則。
17-R num:Replays替換/修改第幾條規則
18
19# 鏈管理命令(這都是立即生效的)
20-P, --policy chain target :爲指定的鏈 chain 設置策略 target。注意,只有內置的鏈才允許有策略,用戶自定義的是不允許的。
21-F, --flush [chain] 清空指定鏈 chain 上面的所有規則。如果沒有指定鏈,清空該表上所有鏈的所有規則。
22-N, --new-chain chain 用指定的名字創建一個新的鏈。
23-X, --delete-chain [chain] :刪除指定的鏈,這個鏈必須沒有被其它任何規則引用,而且這條上必須沒有任何規則。如果沒有指定鏈名,則會刪除該表中所有非內置的鏈。
24-E, --rename-chain old-chain new-chain :用指定的新名字去重命名指定的鏈。這並不會對鏈內部造成任何影響。
25-Z, --zero [chain] :把指定鏈,或者表中的所有鏈上的所有計數器清零。
26
27-j, --jump target <指定目標> :即滿足某條件時該執行什麼樣的動作。target 可以是內置的目標,比如 ACCEPT,也可以是用戶自定義的鏈。
28-h:顯示幫助信息;

基本參數

參數 作用
-P 設置默認策略:iptables -P INPUT (DROP
-F 清空規則鏈
-L 查看規則鏈
-A 在規則鏈的末尾加入新規則
-I num 在規則鏈的頭部加入新規則
-D num 刪除某一條規則
-s 匹配來源地址IP/MASK,加歎號"!"表示除這個IP外。
-d 匹配目標地址
-i 網卡名稱 匹配從這塊網卡流入的數據
-o 網卡名稱 匹配從這塊網卡流出的數據
-p 匹配協議,如tcp,udp,icmp
--dport num 匹配目標端口號
--sport num 匹配來源端口號

命令選項輸入順序

1iptables -t 表名 <-A/I/D/R> 規則鏈名 [規則號] <-i/o 網卡名> -p 協議名 <-s 源IP/源子網> --sport 源端口 <-d 目標IP/目標子網> --dport 目標端口 -j 動作

工作機制

規則鏈名包括(也被稱爲五個鉤子函數(hook functions)):

  • INPUT鏈 :處理輸入數據包。
  • OUTPUT鏈 :處理輸出數據包。
  • FORWARD鏈 :處理轉發數據包。
  • PREROUTING鏈 :用於目標地址轉換(DNAT)。
  • POSTOUTING鏈 :用於源地址轉換(SNAT)。

防火牆的策略

防火牆策略一般分爲兩種,一種叫策略,一種叫策略,通策略,默認門是關着的,必須要定義誰能進。堵策略則是,大門是洞開的,但是你必須有身份認證,否則不能進。所以我們要定義,讓進來的進來,讓出去的出去,所以通,是要全通,而堵,則是要選擇。當我們定義的策略的時候,要分別定義多條功能,其中:定義數據包中允許或者不允許的策略,filter過濾的功能,而定義地址轉換的功能的則是nat選項。爲了讓這些功能交替工作,我們制定出了“表”這個定義,來定義、區分各種不同的工作功能和處理方式。

我們現在用的比較多個功能有3個:

  1. filter 定義允許或者不允許的,只能做在3個鏈上:INPUT ,FORWARD ,OUTPUT
  2. nat 定義地址轉換的,也只能做在3個鏈上:PREROUTING ,OUTPUT ,POSTROUTING
  3. mangle功能:修改報文原數據,是5個鏈都可以做:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

我們修改報文原數據就是來修改TTL的。能夠實現將數據包的元數據拆開,在裏面做標記/修改內容的。而防火牆標記,其實就是靠mangle來實現的。

小擴展:

  • 對於filter來講一般只能做在3個鏈上:INPUT ,FORWARD ,OUTPUT
  • 對於nat來講一般也只能做在3個鏈上:PREROUTING ,OUTPUT ,POSTROUTING
  • 而mangle則是5個鏈都可以做:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

iptables/netfilter(這款軟件)是工作在用戶空間的,它可以讓規則進行生效的,本身不是一種服務,而且規則是立即生效的。而我們iptables現在被做成了一個服務,可以進行啓動,停止的。啓動,則將規則直接生效,停止,則將規則撤銷。

iptables還支持自己定義鏈。但是自己定義的鏈,必須是跟某種特定的鏈關聯起來的。在一個關卡設定,指定當有數據的時候專門去找某個特定的鏈來處理,當那個鏈處理完之後,再返回。接着在特定的鏈中繼續檢查。

注意:規則的次序非常關鍵,誰的規則越嚴格,應該放的越靠前,而檢查規則的時候,是按照從上往下的方式進行檢查的。

表名包括:

  • raw :高級功能,如:網址過濾。
  • mangle :數據包修改(QOS),用於實現服務質量。
  • nat :地址轉換,用於網關路由器。
  • filter :包過濾,用於防火牆規則。

動作包括:

  • ACCEPT :接收數據包。
  • DROP :丟棄數據包。
  • REDIRECT :重定向、映射、透明代理。
  • SNAT :源地址轉換。
  • DNAT :目標地址轉換。
  • MASQUERADE :IP僞裝(NAT),用於ADSL。
  • LOG :日誌記錄。
  • SEMARK : 添加SEMARK標記以供網域內強制訪問控制(MAC)
 1                             ┏╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍┓
 2 ┌───────────────┐           ┃    Network    ┃
 3 │ table: filter │           ┗━━━━━━━┳━━━━━━━┛
 4 │ chain: INPUT  │◀────┐             │
 5 └───────┬───────┘     │             ▼
 6         │             │   ┌───────────────────┐
 7  ┌      ▼      ┐      │   │ table: nat        │
 8  │local process│      │   │ chain: PREROUTING │
 9  └             ┘      │   └─────────┬─────────┘
10         │             │             │
11         ▼             │             ▼              ┌─────────────────┐
12┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅    │     ┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅      │table: nat       │
13 Routing decision      └───── outing decision ─────▶│chain: PREROUTING│
14┅┅┅┅┅┅┅┅┅┳┅┅┅┅┅┅┅┅┅          ┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅      └────────┬────────┘
15         │                                                   │
16         ▼                                                   │
17 ┌───────────────┐                                           │
18 │ table: nat    │           ┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅               │
19 │ chain: OUTPUT │    ┌─────▶ outing decision ◀──────────────┘
20 └───────┬───────┘    │      ┅┅┅┅┅┅┅┅┳┅┅┅┅┅┅┅┅
21         │            │              │
22         ▼            │              ▼
23 ┌───────────────┐    │   ┌────────────────────┐
24 │ table: filter │    │   │ chain: POSTROUTING │
25 │ chain: OUTPUT ├────┘   └──────────┬─────────┘
26 └───────────────┘                   │
2728                             ┏╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍┓
29                             ┃    Network    ┃
30                             ┗━━━━━━━━━━━━━━━┛

實例

清空當前的所有規則和計數

1iptables -F  # 清空所有的防火牆規則
2iptables -X  # 刪除用戶自定義的空鏈
3iptables -Z  # 清空計數

配置允許ssh端口連接

1iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT
2# 22爲你的ssh端口, -s 192.168.1.0/24表示允許這個網段的機器來連接,其它網段的ip地址是登陸不了你的機器的。 -j ACCEPT表示接受這樣的請求

允許本地迴環地址可以正常使用

1iptables -A INPUT -i lo -j ACCEPT
2#本地圓環地址就是那個127.0.0.1,是本機上使用的,它進與出都設置爲允許
3iptables -A OUTPUT -o lo -j ACCEPT

設置默認的規則

1iptables -P INPUT DROP # 配置默認的不讓進
2iptables -P FORWARD DROP # 默認的不允許轉發
3iptables -P OUTPUT ACCEPT # 默認的可以出去

配置白名單

1iptables -A INPUT -p all -s 192.168.1.0/24 -j ACCEPT  # 允許機房內網機器可以訪問
2iptables -A INPUT -p all -s 192.168.140.0/24 -j ACCEPT  # 允許機房內網機器可以訪問
3iptables -A INPUT -p tcp -s 183.121.3.7 --dport 3380 -j ACCEPT # 允許183.121.3.7訪問本機的3380端口

開啓相應的服務端口

1iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 開啓80端口,因爲web對外都是這個端口
2iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT # 允許被ping
3iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 已經建立的連接得讓它進來

保存規則到配置文件中

1cp /etc/sysconfig/iptables /etc/sysconfig/iptables.bak # 任何改動之前先備份,請保持這一優秀的習慣
2iptables-save > /etc/sysconfig/iptables
3cat /etc/sysconfig/iptables

列出已設置的規則

iptables -L [-t 表名] [鏈名]

  • 四個表名 rawnatfiltermangle
  • 五個規則鏈名 INPUTOUTPUTFORWARDPREROUTINGPOSTROUTING
  • filter表包含INPUTOUTPUTFORWARD三個規則鏈
1iptables -L -t nat                  # 列出 nat 上面的所有規則
2#            ^ -t 參數指定,必須是 raw, nat,filter,mangle 中的一個
3iptables -L -t nat  --line-numbers  # 規則帶編號
4iptables -L INPUT
5
6iptables -L -nv  # 查看,這個列表看起來更詳細

清除已有規則

1iptables -F INPUT  # 清空指定鏈 INPUT 上面的所有規則
2iptables -X INPUT  # 刪除指定的鏈,這個鏈必須沒有被其它任何規則引用,而且這條上必須沒有任何規則。
3                   # 如果沒有指定鏈名,則會刪除該表中所有非內置的鏈。
4iptables -Z INPUT  # 把指定鏈,或者表中的所有鏈上的所有計數器清零。

刪除已添加的規則

1# 添加一條規則
2iptables -A INPUT -s 192.168.1.5 -j DROP

將所有iptables以序號標記顯示,執行:

1iptables -L -n --line-numbers

比如要刪除INPUT裏序號爲8的規則,執行:

1iptables -D INPUT 8

開放指定的端口

1iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT               #允許本地迴環接口(即運行本機訪問本機)
2iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT    #允許已建立的或相關連的通行
3iptables -A OUTPUT -j ACCEPT         #允許所有本機向外的訪問
4iptables -A INPUT -p tcp --dport 22 -j ACCEPT    #允許訪問22端口
5iptables -A INPUT -p tcp --dport 80 -j ACCEPT    #允許訪問80端口
6iptables -A INPUT -p tcp --dport 21 -j ACCEPT    #允許ftp服務的21端口
7iptables -A INPUT -p tcp --dport 20 -j ACCEPT    #允許FTP服務的20端口
8iptables -A INPUT -j reject       #禁止其他未允許的規則訪問
9iptables -A FORWARD -j REJECT     #禁止其他未允許的規則訪問

屏蔽IP

1iptables -A INPUT -p tcp -m tcp -s 192.168.0.8 -j DROP  # 屏蔽惡意主機(比如,192.168.0.8
2iptables -I INPUT -s 123.45.6.7 -j DROP       #屏蔽單個IP的命令
3iptables -I INPUT -s 123.0.0.0/8 -j DROP      #封整個段即從123.0.0.1到123.255.255.254的命令
4iptables -I INPUT -s 124.45.0.0/16 -j DROP    #封IP段即從123.45.0.1到123.45.255.254的命令
5iptables -I INPUT -s 123.45.6.0/24 -j DROP    #封IP段即從123.45.6.1到123.45.6.254的命令是

指定數據包出去的網絡接口

只對 OUTPUT,FORWARD,POSTROUTING 三個鏈起作用。

1iptables -A FORWARD -o eth0

查看已添加的規則

 1iptables -L -n -v
 2Chain INPUT (policy DROP 48106 packets, 2690K bytes)
 3 pkts bytes target     prot opt in     out     source               destination
 4 5075  589K ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0
 5 191K   90M ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:22
 61499K  133M ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:80
 74364K 6351M ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
 8 6256  327K ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0
 9
10Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
11 pkts bytes target     prot opt in     out     source               destination
12
13Chain OUTPUT (policy ACCEPT 3382K packets, 1819M bytes)
14 pkts bytes target     prot opt in     out     source               destination
15 5075  589K ACCEPT     all  --  *      lo      0.0.0.0/0            0.0.0.0/0

啓動網絡轉發規則

公網210.14.67.7讓內網192.168.188.0/24上網

1iptables -t nat -A POSTROUTING -s 192.168.188.0/24 -j SNAT --to-source 210.14.67.127

端口映射

本機的 2222 端口映射到內網 虛擬機的22 端口

1iptables -t nat -A PREROUTING -d 210.14.67.127 -p tcp --dport 2222  -j DNAT --to-dest 192.168.188.115:22

字符串匹配

比如,我們要過濾所有TCP連接中的字符串test,一旦出現它我們就終止這個連接,我們可以這麼做:

 1iptables -A INPUT -p tcp -m string --algo kmp --string "test" -j REJECT --reject-with tcp-reset
 2iptables -L
 3
 4# Chain INPUT (policy ACCEPT)
 5# target     prot opt source               destination
 6# REJECT     tcp  --  anywhere             anywhere            STRING match "test" ALGO name kmp TO 65535 reject-with tcp-reset
 7#
 8# Chain FORWARD (policy ACCEPT)
 9# target     prot opt source               destination
10#
11# Chain OUTPUT (policy ACCEPT)
12# target     prot opt source               destination

阻止Windows蠕蟲的攻擊

1iptables -I INPUT -j DROP -p tcp -s 0.0.0.0/0 -m string --algo kmp --string "cmd.exe"

防止SYN洪水攻擊

1iptables -A INPUT -p tcp --syn -m limit --limit 5/second -j ACCEPT

添加SECMARK記錄

1iptables -t mangle -A INPUT -p tcp --src 192.168.1.2 --dport 443 -j SECMARK --selctx system_u:object_r:myauth_packet_t
2# 向從 192.168.1.2:443 以TCP方式發出到本機的包添加MAC安全上下文 system_u:object_r:myauth_packet_t

更多實例

用iptables搭建一套強大的安全防護盾 http://www.imooc.com/learn/389

iptables: linux 下應用層防火牆工具

iptables 5鏈: 對應 Hook point netfilter: linux 操作系統核心層內部的一個數據包處理模塊 Hook point: 數據包在 netfilter 中的掛載點; PRE_ROUTING / INPUT / OUTPUT / FORWARD / POST_ROUTING

iptables & netfilter

iptables 4表5鏈

iptables rules

  • 4表

filter: 訪問控制 / 規則匹配 nat: 地址轉發 mangle / raw

  • 規則

數據訪問控制: ACCEPT / DROP / REJECT 數據包改寫(nat -> 地址轉換): snat / dnat 信息記錄: log

使用場景實例

  • 場景一

開放 tcp 10-22/80 端口 開放 icmp 其他未被允許的端口禁止訪問

存在的問題: 本機無法訪問本機; 本機無法訪問其他主機

  • 場景二

ftp: 默認被動模式(服務器產生隨機端口告訴客戶端, 客戶端主動連接這個端口拉取數據) vsftpd: 使 ftp 支持主動模式(客戶端產生隨機端口通知服務器, 服務器主動連接這個端口發送數據)

  • 場景三

允許外網訪問: web http -> 80/tcp; https -> 443/tcp mail smtp -> 25/tcp; smtps -> 465/tcp pop3 -> 110/tcp; pop3s -> 995/tcp imap -> 143/tcp

內部使用: file nfs -> 123/udp samba -> 137/138/139/445/tcp ftp -> 20/21/tcp remote ssh -> 22/tcp sql mysql -> 3306/tcp oracle -> 1521/tcp

  • 場景四

nat 轉發

  • 場景五

防CC攻擊

 1iptables -L -F -A -D # list flush append delete
 2# 場景一
 3iptables -I INPUT -p tcp --dport 80 -j ACCEPT # 允許 tcp 80 端口
 4iptables -I INPUT -p tcp --dport 10:22 -j ACCEPT # 允許 tcp 10-22 端口
 5iptables -I INPUT -p icmp -j ACCEPT # 允許 icmp
 6iptables -A INPUT -j REJECT # 添加一條規則, 不允許所有
 7
 8# 優化場景一
 9iptables -I INPUT -i lo -j ACCEPT # 允許本機訪問
10iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 允許訪問外網
11iptables -I INPUT -p tcp --dport 80 -s 10.10.188.233 -j ACCEPT # 只允許固定ip訪問80
12
13# 場景二
14vi /etc/vsftpd/vsftpd.conf # 使用 vsftpd 開啓 ftp 主動模式
15port_enable=yes
16connect_from_port_20=YES
17iptables -I INPUT -p tcp --dport 21 -j ACCEPT
18
19vi /etc/vsftpd/vsftpd.conf # 建議使用 ftp 被動模式
20pasv_min_port=50000
21pasv_max_port=60000
22iptables -I INPUT -p tcp --dport 21 -j ACCEPT
23iptables -I INPUT -p tcp --dport 50000:60000 -j ACCEPT
24
25# 還可以使用 iptables 模塊追蹤來自動開發對應的端口
26
27# 場景三
28iptables -I INPUT -i lo -j ACCEPT # 允許本機訪問
29iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 允許訪問外網
30iptables -I INPUT -s 10.10.155.0/24 -j ACCEPT # 允許內網訪問
31iptables -I INPUT -p tcp -m multiport --dports 80,1723 -j ACCEPT # 允許端口, 80 -> http, 1723 -> vpn
32iptables -A INPUT -j REJECT # 添加一條規則, 不允許所有
33
34iptables-save # 保存設置到配置文件
35
36# 場景四
37iptables -t nat -L # 查看 nat 配置
38
39iptables -t nat -A POST_ROUTING -s 10.10.177.0/24 -j SNAT --to 10.10.188.232 # SNAT
40vi /etc/sysconfig/network # 配置網關
41
42iptables -t nat -A POST_ROUTING -d 10.10.188.232 -p tcp --dport 80 -j DNAT --to 10.10.177.232:80 # DNAT
43
44#場景五
45iptables -I INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 100 -j REJECT # 限制併發連接訪問數
46iptables -I INPUT -m limit --limit 3/hour --limit-burst 10 -j ACCEPT # limit模塊; --limit-burst 默認爲5

來源:https://github.com/jaywcjlove/linux-command

最後修改於: Wednesday, January 31, 2024

相關文章:

翻譯: