歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> Linux技術

防火牆之 iptables詳解

一、防火牆介紹
防火牆,其實說白了講,就是用於實現Linux下訪問控制的功能的,它分為硬件的或者軟件的防火牆兩種。無論是在哪個網絡中,防火牆工作的地方一定是在網絡的邊緣。而我們的任務就是需要去定義到底防火牆如何工作,這就是防火牆的策略,規則,以達到讓它對出入網絡的IP、數據進行檢測。
目前市面上比較常見的有3、4層的防火牆,叫網絡防火牆,還有7層的防火牆,其實是代理層的網關。
對於TCP/IP的七層模型來講,我們知道第三層是網絡層,三層的防火牆會在這層對源地址和目標地址進行檢測。但是對於七層的防火牆,不管你源端口或者目標端口,源地址或者目標地址是什麼,都將對你的所有東西進行檢查。所以,對於設計原理來講,七層防火牆更加安全,但是這卻帶來了效率更低。所以市面上通常的防火牆方案,都是兩者結合的。而又由於我們都需要從防火牆所控制的這個口來訪問,所以防火牆的工作效率就成了用戶能夠訪問數據多少的一個最重要的控制,配置的不好甚至有可能成為流量的瓶頸。
二、iptables發展史
iptables 是與最新的 3.5 版本 Linux內核集成的 IP 信息包過濾系統。如果 Linux 系統連接到因特網或 LAN、服務器或連接 LAN 和因特網的代理服務器, 則該系統有利於在 Linux 系統上更好地控制 IP 信息包過濾和防火牆配置。
防火牆在做信息包過濾決定時,有一套遵循和組成的規則,這些規則存儲在專用的信 息包過濾表中,而這些表集成在 Linux 內核中。在信息包過濾表中,規則被分組放在我們所謂的鏈(chain)中。而netfilter/iptables IP 信息包過濾系統是一款功能強大的工具,可用於添加、編輯和移除規則。
雖然 netfilter/iptables IP 信息包過濾系統被稱為單個實體,但它實際上由兩個組件netfilter 和 iptables 組成。netfilter 組件也稱為內核空間(kernelspace),是內核的一部分,由一些信息包過濾表組成,這些表包含內核用來控制信息包過濾處理的規則集。
iptables 組件是一種工具,也稱為用戶空間(userspace),它使插入、修改和除去信息包過濾表中的規則變得容易。除非您正在使用 Red Hat Linux 7.1 或更高版本,否則需要下載該工具並安裝使用它
與Linux內核各版本集成的防火牆歷史版本:
2.0.X內核:ipfwadm
2.2.X內核:ipchains
2.4.X內核:iptables
二、iptables的四表五鏈
功能:表(table)
filter:過濾,防火牆;
mangle:拆解報文 ,按需修改;
nat: network address translation(ip層地址,傳輸層地址);
raw:關閉在nat表啟用的連接追蹤機制;
netfilter內置的五個鉤子
prerouting:路由前,數據報文剛到達本機還哦沒有路由的;
input:路由完之後,要到達本機內部來的;
forward:不到本機內部的,經由本機轉發的;
output:由本機內部向外發出的;
postrouting:即將發出去,馬上要離開本機網卡的報文;
報文流向:
流入本機:prerouting-->input==>用戶空間進程;
流出本機:用戶空間進程==>output-->postrouting;
轉發:prerouing-->forward-->postrouting



用戶自定義鏈:用於內置鏈進行補充擴展。可實現更靈活的規則組織管理機制;
表和鏈的對應關系,及優先級(由高到底:raw-->mangle-->nat-->filter);
表和鏈對應關系:
raw:PREROUTING , OUTPUT
mangle: PREROUTING , INPUT , FORWARD , OUTPUT, POSTROUTING
nat: PREROUTING , INPUT ,OUTPUT ,POSTROUTING
filter: INPUT , FORWARD , OUTPUT
添加規則時的考量點:
(1)要實現何種功能:判斷添加規則至哪個表上;
(2)報文流經的位置:判斷添加規則至哪個鏈上;



