关于iptables
防火墻(Firewalld)是一種隔離工具,防范與非授權的訪問,使主機更安全。它主要工作與網絡或主機的邊緣,對于進出本網絡或主機的通信報文根據事先定義好的規則進行匹配檢測;對于能夠被規則所匹配到的報文做出相應的處理。
??? 防火墻的分類:
??? 主機防火墻:工作范圍是單個主機
??? 網絡防火墻:工作范圍是整個網絡;網絡防火墻中還可以包含主機防火墻
??? 防火墻的實現方式:
????? 硬件防火墻:NetScreen、CheckPoint
????? 軟件防火墻:iptables
本文所介紹的iptables就是Linux的軟防火前的實現。
?iptables最主要的特點就是4表5鏈,以及每種不同的表所對應不同的鏈; ??
??? 5鏈:prerouting、input、output、forward、postrouting
??? 4表:filter、mangle、nat、raw
????? filter:主要功能是過濾;對應的鏈為:input、output、forward
????? mangle:主要功能是拆解報文、做出修改、重新封裝;對應的鏈為:prerouting、input、output、forward、postrouting
????? nat:主要功能是網絡地址轉換;對應的鏈為:prerouting、postrouting、output
????? raw:在限定的時間范圍內,關閉在nat表上的啟用的連接追蹤機制;對應的鏈為:output、prerouting
????同一鏈上的不同表的應用優先級:raw、mangle、nat、filter
報文在主機內的流向示意圖:
報文流向有兩種:
??? 流入本機的報文:報文流入-->prerouting-->input-->output-->postrouting-->報文流出
??? 由本機轉發報文:報文流入-->prerouting-->forward-->postrouting-->postrouting
??? 注意:報文是由本機處理,但是是否轉發是由路由來決定的;在報文流入本機之后,路由1會判斷報文的目標地址是否為本機,如果是,則流入input;如果不是,則流入forwrad,在報文離開本機之前路由2會判斷報文經由那個接口送往下一個網關(下一跳),同時在轉發之前,要確保轉發功能是開啟的;1表示開啟,0表示關閉:
[root@wtc?~]#vim??/etc/sysctl.conf [root@wtc?~]#net.ipv4.ip_forward?=?0??##?把0更改為1即為開啟 [root@wtc?~]#/sbin/sysctl?-p??????##修改之后立即生效iptables的規則:根據規則匹配條件嘗試匹配檢查報文,對成功匹配的報文做出相應的處理
?????? 組成部分:匹配條件、處理動作
??????? 匹配條件:基本匹配、擴展匹配
??????? 處理動作:基本處理動作、擴展處理動作、自定義處理動作
??????? 注意:添加規則時的考量點;
??????? (1)要實現什么樣的功能;判斷添加至那個表上
??????? (2)報文流經的位置;判斷添加至那個鏈上
??????? (3)同類的規則,匹配范圍小的放在前面,用于特殊處理
??????? (4)不同類的規則,匹配范圍大的放在前面
??????? (5)將那些可由一條規則描述的多個規則合并為一個
??????? (6)設置默認策略
iptables的相關命令:???
??? iptables [-t table] {-A|-C|-D} chain rule-specification
????
????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...] [ -j target]
實現對鏈管理:管理一整條鏈
????? -N:新增一條自定義鏈
????? -X:刪除一條自定義鏈(刪除時要確保鏈下沒有規則)
????? -P:設置鏈的默認策略
????? -E:重命名于未被引用的自定義鏈(引用計數為0,即references為0)
實現對規則管理:管理鏈上的某條規則?????
???? -A:追加一個規則;默認為末尾
???? -I:插入一個規則;默認為最開始處
???? -D:刪除某條規則
???? -R:指明修改第幾條規則
???? -F:清空所有的規則
查看某表上的規則:
???? -L:列出規則
???? -n:以數字格式顯示地址個端口
???? -v:顯示詳細信息
???? --line-numbers:顯示鏈上的規則和編號
???? -x:顯示計數器的精確值
匹配條件:
????基本匹配:netfilter自帶的匹配機制?? ????????????????
????? [!] -s, --source address[/mask][,...]:原地址匹配(!s是取反)
????? [!] -d, --destination address[/mask][,...]:目標地址匹配
????? [!] -i, --in-interface name:限制報文流入的接口(只能用于prerouting、input、forward這三個鏈)
? ? ? [!] -o, --out-interface name:限制報文流出的接口(只能用于output、forward、postrouting這三個鏈)
? ? ? [!] -p{tcp|udp|icmp}:限制協議;指明用哪一種協議
[root@wtc?~]#iptables??-A???INPUT??-s??172.18.0.0/18??-d?172.18.42.200??-p??tcp??-j??ACCEPT [root@wtc?~]#iptables??-A???OUTPUT?-s??172.18.42.200??-d?172.18.0.0/16??-p??tcp??-j??ACCEPT?擴展匹配:經由擴展模塊引入的匹配機制;-m? matchname
??????隱式擴展:無需指明,可以不適用-m選項專門加載響應模塊;前提要使用-p選項可匹配何種協議
??????顯示擴展:需要指明,必須由-m選項專門加載響應模塊
隱式擴展:??? ????????????????????
?????????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
????????????? ????此時: syn必須為1
? [!] --syn:
? ? ?--syn相當于"--tcp-flags? syn,fin,ack,syn“,tcp中的第一次握手
[root@wtc?~]#?iptables?-A?INPUT?-s?0/0?-d?10.0.1.2?-p?tcp?--dport?80?--tcp-flags?SYN,ACK,FIN,RST?SYN??-j?ACCEPT [root@wtc?~]#?iptables?-A?INPUT?-d?0/0?-s?10.0.1.2?-p?tcp?--sport?80?-j?ACCEPTudp:??? ????????????????
? [!]? --source-port,--sport? port[:port]:匹配報文中的tcp首部的源端口;可以是端口范圍
? [!] --destination-port,--dport? port [:port]:匹配報文中的tcp首部的目標端口;可以是端口范圍
????????
????????icmp:隱含指明了“-m icmp”,有專用選項
? ? ? ? ?? ????[!] --icmp-type ?{type[/code][typename]
???????????? type/code:
???????????? 0/0:表示響應
???????????? 0/8:表示請求
[root@wtc?~]#iptables??-A?INPUT??-s?0/0?-d?172.18.42.200?-p?icmp?--icmp-type?8?-j?ACCEPT [root@wtc?~]#iptables??-A?OUTPUT?-s?172.18.42.200?-d?0/0?-p?icmp?--icmp-type?0?-j?ACCEPT?顯示擴展:??? ????????????????????
????(1)multiport擴展:以離散方式定義多端口匹配;最多指定15個端口;?
? [!] --source-ports,--sports port[,port|,port:port]...:指定多個源端口;
? [!] --destination-ports,--dports port[,port|,port:port]...:指定多個目標端口;
? [!] --ports port[,port|,port:port]...:同時匹配多個端口(指明多個端口;)
[root@wtc?~]#iptables??-A?INPUT??-s?0/0?-d?172.18.42.200?-p?tcp?-m?multiport?--dports?80,22?-j?ACCEPT [root@wtc?~]#iptables??-A?OUTPUT?-s?172.18.42.200?-d?0/0?-p?tcp?-m?multiport?--sports?80,22?-A?ACCEPT(2)iprange擴展:指明一段連續的ip地址范圍作為源地址或目標地址匹配?
? [!] --src-range from[-to]:源IP地址;
? [!] --dst-range from[-to]:目標IP地址;
[root@wtc?~]#iptables?-A?INPUT??-d?172.18.42.200?-p?tcp?-dport?80?-m?iprange?--src-range?172.18.42.1-172.18.42.100?-j?ACCEPT [root@wtc?~]#iptables?-A?OUTPUT?-s?172.18.42.200?-p?tcp?-sport?80?-m?iprange?--dst-range?172.18.42.1-172.18.42.100?-j?ACCEPT(3)string擴展:對報文中的應用層數據做字符串模式匹配檢測;
????????--algo {bm|kmp}:字符串匹配檢測算法;
????????bm:Boyer-Moore
????????kmp:Knuth-Pratt-Morris
? ?[!] --string pattern:要檢測的字符串模式;
? ?[!] --hex-string pattern:要檢測的字符串模式(16進制格式);
[root@wtc?~]#iptables?-I?OUTPUT?-s?172.18.42.200?-d?0/0?-p?tcp?-sport?80?-m?string?--algo?bm?--string?"wtc"?-j?A?DROP注意:要求越嚴格的越要放在前面;之所以使用“OUTPUT”是因為在接受了報文之后才能夠響應輸出;如果直接是“INPUT”使用“DROP”,則報文會被直接拒絕,根本不會流入本機內部
(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...]:匹配1-12月中的某些天
? [!]--weekdays day[,day...]:匹配一個周中的某些天
????????--kerneltz:使用內核上的時區,而非默認的UTC;
[root@wtc?~]#iptables?-A?INPUT?-s?0/0?-d?172.18.42.200?-p?tcp?-dport?80?-m?time?--timestart?08:30:00?--timestop?18:00:00?--weekdays?1,2,3,4,5?-j?ACCEPT(5)connlimit擴展:根據每客戶端IP做并發連接數數量匹配;即每客戶端最大可同時發起的連接數量
????????--connlimit-upto n:連接的數量小于等于n時則匹配;
????????--connlimit-above n:連接的數量大于n時匹配
[root@wtc?~]#iptables?-A?INPUT?-s?0/0?-d?172.18.42.200?-p?tcp?-dport?80?-m?connlimit?--connlimit-upto?20?-j?ACCEPT?(6)limit擴展:基于收發報文的速率做匹配;
????????--limit rate[/second|/minute|/hour|/day]
????????--limit-burst number?
[root@wtc?~]#iptables?-A?INPUT?-s?0/0?-d?172.18.42.200?-p?tcp?-dport?80?-m?limit?--limit?20/second?--limit-burst?5?-j?ACCEPT(7)state擴展(conntrack的子集):用于對報文的根據”連接追蹤機制“去檢查連接的狀態(但是對服務的連接數量會有很大的影響)
????????連接模板:占用內存空間中的一段空間(內核空間)
????????[!] --state state?
????????conntrack機制:追蹤本機上的請求和響應之間的關系;狀態有如下幾種:
????????NEW:新發出請求;連接追蹤模板中不存在此連接的相關信息條目,因此,將其識別為第一次發出的請求;
??????? ESTABLISHED:NEW狀態之后,連接追蹤模板中為其建立的條目失效之前期間內所進行的通信狀態;
??????? RELATED:相關聯的連接;如ftp協議中的數據連接與命令連接之間的關系;
??????? INVALID:無法識別的連接(一般不會放行)
??????? UNTRACKED:未進行追蹤的連接(在連接模板中沒有相關記錄)? ? ? ? ? ??
[root@wtc?~]#iptables?-A?INPUT??-m?state?--state?ESTABLISHED?-j?ACCEPT [root@wtc??~]#iptables??-A?OUTPUT??-s?172.18.42.200?-d?0/0?-p?tcp?-sport?80?-m?state?--state?NEW?-j?ACCEPT查看連接追蹤功能所能夠容納的最大連接數量:
??????? /proc/sys/net/nf_conntrack_max
??????? 修改鏈接追蹤功能所能夠容納的最大連接數量
??????? echo? Num? >? /proc/sys/net/nf_conntrack_max
??????? sysctl? -w? net.nf_conntrack_max=Num
????????缺點:如果連接模板超載,當有一個新的請求時,web網頁會顯示連接超時;同時conntrack所能夠連接數量的最大值取決于/proc/sysnet/nf_conntrack_max的設定;已經追蹤到的記錄并記錄在/prco/net/nf_conntrack文件中,但當模板滿載時,后續的新連接可能會被超時,而連接超時的時長將會被刪除;解決的辦法有兩個
????(1)加大nf_conntrack_max的值
[root@wtc?~]#?vim?/proc/sys/net/netfilter/nf_conntrack_max(2)降低nf_conntrack_timeout文件的的時間(不同協議的連接追蹤時長不同)
[root@wtc?~]#vim?/proc/sys/net/netfilter/nf_conntrack_tcp_timeout_time_wait [root@wtc?~]#vim?/proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established [root@wtc?~]#?vim?/proc/sys/net/netfilter/nf_conntrack_tcp_timeout_fin_wait [root@wtc?~]#?vim?/proc/sys/net/netfilter/nf_conntrack_tcp_timeout_close_wait開放主/被動模式的ftp服務:
????????主動:
[root@wtc?~]#iptables??-A?INPUT?-d?172.18.42.200?-p?tcp?--dport?21?-m?state?--state?ESTABLISHED?-j?ACCEPT [root@wtc?~]#iptables?-A?OUTPUT?-s?172.18.42.200?-p?tcp?--sport?21?-m?state?--state?ESTABLISHED?-j?ACCEPT? 被動:
[root@wtc??~]#modprobe?nf_conntrack_ftp??##內核加載nf_conntarck_ftp模塊 [root@wtc??~]#iptables?-A?INPUT?-m?state?--state?ESTABLISHED?RELATED?-j?ACCEPT [root@wtc??~]#iptables?-A?OUTPUT?-s?172.18.42.200?-p?tcp?--sport?21?-m?state?--state?NEW?-j?ACCEPT?保存編寫好的規則并開機啟動
[root@wtc?~]#server?iptables?save? [root@wtc?~]#iptables:?Saving?firewall?rules?to?/etc/sysconfig/iptables:[??OK??]??##系統默認的保存路徑 [root@wtc?~]#iptables-save?>?/path/to/rule_file??##?可自己指明保存的路徑 [root@wtc?~]#chkconfig??iptables?on??##設置為當前規則可開機啟動 [root@wtc?~]#service??iptables??restart??##會自動從系統默認的保存路徑中重載規則處理動作:
????(1)LOG:匹配報文中的日志功能
? ? ? ? --log-level? level:(emerg, alert, crit, error, warning, notice,info or debug.)
? ? ? ? --log-prefix? prefix:說明報文的日志信息是由誰產生的
[root@wtc?~]iptables?-A?FORWARD?-m?state?--state?ESTABLISHED?-j?ACCEPT [root@wtc?~]iptables?-A?FORWARD?-s?0/0?-d172.18.42.200?-p?tcp?-m?multiport?--dports?80,21,23,22?-m?state?-state?NEW?-j?LOG?--log-prefix?"(wtc's?log)"(2)REDIRECT:端口重定向(之后在報文流入本機前才有用:prerouting)
????????--to-ports port[-port]:映射到某個端口上
[root@wtc?~]iptables?-t?nat?-A?PREROUTING?-d?172.18.42.200?-p?tcp?80?-j?REDIRECT?--to-ports?172.18.42.201:8080 ##?此命令是把80的端口映射在8080上,雖然訪問的是80,但正真提供服務的是8080(3)SNAT(本地主機請求遠程服務器):源地址轉換;發生在postrouting
????????修改IP報文中的源IP地址
????????使用場景:本地網絡中的主機可使用統一地址與外部主機通信,從而實現地址偽裝
????????請求:由內網主機發起,修改源IP,如果修改則由管理員定義
????????響應:修改目標IP,由nat自動根據會話表中追蹤機制實現相應的修改
????????--to-source [ipaddr[-ipaddr]][:port[-port]]
[root@wtc?~]iptables?-t?nat?-A?POSTROUTING?-s?172.18.42.200?-d?172.18.42.201?-p?tcp?--dport?80?-j?SNAT?--to-source?172.18.42.202 ##請求80端口的是172.18.42.202主機,但正在請求的卻是172.18.42.200主機(4)DNAT(遠程主機請求本地服務器):目標地址轉換;發生在prerouting????????????
????????修改IP報文中的目標IP
????????使用場景:讓本地網絡中的吳福氣使用統一的地址想外提供服務,但隱藏了自己的真實地址
????????請求:有外網主機發情,修改其目標地址,由管理員定義
????????響應:修改源地址,但由nat自動根據會話表中的追蹤機制來實現相對應的修改
????????--to-destination? [ipaddr[-ipaddr]] [:port[-port]]
[root@wtc?~]iptables?-t?nat?-A?PREROUTING?-s?172.18.42.200?-d?172.18.42.201?-p?tcp?--dport?80?-j?DNAT?--to-destination?172.18.42.202 ##請求的是172.18.42.201的80端口,但真正提供服務的卻是172.18.42.202的80端口 [root@wtc?~]iptables?-t?nat?-A?PREROUTING?-s?172.18.42.200?-d?172.18.42.201?-p?tcp?--dport?80?-j?DNAT?--to-destination?172.18.42.202:8080 ##真正提供服務的是172.18.42.202的8080端口(5)MASQUERADE:源地址轉換;發生在postrouting
????????當源地址為動態獲取的地址時,MASQUERADE會自動判斷要轉換為的地址
[root@wtc?~]iptables?-t?nat?-A?POSTROUTING?-s?0/0?-d?172.18.42.201?-j?MASQUERADE本文出自 “wtc” 博客,請務必保留此出處http://wangtianci.blog.51cto.com/11265133/1769849
轉載于:https://blog.51cto.com/lz001/1827157
總結
以上是生活随笔為你收集整理的关于iptables的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ASP.NET WebForm中用asy
- 下一篇: invoke方法