Iptables

iptables命令、規則、參數詳解

表    (table)
包含4個表:
4個表的優先級由高到低:raw-->mangle-->nat-->filter
raw---RAW表只使用在PREROUTING鏈和OUTPUT鏈上,因爲優先級最高,從而可以對收到的數據包在連接跟蹤前進行處理。一但用戶使用了RAW表,在某個鏈上,RAW表處理完後,將跳過NAT表和ip_conntrack處理,即不再做地址轉換和數據包的鏈接跟蹤處理了.
filter---這個規則表是預設規則表,擁有 INPUT、FORWARD 和 OUTPUT 三個規則鏈,這個規則表顧名思義是用來進行封包過濾的理動作
net----此規則表擁有prerouting和postrouting兩個規則鏈, 主要功能爲進行一對一、一對多、多對多等網址轉譯工作(SNATDNAT)
mangle--此規則表擁有prerouting、FORWARD、postrouting三個規則鏈,除了進行網址轉譯工作會改寫封包外,在某些特殊應用可能也必須去改寫封包(ITL、TOS)或者是設定MARK(將封包作記號,以進行後續的過濾)這時就必須將這些工作定義在mangles規則表中

常用命令:
-A 追加規則-->iptables -A INPUT
-D 刪除規則-->iptables -D INPUT 1(編號)
-R 修改規則-->iptables -R INPUT 1 -s 192.168.12.0 -j DROP 取代現行規則,順序不變(1是位置)
-I 插入規則-->iptables -I INPUT 1 --dport 80 -j ACCEPT 插入一條規則,原本位置上的規則將會往後移動一個順位
-L 查看規則-->iptables -L INPUT 列出規則鏈中的所有規則
-N 新的規則-->iptables -N allowed 定義新的規則

通用參數:
-p 協議  例:iptables -A INPUT -p tcp
-s源地址 例:iptables -A INPUT -s 192.168.1.1
-d目的地址 例:iptables -A INPUT -d 192.168.12.1
-sport源端口 例:iptables -A INPUT -p tcp --sport 22
-dport目的端口 例:iptables -A INPUT -p tcp --dport 22
-i指定入口網卡 例:iptables -A INPUT -i eth0
-o指定出口網卡 例:iptables -A FORWARD -o eth0

-j 指定要進行的處理動作
常用的ACTION:
DROP:丟棄
REJECT:明示拒絕
ACCEPT:接受
SNAT基於原地址的轉換
source--指定原地址
    比如我們現在要將所有192.168.10.0網段的IP在經過的時候全都轉換成172.16.100.1這個假設出來的外網地址:
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 172.16.100.1(外網有效ip)
這樣,只要是來自本地網絡的試圖通過網卡訪問網絡的,都會被統統轉換成172.16.100.1這個IP.
MASQUERADE(動態僞裝)--家用帶寬獲取的外網ip,就是用到了動態僞裝
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j MASQUERADE
DNAT目標地址轉換
destination-指定目標地址
iptables -t nat -A PREROUTING -d 192.168.10.18 -p tcp --dport 80 -j DNAT --to-destination 172.16.100.2
10.18訪問80端口轉換到100.2上
MASQUERADE:源地址僞裝
REDIRECT:重定向:主要用於實現端口重定向
MARK:打防火牆標記的
RETURN:返回 在自定義鏈執行完畢後使用返回,來返回原規則鏈。

鏈    (chain)
每個表都有自己的一組內置鏈,可以對鏈進行自定義,這樣就可以建立一組規則,
filter表中的input、output和forward鏈

匹配(match)
每個iptables規則都包含一組匹配以及一個目標,iptables匹配指的是數據包必須匹配的條件,只有當
數據包滿足所有的匹配條件時,iptables才能根據由該規則的目標所指定的動作來處理該數據包
匹配都在iptable的命令行中指定
source--匹配源ip地址或網絡
destination (-d)--匹配目標ip地址或網絡
protocol (-p)--匹配ip值
in-interface (-i)--流入接口(例如,eth0)
out-interface (-o)--流出接口
state--匹配一組連接狀態
string--匹配應用層數據字節序列
comment--在內核內存中爲一個規則關聯多達256個字節的註釋數據

