iptables基本概念梳理
前言
netfilter/Iptables (其中包括netfilter和Iptables兩個組件)組 成了Linux平臺下的包過濾防火墻,它與大多數的Linux自帶軟 件一樣,這個防火墻是免費提供的,它可以代替昂貴的企業級 防火墻來解決實際問題與實際方案,完成封包過濾,封包重定 向和網絡地址轉換等功能。
一、工作原理
數據包從外網傳送到防火墻后,防火墻在IP層向TCP層傳 送之前,將數據包轉發給檢查模塊進行處理。其過程如下。
⑴ 首先與第一個過濾規則比較。
⑵ 如果與第一個模塊相同,則對它進行審核,判斷是否要 轉發該數據包,這時審核的結果是轉發數據包,則將數據包發 送到TCP層進行處理,否則就將它丟棄。
⑶ 如果與第一個過濾規則不同,則接著與第二個規則相 比較,如果相同則對它進行審核,過程與上一步相同。
⑷ 如果與第二個過濾規則不同,則繼續與下一個過濾規 則比較,直到與所有的過濾規則比較完成。要是不滿足所有過 濾規則,就將數據丟棄。
二、iptables規則集
規則就是決定如何處理一個包的語句。如果一個包符合 所有的條件(match),我們就運行target指令。
書寫規則的語法格式是:
Iptables [-t table] command [match] [target]
一條Iptables規則包含上面四個元素:表,命令,匹配,目標。
1、表
有四種 可用的表選項:filter、nat、mangle和raw。該選項不是必須的,如果 未指定,則filter用作默認表。
filter
filter表用來過濾數據包的,實現原理比較簡單,根據規則對數據包做DROP或者ACCEPT處理。下圖是信息包在filter表中的穿越過程。
NAT
NAT,Network Address Translation的縮寫,NAT表的主要用處是網絡地址的轉換,采用網絡地址轉換技術可提高內網安全性。當IP地址不足時,很多用戶使用私有IP地址來組建網絡,而這些私有地址又不能直接訪問Internet上的資源,針對這種情況也可以采用地址轉換技術來解決。NAT可以實現一個IP地址轉換為另一個或一組IP地址。下圖是包在NAT表中的處理過程。
PREROUTING鏈的作用是在包進防火墻時改變它的目的地址,OUTPUT鏈改變本地產生的包的目的地址。POSTROUTING鏈在包就要離開防火墻之前改變其源地址。
mangle
這個表的用途主要是用來Mangle數據包,可以改變不同的包及包頭的內容,比如TTL,TOS或MARK,這里要強調的是TOS并沒有真正的改變數據包內容,只是在內核空間為包做了一個標記,防火墻內其它程序可以用這種標記對包進行過濾或者高檔路由。這個表由五個內建的鏈組成:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
raw
優先級最高,設置raw一般是為了不再讓iptables做數據包的鏈接跟蹤處理,提高性能。raw:PREROUTING, OUTPUT。
鏈的概念
鏈是數據包傳播的路徑,一條鏈就是規則的一個檢查清單,每條鏈可以有一條或者多條規則。如果包頭不符合鏈中的規則,iptables就會根據該鏈的默認策略來處理數據包。
INPUT鏈:過濾所有目標地址是本機的數據包(對進入本機數據包的過濾)
OUTPUT鏈:過濾所有本機產生的數據包(對源地址的數據包過濾)
FORWARD鏈:過濾所有經過本機的數據包(源地址和目標地址都不是本機的數據包)
POSTROUTING鏈:在數據包離開防火墻時改變數據包的源地址
PEROUTING鏈:數據包到達防火墻時改變數據包的目的地址
2、命令
-A 增加一個規則到鏈中;
-D 在鏈中的指定位置刪除一個規則;
-R 在鏈中的指定位置替換一個規則;
-I 在鏈中的指定位置插入一個新的規則;
-N 產生一個新的鏈;
-X 刪除一個空的鏈;
-P 設置一個鏈的默認策略;
-L 列出一個鏈的規則;
-F 清空一個鏈的所有規則;
-Z 清零一個鏈里所有規則的包和字節計數器;
3、匹配
根據規則匹配所應有的特征,如源地址、目的地址和協議,將匹配分為五類:
第一類是generic matches:通用匹配,適用于所有的規則
第二類是TCP matches,只能適用于TCP包的匹配
第三類是UDP matches,主要用于UDP包的匹配
第四類是ICMP matches,用于ICMP包的
第五類針對的是特殊狀態的,如訪問的頻率限制等。
匹配條件:
基本匹配條件:無需加載任何模塊,由 iptables/netfilter 自行提供; [!] -s, --source address[/mask][,...]:檢查報文中的源 IP 地址是否符合此處指定的地址或范圍; [!] -d, --destination address[/mask][,...]:檢查報文中的目標 IP 地址是否符合此處指定的地址或范圍; [!] -p, --protocol protocol protocol: tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mhor "all" {tcp|udp|icmp} [!] -i, --in-interface name:數據報文流入的接口;只能應用于數據報文流入的環節,只能應用于 PREROUTING,INPUT 和 FORWARD 鏈; [!] -o, --out-interface name:數據報文流出的接口;只能應用于數據報文流出的環節,只能應用于 FORWARD、OUTPUT 和 POSTROUTING 鏈; 擴展匹配條件: 需要加載擴展模塊,方可生效; 隱式擴展:不需要手動加載擴展模塊;因為它們是對協議的擴展,所以,但凡使用-p 指明了協議,就表示已經指明了要擴展的模塊; tcp: [!] --source-port, --sport port[:port]:匹配報文的源端口;可以是端口范圍; [!] --destination-port,--dport port[:port]:匹配報文的目標端口;可以是端口范圍; [!] --tcp-flags mask comp mask is the flags which we should examine, written as a comma-separated list,例如 SYN,ACK,FIN,RST comp is a comma-separated list of flags whichmust be set,例如 SYN 例如:“--tcp-flags SYN,ACK,FIN,RST SYN”表示,要檢查的標志位為 SYN,ACK,FIN,RST 四個,其中 SYN 必須為 1,余下的必須為 0; [!] --syn:用于匹配第一次握手,相當于”--tcp-flags SYN,ACK,FIN,RST SYN“; udp [!] --source-port, --sport port[:port]:匹配報文的源端口;可以是端口范圍; [!] --destination-port,--dport port[:port]:匹配報文的目標端口;可以是端口范圍; icmp [!] --icmp-type {type[/code]|typename} echo-request:8 echo-reply:0 顯式擴展:必須要手動加載擴展模塊, [-m matchname [per-match-options]]; 使用幫助: CentOS 6: man iptables CentOS 7: man iptables-extensions 1、multiport 擴展 以離散方式定義多端口匹配;最多指定 15 個端口; [!] --source-ports,--sports port[,port|,port:port]...:指定多個源端口; [!] --destination-ports,--dports port[,port|,port:port]...:指定多個目標端口; [!] --ports port[,port|,port:port]...:指明多個端口; ~]# iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.67 -p tcp -m multiport --dports 22,80 -j ACCEPT 2、iprange 擴展 指明連續的(但一般不腦整個網絡)ip 地址范圍; [!] --src-range from[-to]:源 IP 地址; [!] --dst-range from[-to]:目標 IP 地址; ~]# iptables -A INPUT -d 172.16.100.67 -p tcp --dport 80 -m iprange --src-range 172.16.100.5-172.16.100.10 -j DROP 3、string 擴展 對報文中的應用層數據做字符串模式匹配檢測; --algo {bm|kmp}:字符串匹配檢測算法; bm:Boyer-Moore kmp:Knuth-Pratt-Morris [!] --string pattern:要檢測的字符串模式; [!] --hex-string pattern:要檢測的字符串模式,16 進制格式; ~]# iptables -A OUTPUT -s 172.16.100.67 -d 172.16.0.0/16 -p tcp --sport 80 -m string --algo bm --string "gay" -j REJECT 4、time 擴展 根據將報文到達的時間與指定的時間范圍進行匹配; --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]] --timestart hh:mm[:ss] --timestop hh:mm[:ss] [!] --monthdays day[,day...] [!] --weekdays day[,day...] --kerneltz:使用內核上的時區,而非默認的 UTC; ~]# iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.67 -p tcp --dport 80 -m time --timestart 14:30 --timestop 18:30 --weekdays Sat,Sun --kerneltz -j DROP 5、connlimit 擴展 根據每客戶端 IP 做并發連接數數量匹配; --connlimit-upto n:連接的數量小于等于 n 時匹配; --connlimit-above n:連接的數量大于 n 時匹配; ~]# iptables -A INPUT -d 172.16.100.67 -p tcp --dport 21 -m connlimit --connlimit-above 2 -j REJECT 6、limit 擴展 基于收發報文的速率做匹配; 令牌桶過濾器; --limit rate[/second|/minute|/hour|/day] --limit-burst number ~]# iptables -I INPUT -d 172.16.100.67 -p icmp --icmp-type 8 -m limit --limit 3/minute --limit-burst 5 -j ACCEPT ~]# iptables -I INPUT 2 -p icmp -j REJECT 7、state 擴展 根據”連接追蹤機制“去檢查連接的狀態; conntrack 機制:追蹤本機上的請求和響應之間的關系;狀態有如下幾種: NEW:新發出請求;連接追蹤模板中不存在此連接的相關信息條目,因此,將其識別為第 一次發出的請求; ESTABLISHED:NEW 狀態之后,連接追蹤模板中為其建立的條目失效之前期間內所進行的 通信狀態; RELATED:相關聯的連接;如 ftp 協議中的數據連接與命令連接之間的關系; INVALID:無效的連接; UNTRACKED:未進行追蹤的連接; [!] --state state ~]# iptables -A INPUT -d 172.16.100.67 -p tcp -m multiport --dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT ~]# iptables -A OUTPUT -s 172.16.100.67 -p tcp -m multiport --sports 22,80 -m state --state ESTABLISHED -j ACCEPT 調整連接追蹤功能所能夠容納的最大連接數量: /proc/sys/net/nf_contrack_max 已經追蹤到到的并記錄下來的連接: /proc/net/nf_conntrack 不同的協議的連接追蹤時長: /proc/sys/net/netfilter/ iptables 的鏈接跟蹤表最大容量為/proc/sys/net/ipv4/ip_conntrack_max,鏈接碰到各種狀態的超時后就會從表中刪除;當模板滿載時,后續的連接可能會超時解決方法一般有兩個: (1) 加大 nf_conntrack_max 值 vi /etc/sysctl.conf net.ipv4.nf_conntrack_max = 393216 net.ipv4.netfilter.nf_conntrack_max = 393216 (2) 降低 nf_conntrack timeout 時間 vi /etc/sysctl.conf net.ipv4.netfilter.nf_conntrack_tcp_timeout_established = 300 net.ipv4.netfilter.nf_conntrack_tcp_timeout_time_wait = 120 net.ipv4.netfilter.nf_conntrack_tcp_timeout_close_wait = 60 net.ipv4.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120 iptables -t nat -L -n
4、目標
目標是由規則指定的操作,對與那些規則匹配的信息包執 行這些操作:
ACCEPT:當信息包與具有ACCPET目標的規則完全匹配 時,會被接受(允許它前往目的地)。
DROP:當信息包與具有DROP目標的規則完全匹配時,會 阻塞該信息包,并且不對它作進一步處理。
REJECT:該目標的工作方式與 DROP目標相同,但它比 DROP好。REJECT不會在服務器和客戶機上留下死套接字。 另外,REJECT會將錯誤信息發回給信息包的發送方。
處理動作: -j targetname [per-target-options] ACCEPT DROP REJECT RETURN:返回調用鏈; REDIRECT:端口重定向; LOG:記錄日志; MARK:做防火墻標記; DNAT:目標地址轉換; SNAT:源地址轉換; MASQUERADE:地址偽裝; ... 自定義鏈:
三、iptables狀態機制
狀態機制是一種連接跟蹤機制,連接跟蹤可以讓Netfilter知道某個特定連接的狀態,通常運行連接跟蹤機制的防火墻稱作帶有狀態機制的防火墻,這種防火墻要比非狀態防火墻跟安全,因為它允許編寫更嚴密的規則。幾種狀態機制組合使用,用來匹配數據包,可以使防火墻效果更加顯著。
(1)NEW
表明這個包是第一個遇到的包,即某個連接第一個包,它即將被匹配了,NEW狀態。
(2)ESTABLISHED
ESTABLISHED其關注兩個方向上的數據傳輸,而且會繼續匹配這個連接報,處于ESTABLISHED狀態是比較容易理解的,只要發送并接到應答即為ESTABLISHED的了;一個連接要從NEW變為ESTABLISHED,只要接到響應即可。
(3)RELATED
RELATED是一個繁瑣的狀態,如果一個連接和某個已知處于ESTABLISHED狀態的連接有關系時,就認為是RELATED的了。首先要有一個ESTABLISHED的連接,這個連接再產生一個主連接之外的連接,這個連接就是RELATED的了。
(4)INVALID
INVALID說明數據包是無效的,即不能被識別,導致出現這種情況的因素有幾個,比如內存溢出等,收到不知屬于哪個連接的錯誤信息。一般情況下,會采用DROP來處理這個狀態的任何東西。
四、規則的檢查次序
(1)同類規則(訪問同一應用),匹配范圍小的放前面;用于特殊處理;
(2)不同類的規則(訪問不同應用),匹配范圍大的放前面;
(3)應該將那些可由一條規則描述的多個規則合并為一;
(4)設置默認策略;
五、規則優化:
服務器端規則設定:任何不允許的訪問,應該在請求到達時給予拒絕;
(1) 可安全放行所有入站的狀態為 ESTABLISHED 狀態的連接;
(2) 可安全放行所有出站的狀態為 ESTABLISHED 狀態的連接;
(3) 謹慎放行入站的新請求
(4) 有特殊目的限制訪問功能,要于放行規則之前加以拒絕;
六、如何開放被動模式的 ftp 服務?
(1) 裝載 ftp 連接追蹤的專用模塊: ~]# modproble nf_conntrack_ftp (2) 放行命令連接(假設 Server 地址為 172.16.100.67): ~]# iptables -A INPUT -d 172.16.100.67 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT ~]# iptables -A OUTPUT -s 172.16.100.67 -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT (3) 放行數據連接(假設 Server 地址為 172.16.100.67): ~]# iptables -A INPUT -d 172.16.100.67 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT ~]# iptables -I OUTPUT -s 172.16.100.67 -m state --state ESTABLISHED -j ACCEPT
七、規則的用效期限:
使用 iptables 命令定義的規則,手動刪除之前,其生效期限為 kernel 存活期限;
保存規則:
CentOS 6:
~]# service iptables save
將規則保存至/etc/sysconfig/iptables 文件中;
~]# iptables-save /PATH/TO/SOMERULESFILE
CentOS 7:
~]# iptables-save /PATH/TO/SOMERULESFILE
重新載入預存規則文件中規則:
~]# iptables-restore < /PATH/FROM/SOMERULESFILE
CentOS 6:
~]# service iptables restart (重載)
自動生效規則文件中的規則:
(1) 用腳本保存各 iptables 命令;讓此腳本開機后自動運行;
/etc/rc.d/rc.local 文件中添加腳本路徑:/PATH/TO/SOMESCRIPTFILE
(2) 用規則文件保存各規則,開機時自動載入此規則文件中的規則;
/etc/rc.d/rc.local 文件添加:iptables-restore < /PATH/FROM/IPTABLESRULESFILE
原創文章,作者:N24_yezi,如若轉載,請注明出處:http://www.www58058.com/64223