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