目標(target)
iptables支持一組目標,用於數據包匹配一條規則時觸發一個動作
ACCEPT--允許數據包通過
DROP--丟棄數據包,不對該數據包做進一步的處理,對接收棧而言,就好像該數據包從來沒有被接收一樣
LOG--將數據包信息記錄到syslog
REJECT--丟棄數據包,同時發送適當的響應報文(針對TCP連接的TCP重要數據包或針對UDP數據包的ICMP端口不可達消息)
RETURN--在調用鏈中繼續處理數據包

vi /etc/sysconfig/iptables 策略文件
vi /etc/sysconfig/iptables-config  配置文件

iptables缺省具有5條規則鏈
prerouting(內到外) forward(轉發) postrouting(外到內)
         input(輸入)        output(輸出)


1.鏈管理命令(這都是立即生效的)
-P :設置默認策略的(設定默認門是關着的還是開着的)
    默認策略一般只有兩種
    iptables -P INPUT (DROP|ACCEPT)
    默認是關的/默認是開的
    比如:
    iptables -P INPUT DROP
這就把默認規則給拒絕了。並且沒有定義哪個動作,所以關於外界連接的所有規則包括Xshell連接之類的,遠程連接都被拒絕了
-F: FLASH,清空規則鏈的(注意每個鏈的管理權限)
    iptables -t nat -F PREROUTING
    iptables -t nat -F 清空nat表的所有鏈
    -N:NEW 支持用戶新建一個鏈
    iptables -N inbound_tcp_web 表示附在tcp表上用於檢查web的。
-X: 用於刪除用戶自定義的空鏈
    使用方法跟-N相同,但是在刪除之前必須要將裏面的鏈給清空昂了
-E:用來Rename chain主要是用來給用戶自定義的鏈重命名
    -E oldname newname
-Z:清空鏈,及鏈中默認規則的計數器的(有兩個計數器,被匹配到多少個數據包,多少個字節)
    iptables -Z :清空

2.規則管理命令
-A:追加,在當前鏈的最後新增一個規則
-I num : 插入,把當前規則插入爲第幾條。
   -I 3 :插入爲第三條
-R num:Replays替換/修改第幾條規則
   格式:iptables -R 3 …………
-D num:刪除,明確指定刪除第幾條規則
        
3.查看管理命令 “-L”
    附加子命令
-n:以數字的方式顯示ip,它會將ip直接顯示出來,如果不加-n,則會將ip反向解析成主機名。
-v:顯示詳細信息
-vv
-vvv :越多越詳細
-x:在計數器上顯示精確值,不做單位換算
--line-numbers : 顯示規則的行號
-t nat:顯示所有的關卡的信息
 
4.:詳解匹配標準

    
2.擴展匹配
2.1隱含擴展:對協議的擴展
-p tcp :TCP協議的擴展。一般有三種擴展
--dport XX-XX:指定目標端口,不能指定多個非連續端口,只能指定單個端口,比如
--dport 21  或者 --dport 21-23 (此時表示21,22,23)
--sport:指定源端口
--tcp-fiags:TCP的標誌位(SYN,ACK,FIN,PSH,RST,URG)
    對於它,一般要跟兩個參數:
    1.檢查的標誌位
    2.必須爲1的標誌位
    --tcpflags syn,ack,fin,rst syn   =    --syn
    表示檢查這4個位,這4個位中syn必須爲1,其他的必須爲0。所以這個意思就是用於檢測三次握手的第一次包的。對於這種專門匹配第一包的SYN爲1的包,還有一種簡寫方式,叫做--syn
-p udp:UDP協議的擴展
    --dport
    --sport
-p icmp:icmp數據報文的擴展
    --icmp-type:
    echo-request(請求回顯),一般用8 來表示
    所以 --icmp-type 8 匹配請求回顯數據包
    echo-reply (響應的數據包)一般用0來表示
 
