天天看點

iptables備忘錄

不知道是哪位高人總結的iptables文檔。在此謝謝了。寫下來備忘。

 先來看下資料包的流程。

-->PREROUTING-->[ROUTE]-->FORWARD------->POSTROUTING-->出

     mangle(1)        |   mangle(1)      |    mangle(1)                     ^

      nat(2)         |    filter(2)          |    nat(2)

                   |                         |

                   v                         |

                 INPUT                     OUTPUT

                   | mangle(1)               ^ filter(3)

                   | filter(2)              |  nat (2)                                              

                   v ------>local--------->|  mangle (1)

--------------------------------------------------------------------------------

如果不考慮mangle表 如下

     nat           |       filter            ^ nat

                   |                         | 

                   |                         ^ filter(2)

                   | filter                  |  nat (1)

                   v ------>local----------->| 

鍊和表

filter      用于過濾的時候

nat         用于做NAT的時候

INPUT           位于filter表,比對目的ip是本機的資料包

OUTPUT          位于filter表,比對源ip是本機的資料包

FORWARD         位于filter表,比對穿過本機的資料包

PREROUTING      位于nat表,用于修改目的位址(DNAT)

POSTROUTING     位于nat表,用于修改源位址(SNAT)

iptables文法

iptables [-t 要操作的表] 操作指令 [要操作的鍊] [規則号碼] [比對條件] [-j 比對到以後的動作]

指令概述

·操作指令 (-A、-I、-D、-R、-P、-F)

·檢視指令 (-[vnx]L)

-A 鍊名

APPEND 追加一條規則(放到最後)

例如:

iptables -t filter -A INPUT -j DROP

在 filter 表的 INPUT 鍊裡追加一條規則(作為最後一條規則)

    比對所有通路本機 IP 的資料包,比對到的丢棄

-I 鍊名 [規則号碼]

    INSERT,插入一條規則

例如:

    iptables -I INPUT -j DROP

    在 filter 表的 INPUT 鍊裡插入一條規則(插入成第 1 條)

    iptables -I INPUT 3 -j DROP

    在 filter 表的 INPUT 鍊裡插入一條規則(插入成第 3 條)

注意: 1、-t filter 可不寫,不寫則自動預設是 filter 表

       2、-I 鍊名 [規則号碼],如果不寫規則号碼,則預設是 1

       3、確定規則号碼 ≤ (已有規則數 + 1),否則報錯

-D 鍊名 <規則号碼 | 具體規則内容>

    DELETE,删除一條規則

    iptables -D INPUT 3(按号碼比對)

    删除 filter 表 INPUT 鍊中的第三條規則(不管它的内容是什麼)

    iptables -D INPUT -s 192.168.0.1 -j DROP(按内容比對)

    删除 filter 表 INPUT 鍊中内容為“-s 192.168.0.1 -j DROP”的規則

   (不管其位置在哪裡)

注意:

    1、若規則清單中有多條相同的規則時,按内容比對隻删除序号最小的一條

    2、按号碼比對删除時,確定規則号碼 ≤ 已有規則數,否則報錯

    3、按内容比對删除時,確定規則存在,否則報錯

-R 鍊名 規則号碼具體規則内容

    REPLACE,替換一條規則

    iptables -R INPUT 3 -j ACCEPT

    将原來編号為 3 的規則内容替換為“-j ACCEPT”

    確定規則号碼 ≤ 已有規則數,否則報錯

-P 鍊名 動作

    POLICY,設定某個鍊的預設規則

    iptables -P INPUT DROP

    設定 filter 表 INPUT 鍊的預設規則是 DROP

    當資料包沒有被規則清單裡的任何規則比對到時,按此預設規則處理

-F [鍊名]

    FLUSH,清空規則

    iptables -F INPUT

    清空 filter 表 INPUT 鍊中的所有規則

    iptables -t nat -F PREROUTING

    清空 nat 表 PREROUTING 鍊中的所有規則

    1、-F 僅僅是清空鍊中規則,并不影響 -P 設定的預設規則

    2、-P 設定了 DROP 後,使用 -F 一定要小心!!!

    3、如果不寫鍊名,預設清空某表裡所有鍊裡的所有規則

-[vxn]L

