相關文件
- iptables服務配置文件
-rw-------. 1 root root 2374 9月 4 2017 /etc/sysconfig/iptables-config
- iptables規則文件
-rw------- 1 root root 191 10月 1 2018 /etc/sysconfig/iptables
防火牆結構
COMMAND 命令選項
-A|--append CHAIN //鏈尾添加新規則
-D|--delete CHAIN [RULENUM] //刪除鏈中規則,按需序號或內容確定要刪除的規則
-I|--insert CHAIN [RULENUM] //在鏈中插入一條新的規則,默認插在開頭
-R|--replace CHAIN RULENUM //替換、修改一條規則,按序號或內容確定
-L|--list [CHAIN [RULENUM]] //列出指定鏈或所有鏈中指定規則或所有規則
-S|--list-urles [CHAIN [RULENUM]] //顯示鏈中規則
-F|--flush [CHAIN] //清空指定鏈或所有鏈中規則
-Z|--zero [CHAIN [RULENUM]] //重置指定鏈或所有鏈的計數器(匹配的數據包數和流量字節數)
-N|--new-chain CHAIN //新建自定義規則鏈
-X|--delete-cahin [CHAIN] //刪除指定表中用戶自定義的規則鏈
-E|--rename-chain OLDCHAIN NEWCHAIN //重命名鏈,移動任何引用
-P|-policy CHAIN TARGET //設置鏈的默認策略,數據包未匹配任意一條規則就按此策略處理
輔助選項
-t|--table TABLE //指定操作的表,默認的表為filter
-n|--numeric //用數字形式顯示地址和端口,顯示主機IP地址而不是主機名
-x|--exact //計數器顯示精確值,不做單位換算
-v|--verbose (x3) //查看規則列表時,顯示更詳細的信息
--line-numbers //查看規則表時,顯示在鏈中的序號
-V|--version
-h|--help
[option] --help //查看特定選項的幫助,如iptables -p icmp --help
--fragment -f //match second or further fragments only
--modprobe=<command> //try to insert modules using this command
--set-counters PKTS BYTES //set the counter during insert/append
CRETIRIA 條件匹配
基本匹配
擴展匹配-> |隱式匹配
|顯示匹配
- 基本匹配
-p|--proto PROTO //按協議匹配,如tcp、udp、icmp,all表示所有協議。 (/etc/protocols中的協議名)
-s|--source ADDRESS[/mask]... //按數據包的源地址匹配,可使用IP地址、網絡地址、主機名、域名
-d|--destination ADDRESS[/mask]... //按目標地址匹配,可使用IP地址、網絡地址、主機名、域名
-i|--in-interface INPUTNAME[ +] //按入站接口(網卡)名匹配,+用於通配。如 eth0, eth+ 。一般用在INPUT和PREROUTING鏈
-o|--out-interface OUTPUTNAME[+] //按出站接口(網卡)名匹配,+用於通配。如 eth0, eth+ 。一般用在OUTPUT和POSTROUTING鏈
- 隱式匹配
-m PROTO 可以省略,所以叫隱式匹配
-m tcp //-p tcp的擴展
--sport [!]N[:M] //源端口, 服務名、端口、端口范圍。
--dport [!]N[:M] //目標端口,服務名、端口、端口范圍
--tcp-flags CHECKFLAGS FLAGSOFTRUE //TCP標志位:SYN(同步),ACK(應答),RST(重置),FIN(結束),URG(緊急),PSH(強迫推送)。多個標志位逗號分隔。
//CHECKFLAGS為要檢查的標志位,FLAGSOFTRUE為必須為1的標志位(其余的應該為0)
--syn //第一次握手。 等效於 --tcpflags syn,ack,fin,rst syn 四個標志中只有syn為1
-m udp //-p udp的擴展
--sport N[-M]
--dport N[-M]
-m icmp //隱含條件為-p icmp
--icmp-type N //8:echo-request 0:echo-reply
- 顯示匹配
-m state
--state //連接狀態檢測,NEW,ESTABLISHED,RELATED,INVALID
-m multiport
--source-ports PORT[,PORT]...|N:M //多個源端口,多個端口用逗號分隔,
--destination-ports PORT[,PORT]...|N:M //多個目的端口
--ports //多個端口,每個包的源端口和目的端口相同才會匹配
-m limit
--limit N/UNIT //速率,如3/minute, 1/s, n/second , n/day
--limit-burst N //峰值速率,如100,表示最大不能超過100個數據包
-m connlimit
--connlimit-above N //多於n個,前面加!取反
-m iprange
--src-range IP-IP
--dst-range IP-IP
-m mac
--mac-source //mac地址限制,不能用在OUTPUT和POSTROUTING規則鏈上,因為封包要送到網卡后,才能由網卡驅動程序透過ARP 通訊協議查出目的地的MAC 地址
-m string
--algo [bm|kmp] //匹配算法
--string "PATTERN" //匹配字符模式
-m recent
--name //設定列表名稱,默認為DEFAULT
--rsource //源地址
--rdest //目的地址
--set //添加源地址的包到列表中
--update //每次建立連接都更新列表
--rcheck //檢查地址是否在列表
--seconds //指定時間。必須與--rcheck或--update配合使用
--hitcount //命中次數。必須和--rcheck或--update配合使用
--remove //在列表中刪除地址
-m time
--timestart h:mm
--timestop hh:mm
--days DAYS //Mon,Tue,Wed,Thu,Fri,Sat,Sun; 逗號分隔
-m mark
--mark N //是否包含標記號N
-m owner
--uid-owner 500 //用來匹配來自本機的封包,是否為某特定使用者所產生的,可以避免服務器使用root或其它身分將敏感數據傳送出
--gid-owner O //用來匹配來自本機的封包,是否為某特定使用者群組所產生的
--pid-owner 78 //用來匹配來自本機的封包,是否為某特定進程所產生的
--sid-owner 100 //用來匹配來自本機的封包,是否為某特定連接(Session ID)的響應封包
ACTION 目標策略(TARGET)
-j|--jump TARGET # 跳轉到目標規則,可能加載target extension
-g|--goto CHAIN # 跳轉到指定鏈,不再返回
ACCEPT # 規則驗證通過,不再檢查當前鏈的后續規則,直接跳到下一個規則鏈。
DROP # 直接丟棄數據包,不給任何回應。中斷過濾。
REJECT # 拒絕數據包通過,會返回響應信息。中斷過濾。
--reject-with tcp-reset|port-unreachable|echo-reply
LOG # 在/var/log/messages文件中記錄日志,然后將數據包傳遞給下一條規則。詳細位置可查看/etc/syslog.conf配置文件
--log-prefix "INPUT packets"
ULOG # 更廣范圍的日志記錄信息
QUEUE # 防火牆將數據包移交到用戶空間,通過一個內核模塊把包交給本地用戶程序。中斷過濾。
RETURN # 防火牆停止執行當前鏈中的后續規則,並返回到調用鏈。主要用在自定義鏈中。
custom_chain # 轉向自定義規則鏈
DNAT # 目標地址轉換,改變數據包的目標地址。外網訪問內網資源,主要用在PREROUTING。完成后跳到下一個規則鏈
--to-destination ADDRESS[-ADDRESS][:PORT[-PORT]]
SNAT # 源地址轉換,改變數據包的源地址。內網訪問外網資源。主機的IP地址必須是靜態的,主要用在POSTROUTING。完成后跳到下一個規則鏈。
--to-source ADDRESS[-ADDRESS][:PORT[-PORT]]
MASQUERADE # 源地址偽裝,用於主機IP是ISP動態分配的情況,會從網卡讀取主機IP。直接跳到下一個規則鏈。
--to-ports 1024-31000
REDIRECT # 數據包重定向,主要是端口重定向,把包分流。能會用這個功能來迫使站點上的所有Web流量都通過一個Web高速緩存,比如Squid。
--to-ports 8080
MARK # 打防火牆標記。繼續匹配規則。
--set-mark 2
MIRROR # 發送包之前交換IP源和目的地址,將數據包返回。中斷過濾。
state TCP鏈接狀態
NEW 第一次握手,要起始一個連接(重設連接或將連接重導向)
ESTABLISHED 數據包屬於某個已經建立的連接。第二次和第三次握手 (ack=1)
INVALID 數據包的連接編號(Session ID)無法辨識或編號不正確。如SYN=1 ACK=1 RST=1
RELATED 表示該封包是屬於某個已經建立的連接,所建立的新連接。
如有些服務使用兩個相關的端口,如FTP,21和20端口一去一回,FTP數據傳輸(上傳/下載)還會使用特殊的端口,
只允許NEW和ESTABLISHED進,只允許ESTABLISHED出可以阻止反彈式木馬。
使用示例
iptables -F //刪除iptables現有規則
iptables -L [-v[vv] -n] //查看iptables規則
iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o eth1 -j MASQUERADE //在POSTROUTING鏈尾添加一條規則
iptables -t nat -A POSTROUTING -s 20.20.20.0/24 -o eth1 -j MASQUERADE //在POSTROUTING鏈中插入為第2條規則
iptables -t nat -R POSTROUTING 2 -s 40.40.40.40 -o eth1 -j MASQUERAD //替換修改第二條規則
iptables -t nat -D POSTROUTING 2 //刪除POSTROUTING鏈中第2條規則
iptables -t nat -P POSTROUTING DROP //設置默認策略為DROP
//限制ping 192.168.146.3主機的數據包數,平均2/s個,最多不能超過3個
iptables -A INPUT -i eth0 -d 192.168.146.3 -p icmp --icmp-type 8 -m limit --limit 2/second --limit-burst 3 -j ACCEPT
//限制SSH連接速率(默認策略是DROP)
iptables -I INPUT 1 -p tcp --dport 22 -d 192.168.146.3 -m state --state ESTABLISHED -j ACCEPT
iptables -I INPUT 2 -p tcp --dport 22 -d 192.168.146.3 -m limit --limit 2/minute --limit-burst 2 -m state --state NEW -j ACCEPT
//防止syn攻擊(限制syn的請求速度)
iptables -N syn-flood
iptables -A INPUT -p tcp --syn -j syn-flood
iptables -A syn-flood -m limit --limit 1/s --limit-burst 4 -j RETURN
iptables -A syn-flood -j DROP
//防止syn攻擊(限制單個ip的最大syn連接數)
iptables –A INPUT –i eth0 –p tcp --syn -m connlimit --connlimit-above 15 -j DROP
iptables -I INPUT -p tcp -dport 22 -m connlimit --connlimit-above 3 -j DROP //利用recent模塊抵御DOS攻擊
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH //單個IP最多連接3個會話
Iptables -I INPUT -p tcp --dport 22 -m state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP //只要是新的連接請求,就把它加入到SSH列表中。5分鍾內你的嘗試次數達到3次,就拒絕提供SSH列表中的這個IP服務。被限制5分鍾后即可恢復訪問。
iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 30 -j DROP //防止單個IP訪問量過大
iptables –A OUTPUT –m state --state NEW –j DROP //阻止反彈木馬
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/m -j ACCEPT //防止ping攻擊