iptables是linux系統下的一個功能強大的模組,不僅可以用作防火牆,還可以實現NAT等眾多路由功能。iptables的容器有很清晰的層次關係:
1. iptables是表的容器,iptables包含表(4張表)
2. 表是鏈的容器,每個表都包含若干個鏈
3. 鏈是規則的容器,真正的過濾規則是屬於鏈裡面的
iptables是採用資料包過濾機制工作的,它會對請求的資料包的包頭資料進行分析,並根據預先設定的規則來進行匹配,決定是否可以進入主機,流程如下:
從上圖不難看出,防火牆是一層層過濾的,按照配置規則的順序從上到下,從前到後進行過濾。如果匹配上規則,即明確了是阻止還是通過,此時資料包就不再往下匹配新規則了。否則一直向下匹配,直到匹配到預設規則,得到明確的阻止或通過;防火牆的預設規則是對應鏈的所有規則執行完後才會執行的。
iptables根據功能和表的定義劃分包含三個表,filter,nat,mangle,其每個表又包含不同的操作鏈(Chains)。要使用iptables實現ip白名單、mac地址白名單,只需使用filter表。filter表包含的操作鏈有三個:INPUT、FORWARD、OUTPUT:
1.INPUT負責過濾所有目標地址是本機地址的資料包,即進入主機的資料包
2.FORWARD負責轉發流經主機的資料包
3.OUTPUT負責處理所有源地址是本機地址的資料包,即主機發出的資料包
防火牆功能主要設定INPUT鏈的規則。首先載入如下模組到Linux核心:
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack 連線跟蹤
modprobe ip_conntrack_ftp 連線跟蹤
modprobe ip_nat_ftp
modprobe ipt_state
iptables的語法如下:
iptables -P INPUT DROP iptables [-A/-I num] INPUT -m mac --mac-source XX:XX:XX:XX:XX:XX -j ACCEPT -A: 新增規則到指定鏈的結尾,最後一條 -I num: 新增規則到指定鏈的指定行,num預設為1,即新增到第一條 -t: 指定表,不指定預設為filter -p: 指定協議(all,tcp,udp,icmp),預設為all --dport: 指定埠 -j: 處理的行為, ACCEPT, DROP, REJECT(最好使用drop而非reject,因為'拒絕'會返回給使用者資訊) -P: 設定預設策略 -s: 匹配來源地址IP/MASK -i: 接網路卡名稱,匹配從這塊網路卡流入的資料 -o: 接網路卡名稱,匹配從這塊網路卡流出的資料 #setting for loopback interface iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT -m mac --mac-source XX:XX:XX:XX:XX:XX -m state --state NEW/ESTABLISHED/RELATED/INVALID //可以用,連線多個
可以看到,例項的第二句即是將某個MAC地址加入白名單中。第一句則是將INPUT的預設規則設為DROP,以遮蔽來自其它MAC訊息。若要刪除規則,可使用以下方法:
iptables -F //清除所有規則 iptables -D INPUT -p tcp --dport 8080 -j DROP(刪除指定鏈中匹配的規則) /etc/init.d/iptables restart (用iptables命令列配置的命令都是臨時生效) iptables -D INPUT 規則序號