-L 列出規則

    LIST,列出規則

    v:顯示詳細資訊,包括每條規則的比對包數量和比對位元組數

    x:在 v 的基礎上,禁止自動機關換算(K、M)

    n:隻顯示 IP 位址和端口号碼,不顯示域名和服務名稱

    iptables -L

    粗略列出 filter 表所有鍊及所有規則

    iptables -t nat -vnL

    用詳細方式列出 nat 表所有鍊的所有規則,隻顯示 IP 位址和端口号

    iptables -t nat -vxnL PREROUTING

    用詳細方式列出 nat 表 PREROUTING 鍊的所有規則以及詳細數字,不反解

比對條件

·流入、流出接口(-i、-o)

·來源、目的位址(-s、-d)

·協定類型       (-p)

·來源、目的端口(--sport、--dport)

按網絡接口比對

-i 比對資料進入的網絡接口

-i eth0

比對是否從網絡接口eth0進來

-i ppp0

比對是否從網絡接口ppp0進來

-o 比對資料流出的網絡接口

-o eth0

-o ppp0

按來源目的位址比對

-s 比對來源位址,可以是IP、NET、DOMAIN,也可空(任何)

    -s 192.168.0.1      比對來自 192.168.0.1 的資料包

    -s 192.168.1.0/24   比對來自 192.168.1.0/24 網絡的資料包

    -s 192.168.0.0/16   比對來自 192.168.0.0/16 網絡的資料包

-d:比對目的位址,可以是 IP、NET、DOMAIN,也可以空

    -d 202.106.0.20     比對去往 202.106.0.20 的資料包

    -d 202.106.0.0/16   比對去往 202.106.0.0/16 網絡的資料包

    -d www.abc.com      比對去往域名 www.abc.com 的資料包

按協定類型比對

3.3.3 按協定類型比對

-p:比對協定類型

    可以是 TCP、UDP、ICMP 等,也可為空

    -p tcp

    -p udp

    -p icmp --icmp-type 類型

    ping: type 8       pong: type 0

3.3.4 按來源目的端口比對

--sport:比對源端口,可以是個别端口,可以是端口範圍

    --sport 1000        比對源端口是 1000 的資料包

    --sport 1000:3000   比對源端口是 1000-3000 的資料包(含1000、3000)

    --sport :3000       比對源端口是 3000 以下的資料包(含 3000)

    --sport 1000:       比對源端口是 1000 以上的資料包(含 1000)

--dport:比對目的端口,可以是個别端口,可以是端口範圍

    --dport 80          比對源端口是 80 的資料包

    --dport 6000:8000   比對源端口是 6000-8000 的資料包(含6000、8000)

    --dport :3000       比對源端口是 3000 以下的資料包(含 3000)

    --dport 1000:       比對源端口是 1000 以上的資料包(含 1000)

    --sport 和 --dport 必須配合 -p 參數使用

3.3.5 比對應用舉例

1、端口比對

-p udp --dport 53

比對網絡中目的位址是 53 的 UDP 協定資料包

2、位址比對

-s 10.1.0.0/24 -d 172.17.0.0/16

比對來自 10.1.0.0/24 去往 172.17.0.0/16 的所有資料包

3、端口和位址聯合比對

-s 192.168.0.1 -d www.abc.com -p tcp --dport 80

比對來自 192.168.0.1,去往 www.abc.com 的 80 端口的 TCP 協定資料包

1、--sport、--dport 必須聯合 -p 使用,必須指明協定類型是什麼

2、條件寫的越多,比對越細緻,比對範圍越小

3.4 動作(處理方式)

ACCEPT

DROP

SNAT

DNAT

MASQUERADE

3.4.1 -j ACCEPT

-j ACCEPT

    通過,允許資料包通過本鍊而不攔截它

    類似 Cisco 中 ACL 裡面的 permit

    iptables -A INPUT -j ACCEPT

    允許所有通路本機 IP 的資料包通過

3.4.2 -j DROP

-j DROP

    丢棄,阻止資料包通過本鍊而丢棄它

    類似 Cisco 中 ACL 裡的 deny

    iptables -A FORWARD -s 192.168.80.39 -j DROP

     阻止來源位址為 192.168.80.39 的資料包通過本機

3.4.3 -j SNAT

