之前的博客聊了關于iptables防火墻工作原理的相關介紹, 本片將詳細介紹iptables的使用。
一、 iptables 查看鏈表,創建鏈表,類命令
1. iptables [-t table] -N chain : 創建一條自定義規則的鏈
# iptables -t filter -N clean_in 注: 自定義鏈在沒有被引用之前是不起作用的。
2. iptables [-t filter] -X [chain] : 刪除一個自定義鏈
# iptables -t filter -X clean_in
3. iptables [-t table] -E old-chain-name new-chain-name : 為一個自定義鏈修改名字
# iptables -t filter -E clean_in clean_in_httpd
4. iptables [-t table] -P chain target : 為鏈指定默認策略,指定默認規則
5. iptables [-t table] {-F|-L|-Z} [chain [runlenum]] [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: 目標地址; -X: exactly, 精確值,不執行單位換算 --line-number: 顯示各規則的行號 -Z: 匹配數量清零
二、 iptables 添加和編輯規則相關命令
1. iptables [-t table] {-A | -D} chain rule-specification
-A: append, 附加一條規則 -D chain [rulenum] rule-specification: 刪除一條規則 -I chain [rulenum] rule-specification : 修改規則 -R chain [rulenum] rule-specification:替換指定規則 -S chain [rulenum] 只顯示鏈上的規則添加 rule-specification格式 : 匹配條件 -j 處理機制 通用匹配條件: -s: 匹配原地址,可以IP,也可以是網絡地址,可以使用!操作符取反,!192.168.0.0/16; -s 相當于 --src 或 --source -d: 匹配目標地址 -p: 匹配協議,通常只使用{TCP|UDP|ICMP}三者之一; -i:數據報文流入的接口:通常用于INPUT, FORWARD, PREROUTING -o:流出接口,通常只用于OUTPUT,FORWARD,和POSTROUTING -j target RETURN:返回調用鏈 ACCEPT: 放行 舉例: 1. 允許192.168.98.0/24網段ping通,當前192.168.98.128主機 # iptables -t filter -A INPUT -i eth0 -s 192.168.98.0/24 -d 192.168.98.128/24 -p ICMP -j ACCEPT # iptables -t filter -A OUTPUT -s 192.168.98.128 -d 192.168.98.0/24 -p ICMP -j ACCEPT 結果; ICMP INPUT和OUTPUT鏈都有匹配到 Chain INPUT (policy ACCEPT 57 packets, 4188 bytes) pkts bytes target prot opt in out source destination 29 2436 ACCEPT icmp -- eth0 * 192.168.98.0/24 192.168.98.0/24 Chain OUTPUT (policy ACCEPT 41 packets, 4980 bytes) pkts bytes target prot opt in out source destination 29 2436 ACCEPT icmp -- * * 192.168.98.128 192.168.98.0/24
2. iptables規則保存
# service iptables save: 默認會被保存在/etc/sysconfig/iptables文件中,start的時候也會從這里讀取 下面兩種方式也可以存取 # iptables-save > /path/to/some_rulefile # iptables-restore < /path/from/some_rulefile
3. iptables隱含擴展配置
1)tcp協議的隱含擴展
-p tcp --dport m[-n]:匹配的目標端口,可以使連續的多個端口 --sport: 源端口 --tcp-flags rst,syn,ack,fin syn : 空格之前表示匹配哪些標識位,空格之后是哪些標識位為1 --syn:單獨匹配某一項標識位 所有使用的值: URG, PSH, RST, SYN, ACK, FIN,ALL, NONE 舉例: 釋放所有192.168.98.0/24網段的ssh服務 # iptables -t filter -A INPUT -s 192.168.98.0/24 -d 192.168.98.128/24 -p tcp --dport 22 -j ACCEPT # iptables -t filter -A OUTPUT -s 192.168.98.128/24 -d 192.168.98.0/24 -p tcp --sport 22 -j ACCEPT # iptables -t filter -P INPUT DROP # iptables -t filter -P OUTPUT DROP 結果: ssh鏈接不會斷開,可以看見進出都有報文匹配,而ping報文會被drop Chain INPUT (policy DROP 45 packets, 3588 bytes) pkts bytes target prot opt in out source destination 967 70220 ACCEPT tcp -- * * 192.168.98.0/24 192.168.98.0/24 tcp dpt:22 Chain OUTPUT (policy DROP 22 packets, 5608 bytes) pkts bytes target prot opt in out source destination 426 48420 ACCEPT tcp -- * * 192.168.98.0/24 192.168.98.0/24 tcp spt:22
2) udp 協議的隱含擴展
-p udp : udp報文相關的拓展匹配 --dport --sport 放行本機的tftp服務 # iptables -t filter -A INPUT -s 192.168.98.0/24 -d 192.168.98.128/24 -p udp --dport 69 -j ACCEPT # iptables -t filter -A OUTPUT -s 192.168.98.128/24 -d 192.168.98.0/24 -p udp --sport 69 -j ACCEPT 放行本機DNS服務 # iptables -t filter -A INPUT -s 192.168.98.0/24 -d 192.168.98.128/24 -p udp --dport 53 -j ACCEPT # iptables -t filter -A INPUT -s 192.168.98.128/24 -d 192.168.98.0/24 -p udp --sport 53 -j ACCEPT
3) icmp 協議的隱含擴展
-P icmp : icmp協議相關拓展 --icmp-type 8: ping 請求 0:ping 響應 釋放本機的ping請求 # iptables -t filter -A INPUT -s 192.168.98.0/24 -d 192.168.98.128/24 -p icmp --icmp-type 8 # iptables -t filter -A INPUT -s 192.168.98.128/24 -d 192.168.98.0/24 -p icmp --icmp-type 0
4. 顯示擴展:必須指定的擴展模塊
-m 擴展模塊名稱 –專用選項1 –專用選項2
1) multiport:多端口匹配模塊,一次可以指定最多15離散端口。
-m multiport --source-ports,--sports port[,port|,port:port] : 指定源端口 --destination-port, --dports: 指定目標端口 --ports: 指定源端口和目標端口 舉例: 開放本機所在網絡,ssh和web服務。 # iptables -t filter -A INPUT -s 192.168.98.0/24 -d 192.168.98.128/24 -p tcp -m multiport --dport 22,80 -j ACCEPT # iptables -t filter -A OUTPUT -s 192.168.98.128/24 -d 192.168.98.0/24 -p tcp -m multiport --sport 22.80 -j ACCEPT
2) iprange:匹配ip地址范圍
-m iprange: [!] --src-range from[-to] [!] --dst-range from[-to] 舉例: 開放本機ssh給192.168.98.1-192.168.98.120訪問 # iptables -t filter -A INPUT -d 192.168.98.128 -p tcp --dport 22 -m iprange --src-range 192.168.98.1-192.168.98.120 -j ACCEPT # iptables -t filter -A OUTPUT -s 192.168.98.128 -p tcp --dport 22 -m iprange --dst-range 192.168.98.1-192.168.98.120 -j ACCEPT
3)time:指定時間范圍匹配
-m 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...] 舉例,在工作日時間開放samba(tcp, 901端口) 服務 # iptables -t filter -A INPUT -d 192.168.98.128 -p tcp --dport 901 -m time --weekdays Mon,Tus,Wed,Thu,Fri --timestart 08:00:00 --time-stop 18:00:00 -j ACCEPT # iptables -t filter -A OUTPUT -s 192.168.98.128 -p tcp --sport 901 -j ACCEPT
4) string:字符串過濾
-m string --algo {bm|kmp}:字符匹配查找時使用的算法 --string "STRING" : 要查找的字符串 --hex-string "HEX-STRING": 要查找的字符,先編碼成16進制格式,可以提高查詢效率 舉例: 禁止本機的web報文,包含‘hello’字符 # iptables -t filter -A OUTPUT -s 192.168.98.128 -p tcp --dport 80 -j ACCEPT # iptables -t filter -A INPUT -d 192.168.98.128 -p tcp --sport 80 -m string --algo bm --string "hello" -j DROP
5) connlimit:每個ip對指定服務的最大并發鏈接數
-m connlimit --connlimit-above [0]:此選項用于,堅定某個IP是正常訪問還是發起攻擊
6)limit:報文速率控制
-m limit --limit #/[/second|/minute|/hour|/day] 限制速率 --limit-burst # 峰值速率 舉例: 防御DDos攻擊 # iptables -t filter -I INPUT -d 192.168.98.128 -p icmp --icmp-type 8 -m limit --limit 2/second --limit-burst 10 -j ACCEPT 在另一臺主機上,使用hping3命令發起攻擊 # hping -1 -c 10000 -i u1 192.168.98.128 結果: Chain INPUT (policy DROP 9990 packets, 280K bytes) pkts bytes target prot opt in out source destination 10 280 ACCEPT icmp -- * * 0.0.0.0/0 192.168.98.128 icmp type 8 limit: avg 2/sec burst 10 可以看到只有10個報文通過,其他的icmp請求全被drop了
7)state:狀態匹配
-m state --state NEW:新建連接 ESTABLISHED:已經建立的連接 RELATED:與現有連接有關聯的連接 INVALID: 異常連接 狀態匹配是由ip_conntrack, nf_conntrack兩個模塊實現的。 # 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" 2. 開放命令連接端口,tcp 21號端口 # iptables -t filter -A INPUT -d 192.168.98.128 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT 3. 放行請求報文的RELATED和ESTABLISHED狀態,放行響應報文的ESTABLISHED狀態; # iptables -t filter -A INPUT -d 192.168.98.128 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT # iptables -t filter -A OUTPUT -s 192.168.98.128 -p tcp -m state --state ESTABLISHED -j ACCEPT 如果只開放命令連接的話,依然可以進行身份認證,但是無法下載,或者查看目錄 啟動服務時的最后一個服務通常是/etc/rc.d/rc.local (/etc/rc.local),這事實上是一個腳本,但凡寫在此腳本中的命令或腳本調用都在系統運行至此服務被執行
5. INPUT和OUTPUT默認策略為DROP的一些實例
1. 限制本地主機的web服務器在周一不允許訪問;新請求的速率不能超過100個每秒;web服務器包含了admin字符串的頁面不允許訪問;web服務器僅允許響應報文離開本機; # iptables -t filter -A INPUT -d 192.168.98.128 -p tcp --dport 80 -m state --state NEW -m limit --limit 100/second -m time ! --weekdays Mon -j ACCEPT # iptables -t filter -A INPUT -d 192.168.98.128 -p tcp --dport 80 -m state --state ESTABLISHED -j ACCEPT # iptables -t filter -A OUTPUT-s 192.168.98.128 -p tcp --sport 80 -m state --state ESTABLISHED -m string --algo kmp ! --string "admin" -j ACCEPT 2. 在工作時間,即周一到周五的8:30-18:00,開放本機的ftp服務給192.168.98.0網絡中的主機訪問;數據下載請求的次數每分鐘不得超過5個 # iptables -t filter -R INPUT 2 -d 192.168.98.128 -s 192.168.98.0/24 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -m time --weekdays Mon,Tus,Wed,Thu,Fri --timestart 08:00:00 --timestop 18:00:00 -j ACCEPT # iptables -t filter -R INPUT 3 -d 192.168.98.128 -s 192.168.98.0/24 -p tcp -m state --state RELATED -m limit --limit 5/min -j ACCEPT # iptables -t filter -A INPUT -d 192.168.98.128 -s 192.168.98.0/24 -p tcp -m state --state ESTABLISHED -j ACCEPT # iptables -t filter -A OUTPUT -d 192.168.98.0/24 -s 192.168.98.128 -p tcp -m state --state ESTABLISHED -j ACCEPT 3. 開放本機的ssh服務給192.168.98.1-192.168.98.100中的主機,新請求建立的速率一分鐘不得超過2個;僅允許響應報文通過其服務端口離開本機; # iptables -t filter -A INPUT -d 192.168.98.128 -p tcp --dport 22 -m state --state NEW -m iprange --src-range 192.168.98.1-192.168.98.100 -m limit --limit 2/min -j ACCEPT # iptables -t filter -A INPUT -d 192.168.98.128 -p tcp --dport 22 -m state --state ESTABLISHED -m iprange --src-range 192.168.98.1-192.168.98.100 -j ACCEPT # iptables -t filter -A OUTPUT -s 192.168.98.128 -p tcp --sport 22 -m iprange --dst-range 192.168.98.1-192.168.98.100 -m state --state ESTABLISHED -j ACCEPT 4. 拒絕TCP標志位全部為1及全部為0的報文訪問本機; # iptables -t filter -A INPUT -d 192.168.98.128 -p --tcp-flags ALL ALL -j DROP
三、 iptables 當做網絡防火墻的一些設置
1. FORWARD 鏈限定本機路由功能
對于Linux主機來說,設定/proc/sys/net/ipv4/ip_forward的值為1,即為開啟了路由功能;
如果對于轉發進行限定,需要在FORWARD鏈上面進行限定規則。
舉例: 三臺主機,vm1,vm2,vm3 vm1: IP地址,192.168.98.128 vm2: IP地址,192.168.98.129 另一塊網卡為172.25.136.1 vm3:IP地址,172.25.136.2 只開通vm1和vm3之間的ping 請求 ## 設置vm1主機 # route add default gw 192.168.98.129 ## 設置vm3主機 # route add default gw 172.25.136.2 ## 設置vm2主機 # echo 1 /proc/sys/net/ipv4/ip_forward # iptables -t filter -A FORWARD -s 192.168.98.128 -d 172.25.136.2 -p icmp -j ACCEPT # iptables -t filter -A FORWARD -s 172.25.136.2 -d 192.168.98.128 -p icmp -j ACCEPT # iptables -P FORWARD DROP
2. NAT(過載技術)地址轉換相關應用
Basic NAT: 靜態NAT;地址端口池子
內部主機都需要外部主機地址池中的一個地址
NAPT:動態NAT,網絡地址端口轉換;外部主機端口使用一個地址,但是選擇一個動態端口映射,建立一個會話表。
使用命令: iptables基于SNAT和DNAT這兩個目標實現地址轉換技術; -j SNAT --to-source SIP 規則添加:POSTROUTING鏈 -j MASQUERADE : 地址偽裝,無需知道原地址是什么,自動找到可以使用的互聯網地址,撥號時候可以使用。 -j DNAT --to-destination DIP[:PORT] 支持端口映射
所有nat相關轉換,如果限定訪問內容,可以在forward 鏈上面做限定
1)源地址轉換:SNAT,用于讓內網主機訪問互聯網
例子: vm1: IP地址,192.168.98.128 模擬內網 vm2: IP地址,192.168.98.129 另一塊外網網卡為172.25.136.1 vm3:IP地址,172.25.136.2 模擬外網 開通使內網通過SNAT訪問外網服務器。 ## 內網主機vm1設置路由 # route add default gw 192.168.98.129 ## 中間主機vm2 # iptables -P FORWARD ACCEPT # iptables -t nat -A POSTROUTING -d 192.168.98.0/24 -j SNAT --to-source 172.25.136.1
2)目標地址轉換:DNAT,讓互聯網上主機訪問本地內網中的某服務器上的服務,(發布)
例子: vm1: IP地址,192.168.98.128 模擬內網 vm2: IP地址,192.168.98.129 另一塊外網網卡為172.25.136.1 vm3:IP地址,172.25.136.2 模擬外網 開通使內網通過DNAT使得外網訪問內網主機web服務器。 ## 內網vm1服務器需要路由指向vm2內網地址,否則請求無法返回 # route add default gw 192.168.98.129 ## 外網vm3需要可以向vm2外網地址通信 # route add default gw 172.25.136.1 ## vm2主機設置目標地址轉換條目 # iptables -t nat -A POSTROUTING -d 172.25.136.1 -t tcp --dport 80 -j DNAT --to-destination 192.168.98.128 這樣外網地址主機發出訪問到中間主機,請求會被轉發到內網主機。
原創文章,作者:以馬內利,如若轉載,請注明出處:http://www.www58058.com/6619
關于:限制本地主機的web服務器在周一…… 的規則
我測試過,有些不對,過濾字符串admin、周一不允許訪問、速率限制的規則應該寫成一個規則,否則,過濾字符串的規則會不生效的。
如:iptables -A INPUT -p tcp –dport 80 -m time ! –weekdays Mon -m limit –limit 100/second -m string –algo kmp ! –string “admin” -j ACCEPT