2.2顯式擴展(-m)
擴展各種模塊
  -m multiport:表示啓用多端口擴展
  之後我們就可以啓用比如 --dports 21,23,80

策略需求:
域名系統(DNS)查詢
文件傳輸協議(FTP)傳輸
網絡時間協議(NTP)查詢
安全Shell(SSH)會話
簡單郵件傳輸協議(SMTP)會話
通過HTTP/HTTPS進行web會話
whois查詢

外網掃描-------                (192.168.10.1(eth1))    (192.168.10.0/24)-------局域網客戶機(10.50)
外網web--------因特網----------iptables防火牆----------局域網---------------內網掃描者(10.200)
外網dns--------                (主機名:iptables)                ----------------web服務器(20.3)
                            (71.157.X.X(eth0))                ----------------dns服務器(10.4)
腳本:
iptables.sh
IPTABLES=/sbin/iptables
MODPROBE=/sbin/modprobe
INT_NET=192.168.10.0/24
####flush existing rules and set chain policy setting to drop(重置現有規則和鏈策略設置)
echo "[+] Flushing existing iptables rules..."
$IPTABLES -F-----------------------------(清空規則鏈)
$IPTABLES -F -t nat----------------------(清空nat表)
$IPTABLES -X-----------------------------(刪除用戶的空鏈)
$IPTABLES -p INPUT DROP------------------(關閉input端口)
$IPTABLES -p OUTPUT DROP-----------------(關閉output端口)
$IPTABLES -p FORWARD DROP----------------(關閉forward端口)
###load connection-tracking modules------(負載連接模塊)
$MODPROBE ip_conntrack-------------------(加載ip_conntrack模塊)
$MODPROBE iptables_nat-------------------(加載iptables_nat模塊)
$MODPROBE ip_conntrack_ftp---------------(加載ip_conntrack_ftp模塊)
$MODPROBE ip_nat_ftp---------------------(加載ip_nat_ftp模塊)

INPUT鏈
INPUT鏈作爲iptables的構建快,作用是控制目標爲本地系統的數據包是否可以和本地套接字通信,如果INPUT鏈中的第一條規則要求IPtables丟棄所以得數據包(或者INPUT鏈的策略設置爲DROP),那麼所有試圖通過任何ip通信方式(如TCP、UDP或ICMP)與系統直接通信的努力都將失敗。ARP工作在數據鏈路層而不是網絡層,而iptables只過濾ip及其之上協議的數據包,所以iptables不能過濾arp協議的報文。

####INPUT chain ########
echo "[+] Setting up INPUT chain ..."
####state tracking rules####
$IPTABLES -A INPUT -m state --state INVALID -j LOG --log-prefix "DROP INVALID" --log-ip-OPTIONS --log-tcp-options
$IPTABLES -A INPUT -m state --state INVALID -j DROP
$IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
##anti-spoofing rules
$IPTABLES -A INPUT -i eth1 -s ! $INI_NET -j LOG --log-prefix "SPOOFED PKT"
$IPTABLES -A INPUT -i eth1 -s ! $INT_NET -j DROP

##ACCEPT rules
$IPTABLES -A INPUT -i eth1 -p tcp -s $INT_NET --dport 22 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

##default INPUT LOG rule
$IPTABLES -A INPUT -i ! lo -j LOG --log-prefix "DROP" --log-ip-options --log-tcp-options

建立OUTPUT鏈規則集的命令如下所示:
#####OUTPUT chain ####
echo "[+] setting up OUTPUT chain..."
###state tracking rules
$IPTABLES -A OUTPUT -m state --state INVALID -j LOG --log-prefix "DROP INVALID" --log-ip-options --log-tcp-options
$IPTABLES -A OUTPUT -m state --state INVALID -j DROP
$IPTABLES -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

###ACCEPT RULES rules for allowing connections out-interface
$IPTABLES -A OUTPUT -p tcp --dport 21 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 22 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 25 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 43 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 80 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 443 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 4321 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A OUTPUT -p tcp --dport 53 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT

