iptables
-
包過濾型的防火墻
-
Firewall:防火墻,隔離工具;工作于主機或網絡邊緣,對于進出本主機或本網絡的報文根據事先定義的檢查規則作匹配檢測,對于能夠被規則匹配到的報文作出相應處理的組件;
-
主機防火墻
網絡防火墻 -
軟件防火墻(軟件邏輯)
硬件防火墻(硬件和軟件邏輯)
-
-
版本
- ipfw (firewall framework):命令行工具,生成規則并送往內核
- ipchains (firewall framework):生成規則
-
iptables(netfilter)
- iptables:rules until,位于用戶空間的通用規則編寫工工具
-
netfilter:工作在kernel
-
hook function(鉤子函數)
input
output
forward
prerouting
postrouting
-
hook function(鉤子函數)
-
iptables的鏈:內置鏈和自定義鏈
-
內置鏈:對應于hook function
-
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
-
PREROUTING
- 自定義鏈接:用于內置鏈的擴展和補充,可實現更靈活的規則管理機制;被內置鏈調用
-
內置鏈:對應于hook function
-
功能:
-
filter:過濾,防火墻;
nat:network address translation;用于修改源IP或目標IP,也可以改端口;
mangle:拆解報文,做出修改,并重新封裝起來;修改除源地址、目標地址以外的其他屬性;LVS會使用到;
raw:關閉nat表上啟用的連接追蹤機制;
-
filter:過濾,防火墻;
-
功能<–>鏈:
- 在同一鏈上的不同功能生效的順序,由其功能的優先級決定:raw > mangle > ant > filter
-
raw:PREROUTING, OUTPUT
mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
nat:PREROUTING,[INPUT,]OUTPUT,POSTROUTING
filter:INPUT,FORWARD,OUTPUT
-
報文流向:
-
流入本機:PREROUTING –> INPUT
由本機流出:OUTPUT –> POSTROUTING
轉發:PREROUTING –> FORWARD –> POSTROUTING
-
流入本機:PREROUTING –> INPUT
-
路由功能發生的時刻:
-
報文進入本機后:PREROUTING之后;
判斷目標主機是?
報文離開本機之前:POSTROUTING之前
判斷經由哪個接口送往下一站?
-
報文進入本機后:PREROUTING之后;
-
規則:
-
組成部分:根據規則匹配條件來嘗試匹配報文,一旦匹配成功,就由規則定義的處理動作作出處理;
-
匹配條件:
-
基本匹配條件
擴展匹配條件
-
基本匹配條件
-
處理動作:
-
基本處理動作
擴展處理動作
自定義處理機制
-
基本處理動作
-
匹配條件:
-
組成部分:根據規則匹配條件來嘗試匹配報文,一旦匹配成功,就由規則定義的處理動作作出處理;
-
添加規則時的考量點:
- 通過要實現哪種功能:判斷添加到哪個表上;
-
通過報文流經的路徑:判斷添加到哪個鏈上;
-
鏈:鏈上的規則次序,即為檢查的次序;因此,隱含一定的應用法則:
- 同類規則(訪問同一應用),匹配范圍小的放上面;
- 不同類的規則(訪問不同應用),匹配到報文頻率較大的放在上面;
- 將那些可由一條規則描述的多個規則合并起來;
-
設置默認策略;使用白名單機制;
- 不建議使用:iptables -P
- 在規則的最后定義規則作為默認策略;
- 同為放行規則時,允許的規則,匹配范圍大的放上面
- 同為放行規則時,拒絕的規則,把匹配范圍小的放上面
iptables
-
iptables啟動與配置
-
CentOS 6:
-
service iptables {start|stop|restart|status}
-
start:讀取事先保存的規則,并應用到netfilter上;
stop:清空netfilter上的規則,以及還原默認策略等;
status:顯示生效的規則;
restart:清空netfilter上的規則,再讀取事先保存的規則,并應用到netfilter上;
-
start:讀取事先保存的規則,并應用到netfilter上;
-
默認的規則文件:/etc/sysconfig/iptables
-
checkconfig iptables on|off;開機是否啟動
-
-
CentOS 7:
-
systemctl start|stop|restart|status firewalld.service
-
systemctl disable firewalld.service
-
systemctl stop firewalld.service
-
-
-
命令選項
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]`
-
-t table:
raw, mangle, nat, [filter] -
COMMAND:如何管理chain的命令
-
鏈管理:
- -N:new, 自定義一條新的規則鏈;
- -X: delete,刪除自定義的規則鏈;
-
-P:Policy,設置默認策略;
對filter表中的鏈而言,其默認策略有:ACCEPT:接受;DROP:丟棄;REJECT:拒絕; - -E:重命名自定義鏈;引用計數不為0的自定義鏈不能夠被重命名,也不能被刪除;
-
規則管理:
- -A:append,追加;
- -I:insert, 插入,要指明位置,省略時表示第一條;
-
-D:delete,刪除;
- 指明規則序號;
- 指明規則本身;
- -R:replace,替換指定鏈上的指定規則;
- -F:flush,清空指定的規則鏈;
-
-Z:zero,置零;
iptables的每條規則都有兩個計數器:- 匹配到的報文的個數;pkts
- 匹配到的所有報文的大小之和;bytes
-
查看:
-
-L:list, 列出指定鏈上的所有規則;
-
-n:numberic,以數字格式顯示地址和端口號;
-v:verbose,詳細信息;-vv, -vvv
-x:exactly,顯示計數器結果的精確值;
–line-numbers:顯示規則的序號;
-
-n:numberic,以數字格式顯示地址和端口號;
-
-L:list, 列出指定鏈上的所有規則;
-
鏈管理:
-
chain:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
-
匹配條件:-m matchname [per-match-optinons]
-
基本匹配條件:無需加載任何模塊,由iptables/netfilter自行提供;
[!] -s, –source address[/mask][,…]:檢查報文中的源IP地址是否符合此處指定的地址或范圍;
[!] -d, –destination address[/mask][,…]:檢查報文中的目標IP地址是否符合此處指定的地址或范圍;
[!] -p, –protocol protocol (/etc/protocols中的協議名)protocol: tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh or "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 which must 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 (ping請求) ~]# iptables -A INPUT -d 172.16.100.67 -p icmp --icmp-type 8 -j DROP 自己可以ping其他主機,其他主機ping不了自己 echo-reply:0 (ping回應)
-
tcp:
-
顯式擴展:必須顯式地指明使用的擴展模塊進行的擴展;[-m matchname [per-match-options]];
-
使用幫助
- CentOS 6:man iptables
- CentOS 7:man iptables-extensions
-
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
-
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
-
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
-
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
-
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
-
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 -
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,鏈接碰到各種狀態的超時后就會從表中刪除;當模板滿載時,后續的連接可能會超時
-
方法一:
加大nf_conntrack_max 值vi /etc/sysctl.conf net.ipv4.nf_conntrack_max = 393216 net.ipv4.netfilter.nf_conntrack_max = 393216
-
方法二:
降低 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
-
方法一:
-
根據”連接追蹤機制“去檢查連接的狀態;
-
使用幫助
-
隱式擴展:不需要手動加載擴展模塊;因為它們是對協議的擴展,所以,但凡使用-p指明了協議,就表示已經指明了要擴展的模塊;
-
基本匹配條件:無需加載任何模塊,由iptables/netfilter自行提供;
-
處理動作:-j targetname [per-target-options]
-
ACCEPT:接受
DROP:丟棄
REJECT:拒絕
RETURN:返回調用鏈;
REDIRECT:端口重定向;
LOG:記錄日志;
MARK:做防火墻標記;
DNAT:目標地址轉換;
SNAT:源地址轉換;
MASQUERADE:地址偽裝;
…
自定義鏈 -
Target:
- ACCEPT, DROP, REJECT, RETURN
-
LOG, SNAT, DNAT, REDIRECT, MASQUERADE,…
LOG:既不做拒絕,也不做允許,只是做日志 --log-level level 指明日志級別 --log-prefix prefix 日志前綴
-
ACCEPT:接受
-
-
如何使用自定義鏈:
-
自定義鏈:需要被調用才能生效;自定義鏈最后需要定義返回規則;
-
返回規則使用的target叫做RETURN;
-
被調用后的自定義鏈,不可再被重新引用、重新命名、刪除,除非清空規則并解除引用,
添加自定義鏈: [root@station77 ~]# iptables -N icmp [root@station77 ~]# iptables -L -n Chain icmp (0 references) target prot opt source destination 重命名:引用次數為0,是可以直接重命名的 [root@station77 ~]# iptables -E icmp in-icmp [root@station77 ~]# iptables -L -n Chain in-icmp (0 references) target prot opt source destination 向自定義鏈中添加規則: [root@station77 ~]# iptables -A in-icmp -d 172.16.251.77 -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT [root@station77 ~]# iptables -L -n Chain in-icmp (0 references) target prot opt source destination ACCEPT icmp -- 0.0.0.0/0 172.16.251.77 icmptype 8 state NEW 調用鏈: 在INPUT上附加規則 iptables -A INPUT -j in-icmp 如果匹配不到,返回主鏈 iptables -A in-icmp -j RETURN
-
-
規則的有效期限
-
使用iptables命令定義的規則,手動刪除之前,其生效期限為kernel存活期限;kernel如果不重啟,其一直有效;
-
保存規則:
保存規則至指定的文件:CentOS 6: ~]# service iptables save 將規則保存至/etc/sysconfig/iptables文件中;如果iptables設置開機啟動,則開機時會讀取此文件; ~]# iptables-save > /PATH/TO/SOME_RULES_FILE CentOS 7: ~]# iptables-save > /PATH/TO/SOME_RULES_FILE
-
重新載入預存規則文件中規則:
CentOS 7: ~]# iptables-restore < /PATH/FROM/SOME_RULES_FILE CentOS 6: ~]# service iptables restart
-
自動生效規則文件中的規則:
-
用腳本保存各iptables命令;讓此腳本開機后自動運行;
/etc/rc.d/rc.local文件中添加腳本路徑; /PATH/TO/SOME_SCRIPT_FILE
-
用規則文件保存各規則,開機時自動載入此規則文件中的規則;
/etc/rc.d/rc.local文件添加: iptables-restore < /PATH/FROM/IPTABLES_RULES_FILE
-
用腳本保存各iptables命令;讓此腳本開機后自動運行;
-
CentOS 7:
引入了新的iptables前端管理工具firewalld,其管理工具有:firewalld-cmd, firewalld-config
-
-
iptables/netfilter網絡防火墻:
- 網關;
- filter表的FORWARD鏈;
-
要注意的問題:
- 請求-響應報文均會經由FORWARD鏈,要注意規則的方向性;
- 如果要啟用conntrack機制,建議將雙方向的狀態為ESTABLISHED的報文直接放行;
-
NAT: Network Address Translation
-
請求報文:由管理員定義;
-
改源地址:SNAT,MASQUERADE
改目標地址:DNAT
-
改源地址:SNAT,MASQUERADE
- 響應報文:由NAT的conntrack機制自動實現;
-
請求報文:由管理員定義;
-
NAT定義在nat表;PREROUTING,INPUT,OUTPUT,POSTROUTING
-
SNAT:POSTROUTING
DNAT:PREROUTING
PAT
-
SNAT:POSTROUTING
-
target:
-
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-source [ipaddr[-ipaddr]]
-
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.SNAT場景中應用于POSTROUTING鏈上的規則實現源地址轉換,但外網地址不固定時,使用此target;
-
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.--to-ports port[-port]
-
SNAT:
原創文章,作者:s,如若轉載,請注明出處:http://www.www58058.com/77999