Iptables Summary | Iptables 重點整理
iptables 是一套 Linux 下的防火牆,可以按需要建立 iptables 規則,允許或阻擋網路連線。但如果你是透過 SSH 連進主機設定 iptables 時要格外小心,因為如果設定錯誤,可能會阻擋外部連線,包括你的連線。
iptables 屬於網路層/傳輸層的防火牆,它將封包的處理分成3個tables, table中包含chains, chains 裡面包含 rules 和 policies。
3個 tables 分別是:(優先順序:filter < nat < mangle)
filter table:提供封包過濾(Filtering)功能,包含3個 chains,input、forward、output。 nat table:提供位址轉換(Network Address Translation)功能,包含3個 chains,prerouting、postrouting、output。 mangle table:提供封包改寫(Mangling)功能,包含5個 chains,prerouting、postrouting、input、output、forward。
5個 chains 分別是:
preroutong:對數據包作路由選擇前應用此鏈中的規則。(所有的數據包進來的時侯都先由這個鏈處理) input:進來的數據包應用此規則鏈中的策略 forward:轉發數據包時應用此規則鏈中的策略 output:外出的數據包應用此規則鏈中的策略 postrouting:對數據包作路由選擇後應用此鏈中的規則。(所有的數據包出來的時侯都先由這個鏈處理)
chains 之間的優先順序,有三種情況:
第一種情況:入站數據流向 從外界到達防火牆的數據包,先被PREROUTING規則鏈處理(是否修改數據包地址等),之後會進行路由選擇(判斷該數據包應該發往何處),如果數據包的目標主機是防火牆本機(比如說Internet用戶訪問防火牆主機中的web伺服器的數據包),那麼內核將其傳給INPUT鏈進行處理(決定是否允許通過等),通過以後再交給系統上層的應用程式(比如Apache伺服器)進行響應。
第二種情況:轉發數據流向 來自外界的數據包到達防火牆後,首先被PREROUTING規則鏈處理,之後會進行路由選擇,如果數據包的目標地址是其它外部地址(比如區域網用戶通過網關訪問QQ站點的數據包),則內核將其傳遞給FORWARD鏈進行處理(是否轉發或攔截),然後再交給POSTROUTING規則鏈(是否修改數據包的地址等)進行處理。
第三種情況:出站數據流向 防火牆本機向外部地址發送的數據包(比如在防火牆主機中測試公網DNS伺服器時),首先被OUTPUT規則鏈處理,之後進行路由選擇,然後傳遞給POSTROUTING規則鏈(是否修改數據包的地址等)進行處理。
Iptables 的基本語法格式:
table 需小寫 | command | chain 需大寫 | parameter 需小寫 | target 需大寫 | |
iptables | -t filter | -A 在指定鏈的末尾添加(append) 一條新的規則 | PREROUTING 在進入路由之前進行的工作 | -p 協定可以是tcp, udp, icmp | ACCEPT 允許數據包通過 |
-t nat | -D 刪除(delete)指定鏈中的某一條規則,可以按規則序號和內容刪除 | INPUT 封包為輸入主機的方向 | -s 來源封包的 IP 或者是 Network ( 網域 ) | DROP 直接丟棄數據包,不給任何回應信息 | |
-t mangle | -I 在指定鏈中插入(insert)一條新的 規則,默認在第一行添加 | FORWARD 封包為不進入主機而向外再傳輸出去的方向 | -d 目標主機的 IP 或者是 Network ( 網域 ) | REJECT 拒絕數據包通過,必要時會給數據發送端一個響應的信息 | |
-R 修改、替換(replace)指定鏈中的某 一條規則,可以按規則序號和內容替換 | OUTPUT 封包為輸出主機的方向 | -i 設定『封包進入』的網路卡介面 | SNAT 改變封包來源IP欄位的值(nat, POST) | ||
-L 列出(list)指定鏈中所有的規則進行查看 | POSTROUTING 在進入路由之後進行的工作 | -o 設定『封包流出』的網路卡介面 | DNAT 改變封包目標IP欄位的值(nat, PRE,O) | ||
-F 清空(flush) | –sport 來源封包的 port 號碼 | MASQUERADE 動態的根據路由,來修改 Source Socket(nat, POST) | |||
-N 新建(new chain)一條用戶自己定義的規則鏈 | –dport 目標主機的 port 號碼 | LOG 將這條匹配消息保存到系統日誌中 /var/log/messages | |||
-X 刪除指定表中用戶自定義的規則鏈(delete-chain) | -n 代表避開dns反查,這樣會直接列IP速度也比較快 | ||||
-P 設置指定鏈的默認策略(policy) | -j 動作 | ||||
-Z 將所有的 chain 的計數與流量統計都歸零 | -m state 連線類型(ESTABLISHED, INVALID) | ||||
-V 查看版本(version) | -v 查看規則表詳細信息(verbose)的信息 | ||||
範例
顯示 filter table 的設定
$> sudo iptables -L -n Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination # 仔細看到上面,因為沒有加上 -t 的參數,所以預設就是 filter 這個表格, # 在這個表格當中有三條鏈,分別是 INPUT, OUTPUT 與 FORWARD ,而且因為 # 沒有規則,所以規則裡面都是空的!同時注意一下,在每個 chain 的後面 () # 裡面,會發現有 policy 對吧!那就是『預設動作(政策)』!以上面來看, # 雖然我們啟動了 iptables ,但是我們沒有設定規則,然後政策又是 ACCEPT, # 所以『任何封包都會接受』的意思喔!
拒絕進入防火牆的所有ICMP協議數據包
$> sudo iptables -I INPUT -p icmp -j REJECT
允許防火牆轉發除ICMP協議以外的所有數據包
$> sudo iptables -A FORWARD -p ! icmp -j ACCEPT # 使用『!』可以將條件取反
允許轉發來自192.168.0.0/24網段的數據,但拒絕轉發來自192.168.1.11主機的數據
$> sudo iptables -A FORWARD -s 192.168.1.11 -j REJECT # 注意要把拒絕192.168.1.11放在前面不然就不起作用了啊 $> sudo iptables -A FORWARD -s 192.168.0.0/24 -j ACCEPT
丟棄從外網接口(eth1)進入防火牆本機的源地址為私網地址的數據包
$> sudo iptables -A INPUT -i eth1 -s 192.168.0.0/16 -j DROP $> sudo iptables -A INPUT -i eth1 -s 172.16.0.0/12 -j DROP $> sudo iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
封堵網段(192.168.1.0/24),兩小時後解封
$> sudo iptables -I INPUT -s 192.168.1.0/24 -j DROP $> sudo iptables -I FORWARD -s 192.168.1.0/24 -j DROP $> at now +2 hours at> sudo iptables -D INPUT 1 at> sudo iptables -D FORWARD 1
只允許管理員從202.13.0.0/16網段使用SSH遠程登錄防火牆主機
$> sudo iptables -A INPUT -p tcp --dport 22 -s 202.13.0.0/16 -j ACCEPT $> sudo iptables -A INPUT -p tcp --dport 22 -j DROP
允許本機開放從TCP埠20-1024提供的應用服務
$> sudo iptables -A INPUT -p tcp --dport 20:1024 -j ACCEPT $> sudo iptables -A OUTPUT -p tcp --sport 20:1024 -j ACCEPT
允許轉發來自192.168.0.0/24區域網段的DNS解析請求數據包
$> sudo iptables -A FORWARD -s 192.168.0.0/24 -p udp --dport 53 -j ACCEPT $> sudo iptables -A FORWARD -d 192.168.0.0/24 -p udp --sport 53 -j ACCEPT
禁止其他主機ping防火牆主機,但是允許從防火牆上ping其他主機
$> sudo iptables -I INPUT -p icmp --icmp-type Echo-Request -j DROP $> sudo iptables -I INPUT -p icmp --icmp-type Echo-Reply -j ACCEPT $> sudo iptables -I INPUT -p icmp --icmp-type destination-Unreachable -j ACCEPT
禁止轉發來自MAC地址為00:0C:29:27:55:3F的和主機的數據包
$> sudo iptables -A FORWARD -m mac --mac-source 00:0C:29:27:55:3F -j DROP #『-m mac –mac-source』來表示數據包的源MAC地址
允許防火牆本機對外開放TCP埠20、21、25、110以及被動模式FTP埠 1250-1280
$> sudo iptables -A INPUT -p tcp -m multiport --dport 20,21,25,110,1250:1280 -j ACCEPT #『-m multiport –dport』來指定目的埠及範圍
禁止轉發源IP位址為192.168.1.20-192.168.1.99的TCP數據包
$> sudo iptables -A FORWARD -p tcp -m iprange --src-range 192.168.1.20- 192.168.1.99 -j DROP #『-m –iprange –src-range』指定IP範圍
禁止轉發與正常TCP連接無關的非—syn請求數據包
$> sudo iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP # 「-m state」表示數據包的連接狀態,「NEW」表示與任何連接無關 的,新的嘛!
拒絕訪問防火牆的新數據包,但允許響應連接或與已有連接相關的數據包
$> sudo iptables -A INPUT -p tcp -m state --state NEW -j DROP $> sudo iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT #「ESTABLISHED」表示已經響應請求或者已經建立連接的數據包, 「RELATED」表示與已建立的連接有相關性的,比如FTP數據連接等
只開放本機的web服務(80)、FTP(20、21、20450-20480),放行外部 主機發住伺服器其它埠的應答數據包,將其他入站數據包均予以丟棄處理
$> sudo iptables -I INPUT -p tcp -m multiport --dport 20,21,80 -j ACCEPT $> sudo iptables -I INPUT -p tcp --dport 20450:20480 -j ACCEPT $> sudo iptables -I INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT $> sudo iptables -P INPUT DROP
IP 偽裝:使內部網路的封包經過偽裝之後,使用對外的 eth0 網卡當作代表號,對外連線(內部對外轉址)
$> sudo iptables -t nat -A POSTROUTING -o eth0 -s 172.16.0.0/16 -j SNAT --to-source 163.26.1.101 #把 172.16.0.0/16 這個網段,偽裝成 163.26.1.161 出去