02-iptables/netfilter
Rules
組成部分
匹配條件
基本匹配條件
擴展匹配條件
處理動作
基本處理動作
擴展處理動作
自定義處理機制
iptables鏈
內置鏈
對應於hook function
自定義鏈
沒有hook function,不能直接使用,用於內置鏈的擴展和擴充,可實現更靈活的規則管理機制;其使用要通過調用纔可以
原則
添加規則的考量
1、要實現哪種功能:判斷添加到哪張表上
2、報文流經的路徑:判斷到那個鏈上
3、鏈上的規則次序,即爲檢查的次序,因此,隱含一定的應用法則
同類規則:匹配範圍小的,規則嚴格的放在上面
不同類的規則:匹配到報文頻率較大的放在上面
可由一條規則描述的多個規則聯合
設置默認策略;所有白名單,web服務黑名單
-
[root@husa security]# rpm -ql iptables
/etc/sysconfig/ip6tables-config
/etc/sysconfig/iptables-config
/usr/bin/iptables-xml
/usr/lib64/libip4tc.so.0
/usr/lib64/libip4tc.so.0.1.0
/usr/lib64/libip6tc.so.0
/usr/lib64/libip6tc.so.0.1.0
/usr/lib64/libiptc.so.0
/usr/lib64/libiptc.so.0.0.0
/usr/lib64/libxtables.so.10
/usr/lib64/libxtables.so.10.0.0
/usr/lib64/xtables
/usr/lib64/xtables/libip6t_DNAT.so
/usr/lib64/xtables/libip6t_DNPT.so
/usr/lib64/xtables/libip6t_HL.so
/usr/lib64/xtables/libip6t_LOG.so
/usr/lib64/xtables/libip6t_MASQUERADE.so
/usr/lib64/xtables/libip6t_NETMAP.so
/usr/lib64/xtables/libip6t_REDIRECT.so
/usr/lib64/xtables/libip6t_REJECT.so
/usr/lib64/xtables/libip6t_SNAT.so
/usr/lib64/xtables/libip6t_SNPT.so
/usr/lib64/xtables/libip6t_ah.so
/usr/lib64/xtables/libip6t_dst.so
/usr/lib64/xtables/libip6t_eui64.so
/usr/lib64/xtables/libip6t_frag.so
/usr/lib64/xtables/libip6t_hbh.so
/usr/lib64/xtables/libip6t_hl.so
/usr/lib64/xtables/libip6t_icmp6.so
/usr/lib64/xtables/libip6t_ipv6header.so
/usr/lib64/xtables/libip6t_mh.so
/usr/lib64/xtables/libip6t_rt.so
擴展模塊:
小寫用於匹配條件
大寫用於處理動作
iptables 命令
iptables [-t table] {-A|-C|-D} chain rule-specification
ip6tables [-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]
-t table
raw
mangle
nat
filter
options(COMMAND)
鏈管理
-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的每條規則都有兩個計數器
匹配到的報文的個數
查看
-L:list,列出指定鏈上的所有規則
-n:numberic,以數字格式顯示地址和端口號
-v:verbose,詳細信息
-vv
-x:exactly,顯示計數器結果的精確值
--line-numbers:顯示規則的序號
chain
PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
matches
基本匹配條件:無需加載任何模塊,由iptables/netfilter自行提供
[!]-s,--source address[/mask][,...]:檢查報文中的源IP地址是否符合此處指定的地址或範圍
[!]-d,--destination address[/mask][,...]:檢查報文中的目標IP地址是否符合此處指定的地址或範圍
[!]-p, --protocol protocol:一般使用tcp、udp和icmp
tcp, udp, udplite, icmp,icmpv6,esp, ah, sctp, mh or the special keyword "all", or A protocol name from /etc/protocols is also allowed.
[!] -i, --in-interface name:數據報文流入的接口;只能應用於數據報文流入的環節,只能應用於INPUT, FORWARD and PRE‐ROUTING chains).可以添加邏輯運算 ! ,接口末尾是一個+表示任何以這個名字開頭的都會匹配
[!] -o, --out-interface name:數據報文流出的接口;只能應用於數據報文流出的環節,只能那個應用於FORWARD, and POSTROUTING chains). 可以添加邏輯元算 !,接口末尾添加一個+表示任何以這個名字開頭的都會匹配
-
擴展匹配條件:需要加載擴展模塊方可生效
隱式擴展:不需要手動加載擴展模塊;因爲他們是對協議的擴展,所以,但凡使用-p指明瞭協議,就表示已經指明瞭要擴展的模塊;直接使用-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
[!] --syn:用於匹配第一次握手,相當於“--tcp-flags SYN,ACK,FIN,RSR 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
顯示擴展:必須顯示地指明使用的擴展模塊進行的擴展
使用幫助
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]...:指明多個端口,無論源或者目標
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擴展:
根據”連接追蹤機制“去檢查連接的狀態;
這裏的state追蹤的是IP層的狀態而不是運輸層的狀態
conntrack機制:追蹤本機上的請求和響應之間的關係;狀態有如下幾種:
NEW:新發出請求;連接追蹤模板中不存在此連接的相關信息條目,因此,將其識別爲第一次發出的請求;
ESTABLISHED:NEW狀態之後,連接追蹤模板中爲其建立的條目失效之前期間內所進行的通信狀態;可以理解爲IP層中已經建立連接的主機的IP已經被記錄了,以後的都是ESTABLISHED
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
[root@husa ~]# cat /proc/sys/net/nf_conntrack_max
65536
已經追蹤到到的並記錄下來的連接:
/proc/net/nf_conntrack
[root@husa ~]# cat /proc/net/nf_conntrack
ipv4 2 tcp 6 429405 ESTABLISHED src=172.16.11.207 dst=172.16.11.206 sport=56348 dport=22 src=172.16.11.206 dst=172.16.11.207 sport=22 dport=56348 [ASSURED] mark=0 zone=0 use=2
ipv4 2 tcp 6 429823 ESTABLISHED src=172.16.250.35 dst=172.16.11.206 sport=14354 dport=22 src=172.16.11.206 dst=172.16.250.35 sport=22 dport=14354 [ASSURED] mark=0 zone=0 use=2
ipv4 2 tcp 6 299 ESTABLISHED src=172.16.250.35 dst=172.16.11.206 sport=2726 dport=22 src=172.16.11.206 dst=172.16.250.35 sport=22 dport=2726 [ASSURED] mark=0 zone=0 use=2
ipv4 2 udp 17 23 src=172.16.250.119 dst=172.16.255.255 sport=137 dport=137 [UNREPLIED] src=172.16.255.255 dst=172.16.250.119 sport=137 dport=137 mark=0 zone=0 use=2
ipv4 2 tcp 6 429815 ESTABLISHED src=172.16.11.207 dst=172.16.11.206 sport=56353 dport=22 src=172.16.11.206 dst=172.16.11.207 sport=22 dport=56353 [ASSURED] mark=0 zone=0 use=2
不同的協議的連接追蹤時長:
/proc/sys/net/netfilter/目錄下是各種協議的追蹤時長
[root@husa ~]# ls /proc/sys/net/netfilter/
nf_conntrack_acct nf_conntrack_log_invalid nf_conntrack_tcp_timeout_max_retrans
nf_conntrack_buckets nf_conntrack_max nf_conntrack_tcp_timeout_syn_recv
nf_conntrack_checksum nf_conntrack_tcp_be_liberal nf_conntrack_tcp_timeout_syn_sent
nf_conntrack_count nf_conntrack_tcp_loose nf_conntrack_tcp_timeout_time_wait
nf_conntrack_events nf_conntrack_tcp_max_retrans nf_conntrack_tcp_timeout_unacknowledged
nf_conntrack_events_retry_timeout nf_conntrack_tcp_timeout_close nf_conntrack_timestamp
nf_conntrack_expect_max nf_conntrack_tcp_timeout_close_wait nf_conntrack_udp_timeout
nf_conntrack_generic_timeout nf_conntrack_tcp_timeout_established nf_conntrack_udp_timeout_stream
nf_conntrack_helper nf_conntrack_tcp_timeout_fin_wait nf_log
nf_conntrack_icmp_timeout nf_conntrack_tcp_timeout_last_ack
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
[root@husa etc]# less sysctl.conf
# System default settings live in /usr/lib/sysctl.d/00-system.conf.
# To override those settings, enter new settings here, or in an /etc/sysctl.d/<name>.conf file
#
# For more information, see sysctl.conf(5) and sysctl.d(5).
前端負載均衡上一定不要使用狀態追蹤及其模塊,降低性能
內核參數:/proc/sys/net/netfilter
匹配條件之間是與關係,同時滿足才匹配
target(處理動作)
-j targetname [per-target-options]
ACCEPT
DROP
REJECT
RETURN:返回調用鏈
REDIRECT:端口重定向
LOG:記錄日誌
LOG:
--log-level level 指明日誌級別
--log-prefix prefix 指明日誌前綴
MARK:做防火牆標記
DNAT:目標地址轉換
SNAT:源地址轉換
MASQUERADE:地址僞裝
自定義鏈:匹配到跳轉至自定義鏈
自定義鏈規則的使用
自定義鏈:需要被調用才能生效;自定義鏈最後需要定義返回規則;
返回規則使用的target叫做RETURN;
創建自定義鏈並修改名稱,修改名稱中只有reference爲0的才能夠修改
[root@localhost ~]# iptables -L -n -v
Chain INPUT (policy ACCEPT 248 packets, 24070 bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 50 packets, 7457 bytes)
pkts bytes target prot opt in out source destination
[root@localhost ~]# iptables -N icmp
[root@localhost ~]# iptables -L -n -v
Chain INPUT (policy ACCEPT 10 packets, 840 bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 5 packets, 616 bytes)
pkts bytes target prot opt in out source destination
Chain icmp (0 references)
pkts bytes target prot opt in out source destination
[root@localhost ~]# iptables -E icmp rename-icmp
[root@localhost ~]# iptables -L -n -v
Chain INPUT (policy ACCEPT 8 packets, 934 bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 3 packets, 456 bytes)
pkts bytes target prot opt in out source destination
Chain rename-icmp (0 references)
pkts bytes target prot opt in out source destination
[root@localhost ~]# iptables -X rename-icmp #表示刪除自定義鏈
iptables -X rename-icmp #表示刪除自定義鏈
防火牆開啓關閉
CentOS 6:
service iptables {start|stop|restart|status}
start:讀取實現保存的規則,並應用到netfilter
stop:清空netfilter上的規則,以及還原默認策略等
status:顯示生效的規則
restart:清空netfilter上的規則,在讀取事先保存的規則,並應用到netfilter上
默認的規則文件:/etc/sysconfig/iptables
CentOS 7:
systemctl start | stop | restart | status firewalld.service
firewalld服務管理複雜,使用iptables簡單一些,所以關閉firewalld服務
systemctl disable firewalld.service
systemctl stop firewalld.service
規則的配置
規則的有效期限
使用iptables命令定義的規則,手動刪除之前,起生效期限爲kernel存活期限
保存規則
1 service iptables save,此命令僅限於CentOS 6
將規則保存至/etc/sysconfig/iptables文件中
[root@localhost ~]# ls /etc/sysconfig/iptables
ls: cannot access /etc/sysconfig/iptables: No such file or directory
[root@localhost ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
[root@localhost ~]# ls /etc/sysconfig/iptables
/etc/sysconfig/iptables
# 查看
[root@localhost ~]# cat /etc/sysconfig/iptables
# Generated by iptables-save v1.4.7 on Sun Dec 20 14:43:28 2015
*filter
:INPUT ACCEPT [751:77766]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [154:21292]
:icmp - [0:0]
-A INPUT -d 172.16.11.207/32 -j icmp
-A icmp -d 172.16.11.207/32 -p icmp -j REJECT --reject-with icmp-port-unreachable
-A icmp -j RETURN
COMMIT
# Completed on Sun Dec 20 14:43:28 2015
2 iptables-save命令 iptables-save — dump iptables rules to stdout
將規則保存至指定的文件中
iptables-save /path/to/somefile
[root@localhost ~]# iptables-save > /root/iptables
[root@localhost ~]# cat /root/iptables
# Generated by iptables-save v1.4.7 on Sun Dec 20 14:46:14 2015
*filter
:INPUT ACCEPT [1221:125655]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [309:45748]
:icmp - [0:0]
-A INPUT -d 172.16.11.207/32 -j icmp
-A icmp -d 172.16.11.207/32 -p icmp -j REJECT --reject-with icmp-port-unreachable
-A icmp -j RETURN
COMMIT
# Completed on Sun Dec 20 14:46:14 2015
載入規則
iptables-restore命令
[root@localhost ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
icmp all -- 0.0.0.0/0 172.16.11.207
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain icmp (1 references)
target prot opt source destination
REJECT icmp -- 0.0.0.0/0 172.16.11.207 reject-with icmp-port-unreachable
RETURN all -- 0.0.0.0/0 0.0.0.0/0
[root@localhost ~]# iptables -F
[root@localhost ~]# iptables-restore < /root/iptables
[root@localhost ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
icmp all -- 0.0.0.0/0 172.16.11.207
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain icmp (1 references)
target prot opt source destination
REJECT icmp -- 0.0.0.0/0 172.16.11.207 reject-with icmp-port-unreachable
RETURN all -- 0.0.0.0/0 0.0.0.0/0
自動添加iptables規則
(1) 用腳本保存各iptables命令;讓此腳本開機後自動運行;
/etc/rc.d/rc.local文件中添加腳本路徑;
/PATH/TO/SOME_SCRIPT_FILE
(2) 用規則文件保存各規則,開機時自動載入此規則文件中的規則;
/etc/rc.d/rc.local文件添加:
iptables-restore < /PATH/FROM/IPTABLES_RULES_FILE