#### default OUTPUT LOG RULES
$IPTABLES -A OUTPUT -o ! lo -j LOG --log-prefix "DROP" --log-ip-options --log-tcp-options

FORWARD 鏈
filter表中的forward鏈提供了對通過防火牆接口轉發數據包進行訪問控制的能力:
###FORWARD chain####
echo "[+]Setting up FORWARD chain..."
###state tracking rules
$IPTABLES -A FORWARD -m state --state INVALID -j LOG --log-prefix "DROP INVALID" -- log-ip-options --log-tcp-options
$IPTABLES -A FORWARD -m state --state INVALID -j DROP
$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

###anti-spoofing rules
$IPTABLES -A FORWARD -i eth1 -s ! $INT_NET -j LOG --log-prefix "SPOOFED PKT"
$IPTABLES -A FORWARD -i eth1 -s ! $INT_NET -j DROP

###ACCEPT rules
$IPTABLES -A FORWARD -p tcp -i eth1 -s $INT_NET --dport 21 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A FORWARD -p tcp -i eth1 -s $INT_NET --dport 22 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A FORWARD -p tcp -i eth1 -s $INT_NET --dport 25 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A FORWARD -p tcp -i eth1 -s $INT_NET --dport 43 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A FORWARD -p tcp --dport 80 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A FORWARD -p tcp --dport 443 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A FORWARD -p tcp -i eth1 -s $INT_NET --DPORT 4321 --syn -m state --state NEW -j ACCEPT
$IPTABLES -A FORWARD -p tcp -p udp --dport 53 -m state --state NEW -j ACCEPT
$IPTABLES -A FORWARD -p tcp icmp --icmp-type echo-request -j ACCEPT
允許通過防火牆發起ftp、ssh、smtp和whois連接,但這類必須是從子網接口(eth1)上的內部子網發起的,允許來自任何源地址的http、https和dns通信通過防火牆
####default log rule
$IPTABLES -A FORWARD -i ! lo -j LOG --log-prefix "DROP" --log-ip-options --log-tcp-options

網絡地址轉換
iptables的nat表專用於定義所有的NAT規則,在這個表中有兩個鏈:PREROUTING和POSTROUTING,利用PREROUTING鏈將nat表中的規則應用到還沒有通過內核中路由算法確定應從哪個接口傳輸的數據包,在這個鏈中處理的數據包也尚未經過filter表中的INPUT或PREROUTING鏈的處理
POSTROUTING鏈負責處理經過內核中的路由算法確定傳輸的物理接口並即將從該接口出去的數據包,由這個鏈處理的數據包已通過filter表中的output或forward鏈的檢查
### NAT rules
echo "[+]Setting up NAT rules..."
$IPTABLES -t nat -A PREROUTING -p tcp --dport 80 -i eth0 -j DNAT --to 192.168.10.3:80
$IPTABLES -t nat -A PREROUTING -p tcp --dport 443 -i eth0 -j DNAT --to 192.168.10.3:443
$IPTABLES -t nat -A PREROUTING -p tcp --dport 53 -i eth0 -j DNAT --to 192.168.10.4:53
$IPTABLES -t nat -A POSTROUTING -是¥INT_NET -o eth0 -j MASQUERAD
內網的web服務器和DNS服務器的ip地址分別爲192.168.10.3、4,用於提供NAT功能的iptables命令,3個PREROUTING規則允許外網的web服務和DNS請求被髮送給合適的內網服務器,在POSTROUTING規則允許來自內部不可路由網絡並指向外部因特網的連接看起來就像他們來自IP地址71.157.X.X

構建iptable策略的最後一步實在linux內核中啓用ip轉發
###forwarding###
echo "[+] Enabling Ip forwarding..."
echo 1 > /proc/sys/net/ipv4/ip_forward

測試用到的命令 
hping
nc

轉: http://www.cnblogs.com/zclzhao/p/5081590.html


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章