iptables講義
一.概述
二.語法
三.實例分析
四.網管策略
五.使用總則
六.實戰
一.概述
防火牆的典型設置是有兩個網卡,一個流入,一個流出,iptables讀取流入和流出的的數據報的頭,然後將他們與規劃集(ruleset)相比較,然後將可接受的數據包從一個網卡轉發至另一個網卡,對於被拒絕的數據包,可以被丟棄或者按照你所定義的方式進行處理.
二.語法
1.鏈和表 以及規則
A.表:
filter:iptables默認的表,主要用於包過濾.
nat:nat表的主要用處是網絡地址轉換,即Network Address Translation,縮寫爲NAT。做過NAT操作的數據包的地址就被改變了,當然這種改變是根據我們的規則進行的。屬於一個流的包只會經過這個表一次。
manage:主要用於對指定的包進行修改,因爲某些特應用可能需要去改寫數據包的一些傳輸特性,如更改數據包的TTL和TOS等, 不過在實際應用中訪表的使用率不高.
B.規則(rules)
rules:就是網絡管理員預定的條件,這些規則分別指定了源地址,目的地址,傳輸協議(tcp,udp,icmp),和服務類開型(HTTP,FTP,SMTP)定義一些動作:acccept,reject,drop.
C.鏈
INPUT:位於filter表,匹配目的IP是本機的數據包.
FORWARD:位於filter表,匹配穿過本機的數據包.
PREROUTING:位於nat表,用於修改目的地址DNAT
POSTROUTING:位於nat表,用於修改源地址SNAT
D.語法概述
iptables -t [要操作的表]
[操作命令]
[規則號碼]
[匹配條件]
[-j 匹配到以後的動作]
E.命令概述
a.操作命令.(-A -I -F -D -R -P)
b.查看命令.(-[vnx]L)
a-1. -A(鏈名)
APPEND,追加1條規則,(放到最後)例如:
iptables -t filter -A INPUT -j DROP
在filter 表的INPUT 鏈裏追加一條規則(作爲最後一條規則)匹配所有訪問本機IP 的數據包,匹配到的丟棄.
a-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),否則報錯.
a-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、按內容匹配刪除時,確保規則存在,否則報錯
a-4. -R
-R <鏈名> <規則號碼> <具體規則內容>
REPLACE,替換一條規則 例如:
iptables -R INPUT 3 -j ACCEPT 將原來編號爲3 的規則內容替換爲“-j ACCEPT"
注意:
確保規則號碼≤ 已有規則數,否則報錯
a-5. -P
-P <鏈名> <動作>
POLICY,設置某個鏈的默認規則 例如:
iptables -P INPUT DROP 設置filter 表INPUT 鏈的默認規則是DROP.
注意:
當數據包沒有被規則列表裏的任何規則匹配到時,按此默認規則處理。動作前面不能加–j,這也是唯一一種匹配動作前面不加–j 的情況。
a-6. -F
-F [鏈名]
FLUSH,清空規則 例如:
iptables -F INPUT 清空filter 表INPUT 鏈中的所有規則.
iptables -t nat -F PREROUTING 清空nat 表PREROUTING 鏈中的所有規則.
注意:
1、-F 僅僅是清空鏈中規則,並不影響-P 設置的默認規則
2、-P 設置了DROP 後,使用-F 一定要小心!!!
3、如果不寫鏈名,默認清空某表裏所有鏈裏的所有規則.
b-1.-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 鏈的所有規則以及詳細數字,不反解
b-2.匹配條件
£流入、流出接口(-i、-o)
£來源、目的地址(-s、-d)
£協議類型(-p)
£來源、目的端口(--sport、--dport)
b-3.按網絡接口匹配
-i <匹配數據進入的網絡接口>
例如:
-i eth0
匹配是否從網絡接口eth0 進來
-i ppp0
匹配是否從網絡接口ppp0 進來
-o 匹配數據流出的網絡接口
例如:
-o eth0
-o ppp0
b-4.按來源目的地址匹配
-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.aaa.com 匹配去往域名www.aaa.com 的數據包.
b-5.按協議類型匹配
-p <匹配協議類型>
可以是TCP、UDP、ICMP 等,也可爲空
例如:
-p tcp
-p udp
-p icmp --icmp-type 類型
ping: type 8 pong: type 0
b-6.按來源目的端口匹配
--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 參數使用.
b-7.匹配應用舉例.
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、條件寫的越多,匹配越細緻,匹配範圍越小.
b-8.動作(處理方式)
£ ACCEPT
£ DROP
£ SNAT
£ DNAT
£ MASQUERADE
b-9.
-j ACCEPT
通過,允許數據包通過本鏈而不攔截它
類似Cisco 中ACL 裏面的permit
例如:
iptables -A INPUT -j ACCEPT
允許所有訪問本機IP 的數據包通過
-j DROP
丟棄,阻止數據包通過本鏈而丟棄它
類似Cisco 中ACL 裏的deny
例如:
iptables -A FORWARD -s 192.168.80.39 -j DROP
阻止來源地址爲192.168.80.39 的數據包通過本機
-j DNAT --to IP[-IP][:端口-端口](nat 表的PREROUTING 鏈)
目的地址轉換,DNAT 支持轉換爲單IP,也支持轉換到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
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 80 /
-j DNAT --to 192.168.0.1-192.168.0.10
-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
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 /
-j SNAT --to 1.1.1.1-1.1.1.10
同上,只不過修改成一個地址池裏的IP.
-j MASQUERADE
動態源地址轉換(動態IP 的情況下使用)
例如:
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE
將源地址是192.168.0.0/24 的數據包進行地址僞裝.