iptables的關閉和開啟:
CentOS 7:
~]# systemctl stop firewalld.service
~]# systemctl disable firewalld.service
CentOS 6:
~]#service iptables stop
~]#chkchonfig iptables off
三、iptables命令(以CentOS 7為例)
命令格式: iptables [-t table] SUBCOMMAND chain [matches...] [-j target]
3.1 -t table:指定表,不指默認是filter表
raw, mangle, nat, [filter]
3.2 SUBCOMMAND:
1)、 鏈管理:遠程連接時,DROP使用要慎重。
-N: new ,新增一條自定義鏈;



policy:默認策略; 0 references :引用計數為0。
-X: delete,刪除自定義的空鏈;(有規則的鏈的先清除規則 -F)
-P : policy,設置鏈的默認策略;
ACCEPT:接受
DROP:丟棄,
REJECT:拒絕
注意:DROP和REJECT設置時,一般設置為DROP。
示例,把filter表中的FORWARD鏈設置為DROP



-E : rename,重命名自定義的未被引用(引用計數為0)的鏈;



2)、 規則管理:
-A:append ,追加,默認為最後一個;
示例: 允許所有192.168網段的主機ping本主機(192.168.1.107)


-I:insert,插入,默認為第一個;



-D:delete,刪除
(1)rule specification
(2)rule number



-R: replace ,替換
-F:flush ,沖刷,清洗
-Z:zero ,置0 ;
iptables的每條規則都有兩個計數器:
(1)由本規則匹配到得所有的packets;
(2) 由本規則匹配到得所有的bytes;
-S:selected ,以 iptables-save命令的格式顯示鏈上的規則;



3)、查看:
-L: lsit,列出規則
-n: numeric ,以數字格式顯示地址和端口;
-v:verbose ,詳細信息;-vv,-vvv
-x: exactiy,顯示計數器的精確值而非單位換算後的結果;
--line-numbers:顯示鏈上的規則的編號;
組合:-nvL






3.3 匹配條件
1)基本匹配:netfilter自帶的匹配機制
[!] -s, --source address[/mask][,...] :原地址匹配
[!] -d, --destination address[/mask][,...] :目標地址匹配



[!] -i, --in-interface name :限制報文流入的接口,只能用於PREROUTING,INPUT及FORWARD;
[!] -o, --out-interface name :限制報文流出的接口,只能用於OUTPUT,FORWARD,POSTROUTING;
2)擴展匹配:經由擴展模塊引入的匹配機制,需要加載擴展模塊;-m mathchname
隱式擴展:可以不用使用-m選項專門加載相應模塊;前提是使用-p選項可匹配何種協議;
[!] -p,--protocol PROTOCOL PROTOCOL:
協議:tcp,udp,icmp,icmpv6,esp,ah,sctp,mh or "all"
tcp:隱含指明了“-m tcp,有專用選項:
[!] --source-port,--sport port[:port] :匹配報文中tcp首部的源端口;可以是端口范圍;
[!] --destination-port,--dport port[:port]:匹配報文中的tcp首部的目標端口,可以是端口范圍;
[!]--tcp-flags mask comp :檢查報文中的mask指明的tcp標志位,而要這些標志位comp中必須為1;
--tcp-flags syn,fin,ack,rst syn
--tcp-flags syn,fin,ack,rst ack,fin
[!] --syn:
--syn相當於“--tcp-flags syn,fin,ack,rst syn” ;tcp三次握手的第一次
示例:允許其他任何主機訪問本機的80端口



udp:隱含指明了“-m udp”,有專用選項:
[!] --source-port,--sport port[:port]:匹配報文中的udp首部的源端口;可以是端口范圍;
[!] --destination-port,--dport port[:port]:匹配報文中的udp首部的目標端口;可以是端口范圍;
icmp:隱含 指明了“-m icmp”,有專用選項;
[!]--icmp-type {type[/code] | yypename}
type/code:
0/0:echo reply
8/0:echo request
總結:本機為服務器是,其他主機請求本機,入棧為8,出棧為0;本機請求其他服務器時,出棧為8,入棧為0。
示例1:允許本機ping其他主機,不允許其他主機ping本機。



示例2:允許其他主機ping本機。



