iptables
Firewall:防火墻
隔離工具;Packets Filter Firewall;工作于主機或網絡的邊緣,對經由的報文根據預先定義的規則(匹配條件)進行檢測,對于能夠被規則匹配到的報文實行某預定義的處理機制的一套組件;
分類:
硬件防火墻:在硬件級別實現部分功能的防火墻;另一個部分功能基于軟件實現;
軟件防火墻:應用軟件處理邏輯運行于通用硬件平臺之上的防火墻;
主機防火墻:服務范圍為當前主機;
網絡防火墻:服務范圍為防火墻被的局域網;
iptables/netfilter:
netfilter:防火墻框架,framework;位于內核空間; iptables:命令行工具程序,位于用戶空間;規則管理工具;
iptables實現功能:hook function:鉤子函數 內部內建了五個鉤子
input:接收 output:本機發送 forward:本機轉發 prerouting:路由之前 postrouting:路由發生之后
ptables:CHAINS:在iptables中將鉤子成為鏈,必須大寫,在iptables中寫規則到鏈上時會被送到相應的鉤子上進行處理
鏈:數據包傳播路徑,規則的檢查清單,可以由一條或多條規則組成 當數據包到達一個鏈時,iptables就會從鏈中第一條規則開始檢查,查看該數據包是否滿足規則所定義的條件,決定是否按預定義的方法處理該數據包,如果包頭不符合鏈中的規則,iptables就會根據該鏈的默認策略來處理數據包。多個鏈柔和起來成為表;
tables:表:功能劃分(表的優先級由低到高如下)
filter:過濾,防火墻; nat:network address translation,網絡地址轉換; mangle:拆解報文,做出修改,并重新封裝; raw:關閉nat表上啟用的連接追蹤機制; 功能和鉤子的對應關系 raw:PREROUTING,OUTPUT mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING nat:PREROUTING,INPUT,OUTPUT,POSTROUTING filter:INPUT,FORWARD,OUTPUT
內置鏈:對應于hook function
PREROUTING剛進入本機、INPUT送往、FORWARD轉發、OUTPUT輸出、POSTROUTING離開本機報文
INPUT:過濾所有目標地址是本機的數據包(對進入本機數據包的過濾) OUTPUT:過濾所有本機產生的數據包(對源地址的數據包的過濾) FORWARD:過濾所有經過本機的數據包(源地址和目標地址都不是本機的數據包) PREROUTING:數據包到達防火墻時改變數據包的目標地址 POSTROUTING:在數據包離開防火墻時改變數據包的源地址
自定義鏈:
需要用戶自定義并指明調用,用于內置鏈的擴展和補充,實現靈活規則管理機制;
表所包含的鏈
raw:PREROUTING,OUTPUT mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING nat:PREROUTING,[INPUT,]OUTPUT,POSTROUTING filter:INPUT,FORWARD,OUTPUT
鏈檢查順序
鏈:鏈上的規則次序,即為檢查的次序; 1) 同類規則(訪問同一應用),匹配范圍小的放上面; 2) 不同類的規則(訪問不同應用),匹配到報文頻率較大的放在上面; 3) 將那些可由一條規則描述的多個規則合并起來; 4) 設置默認策略;
報文流向:
到本機某進程的報文:PREROUTING --> INPUT 由本機轉發的報文:PREROUTING --> FORWARD --> POSTROUTING 由本機的某進程發出報文:OUTPUT --> POSTROUTING
iptables規則的組成部分:
規則:根據指定的匹配條件來嘗試匹配每個流經此處的報文,一旦匹配成功,則由規則后面指定的處理動作進行處理; 匹配條件: 基本匹配條件:源地址,目標地址,傳輸層協議 擴展匹配條件:需要借助于擴展模塊進行指定的匹配條件 隱式擴展:已經在基本匹配條件中指明的協議相關的擴展; 顯式擴展:隱式擴展之外的其它擴展匹配條件; 處理動作: 基本動作:ACCEPT,DROP,... 擴展動作:需要借助于擴展模塊進行,但無須顯式指定,僅需指明動作; 添加規則時需要考量的問題: (1) 報文流經的位置:用于判斷將規則添加至哪個鏈; (2) 實現的功能:用于判斷將規則添加至哪個表; (3) 報文的方向:用于判斷哪個為“源”,哪個為“目標”; (4) 匹配條件:用于編寫能夠正確匹配目標報文的規則;
iptabls命令的使用格式:
程序包:iptables, iptstate iptables [-t table] {-A|-C|-D} chain rule-specification iptables [-t table] -I chain [rulenum] rule-specification iptables [-t table] -R chain rulenum rule-specification iptables [-t table] -D chain rulenum iptables [-t table] -S [chain [rulenum]] iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...] iptables [-t table] -N chain iptables [-t table] -X [chain] iptables [-t table] -P chain target iptables [-t table] -E old-chain-name new-chain-name rule-specification = [matches...] [target] match = -m matchname [per-match-options] target = -j targetname [per-target-options] 規則格式:iptables [-t table] COMMAND chain [-m matchname [per-match-options]]-j targetname [per-target-options] iptables [-t 表] [操作命令] [鏈] [[- m] 規則匹配] [-j 目標動作] 注意:鏈名和目標動作一定要大寫
-t table:
指明表明,類型raw、mangle、nat、filter,默認為filter,可以省略
COMMANDS:
1)鏈管理:
-P:iptables [-t table] -P chain target,定義鏈的默認策略;其target一般可使用ACCEPT或DROP; -N:iptables [-t table] -N chain,自定義規則鏈;僅在默認鏈通過某規則進行調用方可生效;因此,每個自定義鏈都有其引用記數; -X:iptables [-t table] -X [chain],刪除自定義的空的引用計數為0的鏈; -F:iptables [-t table] -F [chain [rulenum]] [options...],清空指定的鏈,或刪除指定鏈上的規則 ; -E:iptables [-t table] -E old-chain-name new-chain-name,重命名自定義的引用計數為0的鏈; -Z:iptables [-t table] -Z [chain [rulenum]] [options...]:置零指定鏈的計數器
2)規則管理:
-A:append, iptables [-t table] -A chain rule-specification,追加規則到指定的鏈尾部; -I:insert, iptables [-t table] -I chain [rulenum] rule-specification,插入規則到指定的鏈中的指定位置,默認為鏈首; -D:delete,iptables [-t table] -D chain rule-specification或iptables [-t table] -D chain rulenum,刪除指定的鏈上的指定規則; -R:replace,iptables [-t table] -R chain rulenum rule-specification,將指定的鏈上的指定規則替換為新的規則;
3)查看:
-L:list, iptables [-t table] -L [chain [rulenum]] [options...] -n:數字格式; -v:verbose,詳細格式信息;-vv, -vvv --line-numbers:顯示鏈上的規則的編號; x:exactly,顯示計數器的精確值;
計數器:
每條規則以及鏈的默認策略分別有各自的兩個計數器: (1) 匹配到的報文的個數:pkts (2) 匹配到的所有報文的大小之積:bytes
匹配條件:
1)基本匹配條件
注意:多重條件之間的隱含邏輯為“與”操作; [!] -s, --source address[/mask][,...]:檢查報文中的源IP地址是否符合此處指定的地址或地址范圍; [!] -d, --destination address[/mask][,...]:檢查報文中的目標IP地址是否符合此處指定的地址或地址范圍; [!] -p, --protocol protocol:檢查報文中傳輸層的協議類型,支持tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh,或者 "all"; [!] -i, --in-interface name:檢查報文進入本機時的接口是否符合本處指定的接口;INPUT, FORWARD and PREROUTING ; [!] -o, --out-interface name:檢查報文即將離開本機時經由的接口是否符合本處指定的接口;FORWARD, OUTPUT and POSTROUTING; -m, --match match:顯式指明要使用的擴展模塊; -j, --jump target:跳轉目標;
2)擴展匹配條件:需要加載擴展模塊,方可生效;
隱式擴展:不用-m選項明確給出要使用的擴展機制的擴展;此處主要指使用-p {tcp|udp|icmp}給定協議后可直接對給定的協議所進行的擴展; -p tcp:可直接使用tcp協議對應的擴展選項; [!] --source-port,--sport port[:port]:匹配報文中的傳輸層的源端口;可給出多個連接的端口; [!] --destination-port,--dport port[:port]:匹配報文中的傳輸層的目標端口;可給出多個連接的端口; [!] --tcp-flags mask comp SYN,ACK,FIN,RST,URG,PSH; mask:要檢查的標志位列表,以逗號分隔,例如SYN,ACK,FIN,RST comp:mask給定的眾標志位中,其值必須為1的標志位列表,余下的必須為0; 例如:“--tcp-flags SYN,ACK,FIN,RST SYN” 表示要檢查的標志位為SYN,ACK,FIN,RST四個,其中SYN必須為1,余下的必須為0; [!] --syn:用于匹配第一次握手,相當于--tcp-flags SYN,ACK,FIN,RST SYN -p udp:可直接使用udp協議對應的擴展選項; [!] --source-port,--sport port[:port]:匹配報文中的傳輸層的源端口;可給出多個連接的端口; [!] --destination-port,--dport port[:port]:匹配報文中的傳輸層的目標端口;可給出多個連接的端口; -p icmp:可直接使用icmp協議對應的擴展選項; [!] --icmp-type {type[/code]|typename} --icmp-type 0/0:匹配對ping請求的響應報文 --icmp-type 8/0:匹配ping請求報文 顯式擴展:必須使用-m選項給出matchname的擴展,而且有些擴展都還存在專用選項; 1、multiport 以離散或連續的方式定義的多端口匹配條件; 最多指定15個端口;. [!] --source-ports,--sports port[,port|,port:port]...:指定多個源端口; [!] --destination-ports,--dports port[,port|,port:port]...:指定多個目標端口; [!] --ports port[,port|,port:port]...:匹配此處指定的源或目標端口; 2、iprange 以連續的ip地址范圍指明多地址匹配條件; [!] --src-range from[-to]:源IP地址 [!] --dst-range from[-to]:目標IP地址; 3、string 對報文中的應用層數據做字符串匹配檢測; [!] --string pattern:要檢測的字符串模式; [!] --hex-string pattern:要檢測的字符串模式,16進制格式; --algo {bm|kmp}:字符串匹配檢查算法; --from offset --to offset 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...] 5、connlimit 根據每客戶端IP做并發連接數限制,即限制單IP可同時發起連接請求; --connlimit-upto n:連接數小于等于閾值; --connlimit-above n:連接數超出閾值; 示例:~]# iptables -I INPUT -d 10.1.0.6 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT 6、limit 基于收發報文的速率進行匹配; --limit rate[/second|/minute|/hour|/day] --limit-burst number 示例:~]# iptables -A INPUT -d 10.1.0.6 -p icmp --icmp-type 8 -m limit --limit-burst 3 --limit 20/minute -j ACCEPT 7.state擴展 根據”連接追蹤機制“去檢查連接的狀態,內核中的netfilter記錄實現:[!] --state state conntrack機制:追蹤本機上的請求和響應之間的關系;狀態有如下幾種: NEW:新發出請求;連接追蹤模板中不存在此連接的相關信息條目,因此,將其識別為第一次發出的請求; ESTABLISHED:NEW狀態之后,連接追蹤模板中為其建立的條目失效之前期間內所進行的通信狀態; RELATED:相關聯的連接;如ftp協議中的數據連接與命令連接之間的關系; INVALID:無效的連接; UNTRACKED:未進行追蹤的連接; 實例:~]# iptables -A INPUT -d172.16.100.67 -p tcp -m multiport --dports 22,80 -m state --stateNEW,ESTABLISHED -j ACCEPT ~]# iptables -A OUTPUT -s 172.16.100.67 -p tcp -m multiport --sports22,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= net.ipv4.netfilter.nf_conntrack_max= (2) 降低 nf_conntrack timeout時間 vi/etc/sysctl.conf net.ipv4.netfilter.nf_conntrack_tcp_timeout_established= net.ipv4.netfilter.nf_conntrack_tcp_timeout_time_wait= net.ipv4.netfilter.nf_conntrack_tcp_timeout_close_wait= net.ipv4.netfilter.nf_conntrack_tcp_timeout_fin_wait=
處理動作:-j targetname
-jtargetname [per-target-options] ACCEPT:允許數據包通過 DROP:丟棄數據包 REJECT:拒絕數據包,同時給發送者發送沒有接受的通知 RETURN:結束當前返回調用鏈; REDIRECT:端口重定向; LOG:記錄日志; MARK:做防火墻標記; DNAT:目標地址轉換; SNAT:源地址轉換; MASQUERADE:地址偽裝;關閉 ... 自定義鏈:
NAT:network addresstranslation,網絡地址轉換
NAT將局域網內每臺計算機的私網IP地址轉換成一個公網合法的IP地址,使局域網計算機能訪問Internet資源,節約地址空間。NAT和防火墻技術結合,把局域網內部的IP隱藏起來不被公網容易訪問,能夠有效避免來自外部網路的攻擊。
需要開啟內核路由核心轉發功能:/etc/sysctl.conf = 1
snat:source nat 源地址轉換 靜態轉換 動態轉換 dnat:destination nat 目標地址轉換 pnat:port nat 端口地址轉換 (1)snat:POSTROUTING, OUTPUT;讓本地網絡中的主機通過某一特定地址訪問外部網絡時; 2)dnat:PREROUTING;把本地網絡中的某一主機上的某服務開放給外部網絡中的用戶訪問時;
nat表的target:
(1)SNAT --to-source[ipaddr[-ipaddr]][:port[-port]] --random (2)DNAT --to-destination[ipaddr[-ipaddr]][:port[-port]] (3)MASQUERADE 源地址轉換:當源地址為動態獲取的地址時,MASQUERADE可自行判斷要轉換為的地址; --to-portsport[-port] --random (4)REDIRECT:端口重定向;
示例
SNAT示例: ~]#iptables -t nat -A POSTROUTING -s 192.168.12.0/24 -j SNAT --to-source172.16.100.67 MASQUERADE示例: ~]#iptables -t nat -A POSTROUTING -s 192.168.12.0/24 -j MASQUERADE DNAT示例: ]#iptables -t nat -A PREROUTING -d 172.16.100.67 -p tcp --dport 80 -j DNAT--to-destination 192.168.12.77 ~]#iptables -t nat -A PREROUTING -d 172.16.100.67 -p tcp --dport 80 -j DNAT--to-destination 192.168.12.77:8080 ~]#iptables -t nat -A PREROUTING -d 172.16.100.67 -p tcp --dport 22012 -j DNAT--to-destination 192.168.12.78:22 REDIRECT示例: ~]# iptables -t nat -A PREROUTING -I eth0 -ptcp -s 192.168.0.0/24 --dport 80 -j REDIRECT --to-ports 443
保存和載入規則:
保存:iptables-save > /PATH/TO/SOME_RULE_FILE 重載:iptables-restore < /PATH/FROM/SOME_RULE_FILE -n, --noflush:不清除原有規則 -t, --test:僅分析生成規則集,但不予提交; 注意:重載文件中的規則,會清除已有規則; CentOS 6: 保存規則:service iptables save 保存規則于/etc/sysconfig/iptables,保存操作會清除文件中原有的內容; 重載規則:server iptables restart 默認重載/etc/sysconfig/iptables文件中的規則 腳本配置文件:/etc/sysconfig/iptables-config 用于指明要裝載的模塊; 設置開機自動生效:用腳本保存各iptables命令;讓此腳本開機后自動運行; /etc/rc.d/rc.local文件中添加腳本路徑; /PATH/TO/SOME_SCRIPT_FILE CentOS 7開機自動生效規則: (1) firewalld服務; (2) shell腳本,直接記錄iptables命令; (3) 自定義unit file或init script;
規則優化的思路:
(1) 優先放行雙方向狀態為ESTABLISHED的報文; (2) 服務于不同類別的功能的規則,匹配到報文可能性更大的放前面; (3) 服務于同一類別的功能的規則,匹配條件較為嚴格的放前面; (4) 設置默認策略:白名單機制 (a) 可使用iptables -P設定默認策略; (b) 建議在規則鏈的最后定義規則做為默認策略;
如何開放被動模式的ftp服務:
(1) 裝載追蹤ftp協議的模塊; # modprobe nf_conntrack_ftp (2) 放行入站命令連接 # iptables -A INPUT -d SERVER_IP -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT (3) 放行入站數據連接 # iptables -A INPUT -d SERVER_IP -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT (4) 放行出站的ESTABLISHED連接 # iptabls -A OUTPUT -s SERVER_IP -m state --state ESTABLISHED -j ACCEPT
原創文章,作者:M20-1馬星,如若轉載,請注明出處:http://www.www58058.com/58119