22、iptables學習筆記
netfilter: 工作核心中,讓規則能夠生效網路框架
iptables: 工作於使用者空間,編寫規則並且傳送到netfilter
四表:
raw,mangle,nat,filter(預設表)
五鏈:
PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
表和鏈的對應關係:
filter:
INPUT, FORWARD, OUTPUT
nat:
PREROUTING, OUTPUT, POSTROUTING
mangle:
PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
檢查條件:
IP:SIP, DIP
TCP:SPORT, DPORT, Flags
UDP:SPORT, DPORT
ICMP:ICMP-TYPE
擴充套件機制:
time,string, state(connection-tracking)
處理機制:
DROP
REJECT
ACCEPT
SNAT
DNAT
RETURN
REDIRECT
LOG
iptables [-t table] -N chain
建立一條自定義的規則鏈
iptables [-t table] -X [chain]
刪除自定義的空鏈
iptables [-t table] -E old-chain-name new-chain-name
修改自義鏈名
iptables [-t table] -P chain target
為鏈指定預設策略,指定預設規則
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
-F: 清空鏈中的規則
規則有編號,在鏈中自上而下,從1開始;
-L: list,列出表中的所有規則;
-n: 數字格式顯示IP和Port
-v: 以詳細格式顯示
pkts bytes target prot opt in out source destination
pkts: packets, 被本規則所匹配到的報文的個數;
bytes: 被本規則所匹配到的所有報文的大小之和,會執行單位換算;
target: 目標,即處理機制;
prot: 協議,一般為{TCP|UDP|ICMP};
opt: 可選項
in: 資料包的流入介面;
out: 資料包的流出介面;
source: 源地址;
destination: 目標地址;
-vv
-vvv
-x: exactly, 精確值,不執行單位換算;
--line-numbers: 顯示各規則的行號;
-Z: zero, 把規則的計數器清零
iptables [-t table] {-A|-I|-D|-R} chain rule-specification
規則命令:
追加規則
iptables [-t table] -A chain [rulenum] rule-specification
刪除規則
iptables [-t table] -D chain rulenum
插入規則
iptables [-t table] -I chain [rulenum] rule-specification
替換指定規則
iptables [-t table] -R chain rulenum rule-specification
只顯示指定鏈上的規則新增命令:
iptables [-t table] -S [chain [rulenum]]
rule-specification
匹配條件 -j 處理機制
匹配條件:
通用匹配:
-s :匹配原地址,可以IP,也可以網路地址;可以使用!操作符取反, ! 172.16.0.0/16; -s 相當於 --src, 或 --source
-d : 匹配目標地址
-p : 匹配協議,通常只使用{TCP|UDP|ICMP}三者之一;
-i :資料報文流入的介面;通常只用於INPUT、FORWARD和PREROUTING
-o :流出的介面;通常只用於OUTPUT、FORWARD和POSTROUTING
擴充套件匹配
隱含擴充套件: 使用-p {tcp|udp|icmp}指定某特定協議後,自動能夠對協議進行的擴充套件
-p icmp
--icmp-type
8: ping請求
0:ping響應
放行ping其它主機
iptables -A OUTPUT -s 192.168.130.61 -p icmp --icmp-type 8 -j ACCEPT
iptables -A INPUT -d 192.168.130.61 -p icmp --icmp-type 0 -j ACCEPT
放行其它主機ping自己
iptables -A INPUT -d 192.168.130.61 -p icmp --icmp-type 8 -j ACCEPT
iptables -A OUTPUT -s 192.168.130.61 -p icmp --icmp-type 0 -j ACCEPT
-p udp
--dport
--sport
放行本機dns服務,自己作為DNS客戶端
iptables -A OUTPUT -s 192.168.130.61 -p udp --dport 53 -j ACCEPT
iptables -A INPUT -d 192.168.130.61 -p udp --sport 53 -j ACCEPT
放行本機dns服務,自己作為DNS伺服器
iptables -A INPUT -d 192.168.130.61 -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -s 192.168.130.61 -p udp --sport 53 -j ACCEPT
放行本機的tftp服務,自己作為tftp伺服器(測試不成功,無法傳輸資料)
iptables -A INPUT -d 192.168.130.61 -p udp --dport 69 -j ACCEPT
iptables -A OUTPUT -s 192.168.130.61 -p udp --sport 69 -j ACCEPT
-p tcp
--dport m[-n] :匹配的目標埠,可以是連續的多個埠;
--sport :匹配的源埠
--tcp-flags rst,syn,ack,fin syn
放行本機web服務,自己作為web客戶端
iptables -A OUTPUT -s 192.168.130.61 -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -d 192.168.130.61 -p tcp --sport 80 -j ACCEPT
iptables -A OUTPUT -s 192.168.130.61 -p tcp --dport 443-j ACCEPT
iptables -A INPUT -d 192.168.130.61 -p tcp --sport 443 -j ACCEPT
放行本機ss服務,自己作為ss伺服器
iptables -t filter -A INPUT -d 192.168.130.61 -p tcp --dport 22 -j ACCEPT
iptables -t filter -A OUTPUT -s 192.168.130.61 -p tcp --sport 22 -j ACCEPT
顯式擴充套件:必須要明確指定的擴充套件模組
-m 擴充套件模組名稱 --專用選項1 --專用選項2
multiport: 多埠匹配,一次指定多個(15個以內)離散埠
--sports port[,port|,port:port]
--dports
--ports
[[email protected] ~]#
[[email protected] ~]# iptables -S
-P INPUT DROP
-P FORWARD DROP
-P OUTPUT DROP
-A INPUT -d 192.168.130.61/32 -p icmp -m icmp --icmp-type 0 -j ACCEPT
-A INPUT -d 192.168.130.61/32 -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -d 192.168.130.61/32 -p udp -m udp --sport 53 -j ACCEPT
-A INPUT -d 192.168.130.61/32 -p tcp -m tcp --sport 80 -j ACCEPT
-A INPUT -d 192.168.130.61/32 -p tcp -m tcp --sport 443 -j ACCEPT
-A INPUT -d 192.168.130.61/32 -p tcp -m tcp --dport 22 -j ACCEPT
-A OUTPUT -s 192.168.130.61/32 -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A OUTPUT -s 192.168.130.61/32 -p icmp -m icmp --icmp-type 0 -j ACCEPT
-A OUTPUT -s 192.168.130.61/32 -p udp -m udp --dport 53 -j ACCEPT
-A OUTPUT -s 192.168.130.61/32 -p tcp -m tcp --dport 80 -j ACCEPT
-A OUTPUT -s 192.168.130.61/32 -p tcp -m tcp --dport 443 -j ACCEPT
-A OUTPUT -s 192.168.130.61/32 -p tcp -m tcp --sport 22 -j ACCEPT
使用multiport將80,443這3條合併為1條
iptables -A INPUT -d 192.168.130.61 -p tcp -m multiport --dports 80,443 -j ACCEPT
iptables -A OUTPUT -s 192.168.130.61 -p tcp -m multiport --sports 80,443 -j ACCEPT
iprange: ip地址範圍
[!] --src-range from[-to]
[!] --dst-range from[-to]
只允許192.168.130.1-192.168.130.60範圍內的IP能ssh訪問192.168.130.61
iptables -A INPUT -d 192.168.130.61 -p tcp --dport 22 -m iprange --src-range 192.168.130.1-192.168.130.60 -j ACCEPT
iptables -A OUTPUT -s 192.168.130.61 -p tcp --sport 22 -m iprange --dst-range 192.168.130.1-192.168.130.60 -j ACCEPT
time: 指定時間範圍
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
[!] --weekdays day[,day...]
只有每週的週一至週五的8點到18點可以訪問192.168.130.61的web伺服器
iptables -A INPUT -d 192.168.130.61 -p tcp --dport 80 -m time --weekdays Mon,Tus,Wed,Thu,Fri --timestart 08:00:00 --timestop 18:00:00 -j ACCEPT
iptables -A OUTPUT -s 192.168.130.61 -p tcp --sport 80 -j ACCEPT
string: 字串匹配
--algo {bm|kmp}:字元匹配查詢時使用演算法
--string "STRING": 要查詢的字串
--hex-string “HEX-STRING”: 要查詢的字元,先編碼成16進位制格式
禁止訪問192.168.130.61含有google字元的網站
iptables -I OUTPUT -s 192.168.130.61 -p tcp --sport 80 -m string --algo kmp --string "google" -j DROP
connlimit: 每IP對指定服務的最大併發連線數;
[!] --connlimit-above [n]
iptables -I INPUT -d 172.16.100.7 -p tcp --dport 80 -m connlimit --connlimit-above 3 -j DROP
ab -c 200 -n 2000 https://172.16.100.7/test.html
limit: 報文速率控制
--limit #[/second|/minute|/hour|/day]
--limit-burst #
iptables -A INPUT -d 192.168.130.61 -p icmp --icmp-type 8 -m limit --limit 2/second --limit-burst 5 -j ACCEPt
初始可以達到每秒ping 5次,平均每秒不能超過2個
state: 狀態匹配
--state
NEW
ESTABLISHED
RELATED
INVALID
調整連線追蹤功能所能容納的追蹤的最大連線數:
# cat /proc/sys/net/nf_conntrack_max
定義了連線追蹤的最大值,因此,建議按需調大此值;
# cat /proc/net/nf_conntrack
記錄了當前追蹤的所有連線
# cat /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established
法則:
1、對於進入的狀態為ESTABLISHED都應該放行;
2、對於出去的狀態為ESTABLISHED都應該放行;
3、嚴格檢查進入的狀態為NEW的連線;
4、所有狀態為INVALIED都應該拒絕;
如何放行工作於被動模式下的FTP服務?
1、確保iptables載入ftp協議支援的模組:ip_nat_ftp, ip_conntrack_ftp
編輯/etc/sysconfig/iptables-config檔案,定義如下引數:
IPTABLES_MODULES="ip_nat_ftp ip_conntrack_ftp"
modprobe ip_nat_ftp
modprobe ip_conntrack_ftp
2、放行請求報文的RELATED和ESTABLISHED狀態,放行響應報文的ESTABLISHED狀態;
iptables -A INPUT -d 192.168.130.61 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 192.168.130.61 -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -d 192.168.130.61 -p tcp --dport 21 -j ACCEPT
iptables -A OUTPUT -s 192.168.130.61 -p tcp --sport 21 -j ACCEPT
-j target
RETURN: 返回呼叫鏈
練習:判斷下述規則的意義:
# iptables -N clean_in
# iptables -A clean_in -d 255.255.255.255 -p icmp -j DROP
# iptables -A clean_in -d 172.16.255.255 -p icmp -j DROP
# iptables -A clean_in -p tcp ! --syn -m state --state NEW -j DROP
# iptables -A clean_in -p tcp --tcp-flags ALL ALL -j DROP
# iptables -A clean_in -p tcp --tcp-flags ALL NONE -j DROP
# iptables -A clean_in -d 192.168.130.61 -j RETURN
# iptables -A INPUT -d 192.168.130.61 -j clean_in
# iptables -A INPUT -i lo -j ACCEPT
# iptables -A OUTPUT -o lo -j ACCEPT
# iptables -A INPUT -i eth0 -m multiport -p tcp --dports 53,113,135,137,139,445 -j DROP
# iptables -A INPUT -i eth0 -m multiport -p udp --dports 53,113,135,137,139,445 -j DROP
# iptables -A INPUT -i eth0 -p udp --dport 1026 -j DROP
# iptables -A INPUT -i eth0 -m multiport -p tcp --dports 1433,4899 -j DROP
# iptables -A INPUT -p icmp -m limit --limit 10/second -j ACCEPT
利用iptables的recent模組來抵禦DOS***: 22,建立一個列表,儲存有所有訪問過指定的服務的客戶端IP
ssh: 遠端連線,
iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j LOG --log-prefix "SSH Attach: "
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP
1.利用connlimit模組將單IP的併發設定為3;會誤殺使用NAT上網的使用者,可以根據實際情況增大該值;
2.利用recent和state模組限制單IP在300s內只能與本機建立2個新連線。被限制五分鐘後即可恢復訪問。
下面對最後兩句做一個說明:
1.第二句是記錄訪問tcp 22埠的新連線,記錄名稱為SSH
--set 記錄資料包的來源IP,如果IP已經存在將更新已經存在的條目
2.第三句是指SSH記錄中的IP,300s內發起超過3次連線則拒絕此IP的連線。
--update 是指每次建立連線都更新列表;
--seconds必須與--rcheck或者--update同時使用
--hitcount必須與--rcheck或者--update同時使用
3.iptables的記錄:/proc/net/xt_recent/SSH
也可以使用下面的這句記錄日誌:
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --name SSH --second 300 --hitcount 3 -j LOG --log-prefix "SSH Attack"
路由:對於Linux主機來說,設定/proc/sys/net/ipv4/ip_forward的值為1,即為開啟了路由功能;
NAT: 過載技術
Basic NAT: 靜態NAT;
NAPT:動態NAT,網路地址埠轉換;
源地址轉換:SNAT,用於讓內網主機訪問網際網路
目標地址轉換:DNAT,讓網際網路上主機訪問本地內網中的某伺服器上的服務,(釋出)
iptables基於SNAT和DNAT這兩個目標實現地址轉換技術;
-j SNAT --to-source SIP
規則新增:POSTROUTING鏈
-j MASQUERADE
-j DNAT --to-destination DIP[:PORT]
支援埠對映
例子:
# iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -j SNAT --to-source 192.168.20.11
# iptables -A FORWARD -d 172.16.0.0/16 -p tcp --sport 80 -m string --algo kmp --string "hello" -j REJECT
# iptables -t nat -A PREROUTING -d 192.168.130.61 -p tcp --dport 22022 -j DNAT --to-destination 192.168.20.12:22
儲存規則:
service iptables save
規則會被儲存至/etc/sysconfig/iptables檔案中;
預設,start時也會讀取此檔案中的內容以設定規則;
# iptables-save > /path/to/some_rulefile
# iptables-restore < /path/from/some_rulefile