顯示擴展:必須由-m選項專門加載相應模塊
multiport:多端口匹配
以離散方式定義多端口匹配,最多可以指定15個端口;
[!]--source-ports,--sports port[,port|,port:port]...
[!]--destination-ports,--dports port[,port|,port:port]...
[!]--ports port[,port|,port:port]...
示例:
~]# iptables -I INPUT -s 0/0 -d 172.18.100.6 -p tcp -m multiport --dports 22,80 -j ACCEPT
~]# iptables -I OUTPUT -d 0/0 -s 172.18.100.6 -p tcp -m multiport --sports 22,80 -j ACCEPT
iprange:指明一段連續的ip地址范圍作為源地址或目標地址匹配;
[!]--src-range from[-to]:源地址范圍
[!]--dst-range from[-to]:目標地址范圍
string:對報文中的應用層數據做字符串匹配檢測;
--algo {bm | kmp}:
(bm = Boyer-Moore ,kmp = Knuth-Pratt-Morris)
[!]--string pattern:指定要檢查的字符串模式;
[!]--hex-string pattern:給定要檢查的字符串模式;
示例:
~]# iptables -I OUTPUT -s 172.18.100.6 -d 0/0 -p tcp --sport 80 -m string --algo bm --string "old" -j REJECT
time:根據收到報文的時間/日期與指定的時間/日期范圍進行匹配;
--datastart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] :起始日期時間
--datastop YYYY[-MM[-DD[Thh[:mm[:ss]]]]] :結束日期時間
[!]--monthdays day[,day...]匹配一個月中的哪些天
[!]--weekdays day[,day...]匹配一個周中的哪些
示例:
~]# iptables -R INPUT 4 -d 172.18.100.6 -p tcp --dport 23 -m iprange 172.18.100.1-17.18.100.100 -m time --timestart 09:00:00 --timestop 16:00:00 --weekdays 1,2,3,4,5 -j ACCEPT
connlimit:根據每客戶端主機做並發連接數限制,即每客戶端最多可同時發起的連接數量;
--connlimit-upto n:連接數量小於等於n則匹配;
--connlimit-above n:連接數量大於n則匹配;
示例:
~]# iptables -A INPUT -s 0/0 -d 172.18.100.6 -p tcp --dport 23 -m connlimit-upto 2 -j ACCEPT
limit:基於令牌桶算法對報文的速率做匹配;
This module mathches at a limited rate using a token bucket filter.
--limit rate[/second | minute | /hour | /day]
--limit-burst number
示例:
~]# iptables -R INPUT 3 -d 172.18.100.6 -p icmp --icmp-type 8 -m limit --limit 20/minute --limit-burst 3 -j ACCEPT
state:是conntrack的子集,用於對報文的狀態做連接追蹤;
INVALID:無法識別的連接;
ESTABLISHED:連接追蹤模塊當中存在記錄的連接;
NEW:連接追蹤模板當中不存在的連接請求;
RELATED:相關聯的連接;
UNTRACKED:未追蹤的連接;
已經追蹤到得記錄下來的連接:
/proc/net/nf_conntrack
連接追蹤功能所能夠記錄的最大連接數量(可調整):
/proc/sys/net/nf_conntrack_max
sysctl -w net.nf_conntrack_max=300000
echo 300000 >/proc/sys/net/nf_conntrack_max
conntrack所能夠追蹤的連接數量的最大值取決於/proc/sys/net/nf_conntrack_max的設定;已經追蹤到的並記錄下來的連接位於/proc/net/nf_conntrack文件中,超時的連接將會被刪除;當模板滿載時,後續的新連接有可能會超時;
解決辦法:
(1)加大nf_conntrack_max的值
(2)降低nf_conntrack條目的超時時長;
不同協議的連接追蹤時長:/proc/sys/net/netfilter/
如何放行被動模式的ftp服務?
(1)內核加載 nf_conntrack_ftp模塊;
modprobe nf_conntrack_ftp
(2)放行命令連接
# iptables -A INPUT -d $sip -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
# iptables -A OUTPUT -s $sip -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT
(3)放行數據連接
# iptables -A INPUT -d $sip -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
# iptables -A OUTPUT -s $sip -p tcp -m state --state ESTABLISHED -j ACCEPT
4、處理動作:
-j targetname [per-target-options]
ACCEP,DROP,REJECT
RETURN:返回調用的鏈
REDIRECT:端口重定向
LOG:日志
MARK:防火牆標記
DNAT:目標地址轉換
SNAT:源地址轉換
MASQERADE:地址偽裝
REDIRECT: This target is only valid in the nat table, in the PREROUTING and OUTPUT chains, and user-defined chains which are only called from those chains. It redirects the packet to the machine itself by changing the destination IP to the primary address of the incoming interface --to-ports port[-port] 示例: ~]# iptables -t nat -A PREROUTING -d 172.18.100.67 -p tcp --dport 80 -j REDIRET --to-ports 8080
LOG:
Turn on kernel logging of matching packets.if you want to LOG the packets you refuse, use two separate rules with the same matching criteria, first using target LOG then DROP (or REJECT).
--log-level level
emerg, alert, crit, error, warning, notice, info or debug
--log-prefix prefix
示例:
~]# iptables -I FORWARD 2 -s 10.0.1.0/24 -p tcp -m multiport --dports 80,21,22,23 -m state NEW -j LOG --log-prefix "(new connctions)"
NAT:Network Address Translation
SNAT:source NAT
修改IP報文中的源IP地址
讓本地網絡的主機可使用統一地址與外部主機通信,從而實現地址偽裝;
請求:修改源IP,如果修改則由管理員定義;
響應:修改目標IP,由nat自動根據會話表中追蹤機制實現相應修改;
DNAT:destination NAT
修改IP報文中的目標IP地址;
讓本地網絡中的服務器使用統一的地址向外提供服務(發布服務),但隱藏了自己的真實地址;
請求:由外網主機發起,修改其目標地址,由管理員定義;
響應:修改源地址,但由nat自動根據會話表中的追蹤機制實現對應修改;
PNAT:port NAT
SNAT發生在PSTROUTING
DNAT發生在RPEROUTING
SNAT:
This target is only valid in the nat table, in the POSTROUTING and INPUT chains, and user-defined chains which are only called from those chains.
--to-soure [ipaddr[-ipaddr]][:port[-port]]
DNAT
This target is only valid in the nat table, in the PREROUTING and OUTPUT chains, and user-defined chains which are only called from those chains.
--to-destination [ipaddr[-ipaddr]][:port[-port]]
MASQUERADE: This target is only valid in the nat table, in the POSTROUTING chain. It should only be used with dynamically assigned IP (dialup) connections: if you have a static IP address, you should use the SNAT target.
5、規則的檢查和保存
規則的檢查的次序:規則在鏈接上的次序即為其檢查時的生效次序;因此,其優化使用有一定法則;
(1)同類規則(訪問同一應用),匹配范圍小的放前面;用於特殊處理;
(2)不同類的規則(訪問不同應用),匹配范圍大的放前面
(3)應該將那些可由一條規則描述的多個規則合並為一;
(4)設置默認策略;
規則的有效期限:
iptables命令添加的規則,手動刪除之前,其生效期限為kernel的生命周期;
保存規則:
CentOS 6:
                            ~]# service  iptables  save 
                            ~]# iptables-save  > /etc/sysconfig/iptables
                            ~]# iptables-save  >  /PATH/TO/SOME_RULE_FILE
	                    ~]#service  iptables  restart
		            
		                重啟後會自動從/etc/sysconfig/iptables文件中重載規則;

                CentOS 7:
                            ~]# iptables  -S  > /PATH/TO/SOME_RULE_FILE
                            ~]# iptables-save  >  /PATH/TO/SOME_RULE_FILE

                    重載預存的規則
                            ~]# iptables-restore  <  /PATH/FROM/SOME_RULE_FILE

                    自動生效規則文件中的規則:
                        (1) 把iptables命令放在腳本文件中,讓腳本文件開機自動運行;
                            /etc/rc.d/rc.local
                                /usr/bin/iptables.sh

                        (2) 用規則文件保存規則,開機自動重載命令;
                            /etc/rc.d/rc.local
                                iptables-restore  <  /PATH/FROM/SOME_RULE_FILE
Copyright © Linux教程網 All Rights Reserved