-j SNAT --to IP[-IP][:端口-端口](nat 表的 POSTROUTING 鍊)

    源位址轉換,SNAT 支援轉換為單 IP,也支援轉換到 IP 位址池

   (一組連續的 IP 位址)

iptables -t nat -A POSTROUTING -s 192.168.0.0/24

    -j SNAT --to 1.1.1.1

将内網 192.168.0.0/24 的原位址修改為 1.1.1.1,用于 NAT

    -j SNAT --to 1.1.1.1-1.1.1.10

同上,隻不過修改成一個位址池裡的 IP

3.4.4 -j DNAT

-j DNAT --to IP[-IP][:端口-端口](nat 表的 PREROUTING 鍊)

    目的位址轉換,DNAT 支援轉換為單 IP,也支援轉換到 IP 位址池

iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 80

    -j DNAT --to 192.168.0.1

把從 ppp0 進來的要通路 TCP/80 的資料包目的位址改為 192.168.0.1

iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 81

    -j DNAT --to 192.168.0.2:80

    -j DNAT --to 192.168.0.1-192.168.0.10

3..5 -j MASQUERADE

-j MASQUERADE

動态源位址轉換(動态 IP 的情況下使用)

    iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE

    将源位址是 192.168.0.0/24 的資料包進行位址僞裝

3.5 附加子產品

按包狀态比對    (state)

按來源 MAC 比對(mac)

按包速率比對    (limit)

多端口比對      (multiport)

3.5.1 state

-m state --state 狀态

狀态:NEW、RELATED、ESTABLISHED、INVALID

      NEW:有别于 tcp 的 syn

      ESTABLISHED:連接配接态

      RELATED:衍生态,與 conntrack 關聯(FTP)

      INVALID:不能被識别屬于哪個連接配接或沒有任何狀态

    iptables -A INPUT -m state --state RELATED,ESTABLISHED

         -j ACCEPT

3.5.2 mac

-m mac --mac-source MAC

比對某個 MAC 位址

   iptables -A FORWARD -m mac --mac-source xx:xx:xx:xx:xx:xx

        -j DROP

   阻斷來自某 MAC 位址的資料包,通過本機

   MAC 位址不過路由,不要試圖去比對路由後面的某個 MAC 位址

3.5.3 limit

-m limit --limit 比對速率 [--burst 緩沖數量]

    用一定速率去比對資料包

   iptables -A FORWARD -d 192.168.0.1 -m limit --limit 50/s

        -j ACCEPT

   iptables -A FORWARD -d 192.168.0.1 -j DROP

   limit 僅僅是用一定的速率去比對資料包,并非 “限制”

3.5.4 multiport

-m multiport <--sports|--dports|--ports> 端口1[,端口2,..,端口n]

一次性比對多個端口,可以區分源端口,目的端口或不指定端口

   iptables -A INPUT -p tcp -m multiports --ports

       21,22,25,80,110 -j ACCEPT

    必須與 -p 參數一起使用   

4. 執行個體分析

單伺服器的防護

如何做網關

如何限制内網使用者

内網如何做對外伺服器

連接配接追蹤子產品

4.1 單伺服器的防護

弄清對外服務對象

書寫規則

    網絡接口 lo 的處理

    狀态監測的處理

    協定 + 端口的處理

執行個體:一個普通的 web 伺服器

iptables -A INPUT -i lo -j ACCEPT

iptables -A INPUT -p tcp -m multiport 22,80 -j ACCEPT

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

iptables -P INPUT DROP

注意:確定規則循序正确,弄清邏輯關系,學會時刻使用 -vnL

4.2 如何做網關

弄清網絡拓撲

本機上網

設定 nat

    啟用路由轉發

    位址僞裝 SNAT/MASQUERADE

執行個體:ADSL 撥号上網的拓撲

echo "1" > /proc/sys/net/ipv4/ip_forward

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp0

    -j MASQUERADE

4.3 如何限制内網使用者

過濾位置 filer 表 FORWARD 鍊

比對條件 -s -d -p --s/dport

處理動作 ACCEPT DROP

執行個體:

iptables -A FORWARD -s 192.168.0.3 -j DROP

iptables -A FORWARD -m mac --mac-source 11:22:33:44:55:66

    -j DROP

