一、前言
什么是iptables?當我們啟動iptables時,使用service命令可以啟動iptables。但是并非使用service啟動的iptables就能說明其是一個服務。Iptables是一個便以我們寫規則的工具,真正起作用的是內核中的netfilter一個框架。Netfilter內置了5個hook函數,當一個數據包交由此機器時,經過這5個hook函數的其中某個才能進入用戶空間,或者轉發出去。
二、netfilter工作原理
當數據包到達目標主機時,經過PREROUTING鏈,經路由之后決定是否轉發,不轉發則進入INPUT鏈,到達用戶空間。進程對外通信時,經由OUTPUT鏈出去,路由之后到達POSTROUTING鏈,經網卡出去。當一數據包經過PREROUTING鏈發現其不是到達本主機,那么數據包經過FORWARD鏈,到達 POSTROUTING鏈轉發出去。本機進程對發送數據時,經由OUTPUT鏈路由之后進入POSTROUTING鏈出去。iptables匹配規則時,是自上而下匹配的,匹配到第一條規則時既跳出,否則一直往下匹配,沒有則使用默認規則。
五個hook函數分別是PREROUTING,INPUT ,OUTPUT,POSTROUTING,FORWARD,我們把這五個鉤子函數稱為鏈,Netfilter實現了幾功能,raw ,mangle,nat,filter。我們一般把這幾個功能稱為表,表之間有優先級關系,從低到高為filter—-nat—-mangle—-raw,表與鏈之間有對應關系,具體見圖表。
filter | INPUT | FORWARD | OUPUT | ||
nat | PREROUTING(DNAT) | POSTROUTING(SNAT) | OUTPUT | ||
mangle | PREROUTING | INPUT | FORWARD | OUTPUT | POSTROUTING |
raw | PREROUTING | OUTPUT |
iptables規則建立時,首先需要確定功能(表),確定報文流向,確定要實現的目標,確定匹配條件。iptables時,盡量遵循以下規則:盡量減少規則條目,彼此間無關聯,訪問條目大放上面,有關聯(同一功能),規則更嚴格的放上面
三、基本語法
iptables [-t TABLE] COMMAND CHAIN CRETIRIA -j TARGET
-t TABLE : TABLE為nat,mangle,raw,filter中的一個,默認為filter
COMMAND
鏈 : -F 清空規則鏈
-N 自建一條鏈
-X 刪除一條自定義空鏈
-Z 計數器歸零
-P 設置默認策略
-E 重命名自定義鏈
iptables –t nat -F iptables –t filter –N web_services iptables –t filter –X web_services iptables –t filter -Z iptables –t filter –P DROP iptables –t filter –E web_services www_services
規則:
-A 在規則鏈最后添加一條規則
-I 在規則鏈中插入一條規則,默認為第一條
-D 刪除一條規則鏈
-R 替換規則鏈
iptables –t filter –A www_services –p tcp –-dport 80 –j ACCEPT iptables –t filter –I www_services –p tcp –-dport 22 –j ACCEPT iptables –t filter –D www_services –p tcp –-dport 22 –j ACCEPT iptables –t filter –D www_services 1 iptables –t filter –R www_services –p tcp –dport 22 –j DROP
查看:
-L: List
子選項:
-n: numeric
-v, -vv, -vvv
-x: eXactly
–line-numbers
iptables –t filter –L –n –v
CRETIRIA
通用匹配:
-s, –src, –source:
-d, –dst, –destination:
-p {tcp|udp|icmp}:
-i IN_IF:
-o OUT_IF:
擴展匹配:
調用netfilter額外模塊實現特殊檢查機制,(使用到相關功能,要使用iptables命令的-m選項來指定調用哪個模塊)
隱式擴展:
-p tcp [-m tcp]
–sport PORT[-PORT]
–dport
–tcp-flag 要檢查標志位列表(用逗號分隔) 必須為1的標志位列表(逗號分隔)
-p icmp [-m icmp]
–icmp-type
0: echo-reply, ping響應
8: echo-request, ping請求
iptables -t filter -A INPUT -p icmp --icmp-type 8 -j DROP iptables -t filter -A INPUT -p tcp --tcp-flags syn,ack,rst,fin syn -j DROP iptables -t filter -A INPUT -p tcp --dport 80 --tcp-flags all none -j DROP
顯式擴展:
-m 擴展模塊名稱
模塊:iptables,netfilter各擁有一部分代碼
multiport: 多端口匹配,可用于匹配非連續或連續端口;最多指定15個端口;
–source-ports, –sports port[,port,port:port]
–destination-ports, –dports
–ports
iptables -I INPUT -d 192.168.19.128 -p tcp -m multiport --dports 22,80 -j ACCEPT iptables -I OUTPUT -s 192.168.19.128 -p tcp -m multiport --ports 22,80 -j ACCEPT
iprange: 匹配指定范圍內的地址,匹配一段連續的地址而非整個網絡時有用;
[!] –src-ragne IP[-IP]
[!] –dst-range
iptables -A INPUT -d 192.168.19.128 -p tcp --dport 23 -m iprange --src-range 192.168.19.129-192.168.19.135 -j ACCEPT iptables -A OUTPUT -s 192.168.19.128 -p tcp --sport 23 -m iprange --dst-range 192.168.19.129-192.168.19.135 -j ACCEPT
string: 字符串匹配,能夠檢測報文應用層中的字符串
–algo {kmp|bm}
–string "STRING"
–hex-string "HEX_STRING": HEX_STRING為編碼成16進制格式的字串;
iptables -I OUTPUT -m string –algo bm –string "sex" -j DROP
time: 基于時間做訪問控制
–datestart YYYY[-MM][-DD[Thh[:mm[:ss]]]]
–datestop
–timestart hh:mm[:ss]
–timestop hh:mm[:ss]
–weekdays day[,day]
iptables -I INPUT -d 192.168.19.128 -p tcp –dport 80 -m time –timestart 08:20 –timestop 18:00 –weekdays Mon,Tue,Thu,Fri -j REJECT
connlimit: 連接數限制,對每IP所能夠發起并發連接數做限制;
[!] –connlimit-above [n]
iptables -A INPUT -d 172.16.100.7 -p tcp –dport 22 -m connlimit –connlimit-above 2 -j DROP
limit: 速率限制
–limit n[/second|/minute|/hour|/day]
–limit-burst n
iptables -A INPUT -d 192.168.19.128 -p icmp –icmp-type 8 -m limit –limit 20/minute –limit-burst 5 -j ACCEPT
state: 狀態檢查
–state
連接追蹤中的狀態:
NEW: 新建立一個會話
ESTABLISHED:已建立的連接
RELATED: 有關聯關系的連接
INVALID: 無法識別的連接
iptables -t filter -A OUTPUT -p tcp –sport 22 -m state –state NEW -j DROP
放行被動模式下的FTP服務:
1、裝載模塊/lib/modules/KERNEL_VERSION/kernel/net/netfilter/
模塊:nf_conntrack_ftp
modprobe nf_conntrack_ftp lsmod | grep nf_conntrack_ftp nf_conntrack_ftp 12913 0 nf_conntrack 79758 3 nf_conntrack_ftp,nf_conntrack_ipv6,xt_state
2、放行請求報文:
(1)放行NEW狀態對21端口請求的報文;
iptables -A INPUT -p tcp –dport 21 -m –state NEW -j ACCEPT
(2) 放行ESTABLISHED以及RELATED狀態的報文
iptables -A INPUT -m –state ESTABLISHED,RELATED -j ACCEPT
3、放行響應報文:
(1) 放行ESTABLISHED以及RELATED狀態的報文
iptables -A OUTPUT -m –state ESTABLISHED,RELATED -j ACCEPT
由于系統對調整連接追蹤功能所能容納的連接有最大數目,視具體清空調整最大連接數目,或者不啟用此功能
cat /proc/sys/net/nf_conntrack_max
65536
其中當前追蹤的所有連接在/proc/net/nf_conntrack中
/proc/net/nf_conntrack
不同協議或連接類型追蹤時的屬性,/proc/sys/net/netfilter目錄:
TARGET: (-j target)
ACCEPT, REJECT, DROP, SNAT, DNAT, MASQERADE, RETURN, LOG, REDIRECT, MARK
SNAT:
–to-source SIP
DNAT
–to-destination
iptables -t nat -A POSTROUTING -p tcp --dport 23210 -j SNAT --to-source 192.168.19.129 iptables -t nat -A PREROUTING -p tcp --dport 23220 -j DNAT --to-destination 192.168.19.129 iptables -A INPUT -d 192.168.19.128 -p tcp --dport 80 -j LOG --log-prefix "from iptables: "
四、 案例
4.1、實驗拓撲圖
4.2、配置過程
搭建環境
在firewall添加一塊網卡,同時網絡連接為自定義–VMnet3,webserver和client的網絡連接也自定義在VMnet3上
Firewall配置ip,其中eth1網卡ip地址是自動獲取的
Webserver
添加網關
Client
添加網關
為了不讓已有iptables規則對實驗產生影戲,先清空規則鏈
在所有主機上執行這些命令
此時在webserver或client 上無法ping通外網
當需要使用轉發功能時,需要打開網絡轉發功能
Vim /etc/sysctl.conf
Net.ipv4.ip_forward=1
Sysctl –p
配置SNAT
或者
測試,在webserver上測試
遠程主機返回應答的包到目標主機時,沒有在防火墻上做地址轉換,卻依然能把數據包轉發給webserver,這是因為防火墻那臺主機上維持了一張轉換或的IP或端口對應表,故無需人為去添加轉換規則。
在防火墻上添加DNAT
在物理機上訪問172.16.0.2的網站
五、總結
iptables可做主機防火墻和網絡防火墻,做為網絡防火墻時需要打開轉發功能,iptables規則順序很重要,其自上而下匹配的規則鏈,故需要一條一條檢查規則鏈,故常用規則,特別是匹配次數大的放在上邊,同一規則更嚴格的條目放在上面。
原創文章,作者:成吉思汗,如若轉載,請注明出處:http://www.www58058.com/8950
贊,已置頂,有機會可以給大家分享寫blog經驗
@stanley:謝謝,新手不敢造次呀