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 規則序號