iptables -A FORWARD -d bbs.chinaunix.net -j DROP

4.4 内網如何做對外伺服器

服務協定(TCP/UDP)

對外服務端口

内部伺服器私網 IP

内部真正服務端口

    -j DNAT --to 192.168.1.1

    -j DNAT --to 192.168.1.2:80

4.5 連接配接追蹤子產品

為什麼要使用連接配接追蹤子產品

    FTP 協定的傳輸原理

    傳統防火牆的做法

如何使用

4.5.1 FTP 協定傳輸原理

使用端口

    command port

    data port

傳輸模式

    主動模式(ACTIVE)

    被動模式(PASSIVE)

主動模式

             client              server

          xxxx |---|----------|-->| 21

          yyyy |<--|----------|---| 20

                  FW1         FW2

被動模式

          xxxx |---|----------|--->| 21

          yyyy |---|----------|--->| zzzz

4.5.2 傳統防火牆的做法

隻使用主動模式,打開 TCP/20

防火牆打開高範圍端口

配置 FTP 服務,減小被動模式端口範圍

4.5.3 如何使用連接配接追蹤子產品

modprobe ipt_conntrack_ftp

modprobe ipt_nat_ftp

iptables -A INPUT -p tcp --dport 21 -j ACCEPT

iptables -A INPUT -m state --state

    RELATED,ESTABLISHED -j ACCEPT

5. 網管政策

怕什麼

能做什麼

讓什麼 vs 不讓什麼

三大“紀律”五項“注意”

其他注意事項

5.1 必加項

echo "1" > /proc/sys/net/ipv4/tcp_syncookies

echo "1" >

    /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses

modprobe ip_conntrack_ftp

modprobe ip_nat_ftp

5.2 可選方案

堵:

iptables -A FORWARD -p tcp --dport xxx -j DROP

iptables -A FORWARD -p tcp --dport yyy:zzz -j DROP

通:

iptables -A FORWARD -p tcp --dport xxx -j ACCEPT

iptables -A FORWARD -p tcp --dport yyy:zzz -j ACCEPT

iptables -A FORWARD -m state --state RELATED,ESTABLISHED

    -j ACCEPT

iptables -P FORWARD DROP

5.3 三大“紀律”五項“注意”

三大“紀律”——專表專用

    filter

    nat

    mangle

五項“注意”——注意資料包的走向

    PREROUTING

    INPUT

    FORWARD

    OUTPUT

    POSTROUTING

5.4 其他注意事項

養成好的習慣

    iptables -vnL

    iptables-save

注意邏輯順序

    iptables -A INPUT -p tcp --dport xxx -j ACCEPT

    iptables -I INPUT -p tcp --dport yyy -j ACCEPT

學會寫簡單的腳本

FAQ

Q:我設定了 iptables -A OUTPUT -d 202.xx.xx.xx -j DROP

   為何内網使用者還是可以通路那個位址?

A:filter 表的 OUTPUT 鍊是本機通路外面的必經之路,内網資料不經過該鍊

Q:我添加了 iptables -A FORWARD -d 202.xx.xx.xx -j DROP

A:檢查整個規則是否存在邏輯錯誤,看是否在 DROP 前有 ACCEPT

Q:iptables -t nat -A POSTROUTING -i eth1 -o eth2 -j MASQUERADE

   這條語句為何報錯?

A:POSTROUTING 鍊不支援“流入接口” -i 參數

   同理,PREROUTING 鍊不支援“流出接口” -o 參數

Q:我應該怎麼檢視某個子產品具體該如何使用?

A:ipitables -m 子產品名 -h

Q:執行 iptables -A FORWARD -m xxx -j yyy

   提示 iptables: No chain/target/match by that name

A:/lib/modules/`uname -r`/kernel/net/ipv4/netfilter 目錄中,

   缺少與 xxx 子產品有關的檔案,或缺少與 yyy 動作有關的檔案

   名字為 ipt_xxx.o(2.4核心)或 ipt_yyy.ko(2.6核心)

Q:腳本寫好了,内網上網沒問題,FTP 通路不正常,無法列出目錄,為什麼?

A:缺少 ip_nat_ftp 這個子產品,modprobe ip_nat_ftp

繼續閱讀