天天看點

linux防火牆iptables詳細教程

 2.1 架構圖

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

 mangle     |     mangle     ^ mangle

   nat       |     filter     | nat

           |               |

           v               |

         INPUT           OUTPUT

           | mangle         ^ mangle

           | filter         | nat

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

2.2 鍊和表

     filter:   顧名思義,用于過濾的時候

     nat:      顧名思義,用于做 NAT 的時候

                NAT:Network Address Translator

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

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

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

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

3.1 iptables 文法概述

iptables [-t 要操作的表]

     <操作指令>

     [要操作的鍊]

     [規則号碼]

     [比對條件]

     [-j 比對到以後的動作]

3.2 指令概述

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

檢視指令(-[vnx]L)

3.2.1 -A

-A <鍊名>

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

例如:

 iptables -t filter -A INPUT -j DROP

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

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

3.2.2 -I

-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),否則報錯

3.2.3 -D

-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、按内容比對删除時,確定規則存在,否則報錯

3.2.3 -R

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

 REPLACE,替換一條規則

 iptables -R INPUT 3 -j ACCEPT

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

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

3.2.4 -P

-P <鍊名> <動作>

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

 iptables -P INPUT DROP

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

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

3.2.5 -F

-F [鍊名]

 FLUSH,清空規則

 iptables -F INPUT

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

 iptables -t nat -F PREROUTING

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

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

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

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

3.2.6 -[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 鍊的所有規則以及詳細數字,不反解

3.3 比對條件

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

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

協定類型     (-p)

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

3.3.1 按網絡接口比對

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

 -i eth0

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

 -i ppp0

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

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

 -o eth0

 -o ppp0

3.3.2 按來源目的位址比對

-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.4.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-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 僅僅是用一定的速率去比對資料包,并非 “限制”,(deven:要想限制必須把後面那句加上 )

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

學會寫簡單的腳本

6. FAQ.1

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 參數

6. FAQ.2

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

6. FAQ.3

繼續閱讀