function(INPUT, OUTPUT, FORWARD, PREROUTING, POSTROUTING)
,而这五个hook function向用户开放,用户可以通过一个命令工具(iptables)向其写入规则PREROUTING --> INPUT-->用户空间进程
用户空间进程-->OUTPUT--> POSTROUTING
PREROUTING --> FORWARD --> POSTROUTING
主要由四个表、五个链以及一些规则组成
四个表(table): filter, nat, mangle, raw
filter: 过滤规则表,根据预定义的规则过滤符合条件的数据包
nat: network address translation 地址转换规则表
mangle: 修改数据标记位规则表
raw: 关闭NAT表上启用的连接跟踪机制,加快封包穿越防火墙速度
优先级由高到低的顺序为: raw–>mangle–>nat–>filter
五个内置链chain
PREROUTING
:由NF_IP_PRE_ROUTING挂钩触发。INPUT
:由NF_IP_LOCAL_IN挂钩触发。FORWARD
:由NF_IP_FORWARD挂钩触发。OUTPUT
:由NF_IP_LOCAL_OUT挂钩触发。POSTROUTING
:由NF_IP_POST_ROUTING挂钩触发。当一个数据包进入网卡时,数据包首先进入PREROUTING
链,内核根据数据包目的IP判断是否需要转送出去
如果数据包就是进入本机的,数据包就会经过INPUT
链供有关进程接收。本机上运行的程序可以发送数据包,这些数据包经过OUTPUT
链,然后到达POSTROUTING
链输出
如果数据包是要转发出去的,且内核允许转发,数据包就会经过FORWARD
链,然后到达POSTROUTING
链输出
规则(rule):根据规则的匹配条件尝试匹配报文,对匹配成功的报文根据规则定义的处理动作作出处理
匹配条件:默认为与条件,同时满足
基本匹配:IP,端口,TCP的Flags(SYN, ACK等)
扩展匹配:通过复杂高级功能匹配
处理动作(target):
内建处理动作:ACCEPT, DROP, REJECT, SNAT, DNAT, MASQUERADE, MARK, LOG...
自定义处理动作:自定义chain,利用分类管理复杂情形
链(chain):
内置链:每个内置链对应于一个钩子函数
自定义链:用于对内置链进行扩展或补充,可实现更灵活的规则组织管理机制
只有Hook钩子调用自定义链时,才生效
iptables规则添加时考量点
链上规则的次序,即为检查的次序,因此隐含一定的法则
/ Centos7 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
/ Centos7 关闭防火墙
service iptables stop
chkconfig iptables off
iptables [-t table] SUBCOMMAND chain rule-specification
rule-specification = [matches...] [target]
match = -m matchname [per-match-options]
target = -j targetname [per-target-options]
PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
查看类
-L:list, 列出指定链上的所有规则,本选项须置后
-n:numberic,以数字格式显示地址和端口号
-v:verbose,详细信息
-vv:更详细
-x:exactly,显示计数器结果的精确值,而非单位转换后的易读值
--line-numbers:显示规则的序号
-S:selected,以iptables-save命令格式显示链上规则
--vnL
--vnxL --line-numbers
[root@Centos7 ~]# iptables -vnL
Chain INPUT (policy ACCEPT 0 packets, 0 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 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
[root@Centos7 ~]# iptables -vnL --line-numbers
Chain INPUT (policy ACCEPT 73 packets, 5143 bytes) / 计数器的值
num pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 36 packets, 3136 bytes)
num pkts bytes target prot opt in out source destination
规则管理类:
-A:append,追加
-I:insert, 插入,要指明插入至的规则编号,默认为第一条
-D:delete,删除
(1) 指明规则序号
(2) 指明规则本身
-R:replace,替换指定链上的指定规则编号
-F:flush,清空指定的规则链
-Z:zero,置零
iptables的每条规则都有两个计数器
(1) 匹配到的报文的个数
(2) 匹配到的所有报文的大小之和
实验:iptables规则管理
添加策略:阻止来自172.20.54.7主机的访问
iptables -A INPUT -s 172.20.54.7 -j REJECT
插入策略:阻止来自172.20.54.0/24网段的访问,并且此策略编号为1
iptables -I INPUT 1 -s 172.20.54.0/24 -j REJECT
替换策略:将策略2替换成阻止来自172.20.54.8主机的访问
iptables -R INPUT 2 -s 172.20.54.8 -j REJECT
PARAMETERS
MATCH EXTENTIONS
-s, --source address[/mask][,...]:源IP地址或范围
-d, --destination address[/mask][,...]:目标IP地址或范围
-p, --protocol protocol:指定协议
protocol: tcp, udp, icmp, 参看:/etc/protocols
-i, --in-interface name:报文流入的接口;只能应用于数据报文流入环节,只应用于INPUT, FORWARD, PREROUTING链
-o, --out-interface name:报文流出的接口;只能应用于数据报文流出的环节,只应用于FORWARD, OUTPUT, POSTROUTING链
iptables -A INPUT -s 172.20.54.0/24 -p icmp -j REJECT
ping -c3 172.20.54.6
--source-port, --sport port[:port]
匹配报文源端口,可为端口范围
--destination-port, --dport port[:port]
匹配报文目标端口,可为端口范围
--tcp-flags mask comp
mask:需检查的标志位列表(例如SYN,ACK,FIN,RST),用","分隔
comp:在mask列表中必须为1的标志位列表,无指定则必须为0,用","分隔
/ 设置策略(IP:172.20.54.6).以下两个命令等价,一个意思
iptables -A INPUT -p tcp --dprot 22:23 --tcp-flages SYN,ACK,FIN,RST SYN -j REJECT
iptables -A INPUT -p tcp --dpot 22:23 --syn -j REJECT
/ 其他主机测试
[root@Centos7 ~]# ssh 172.20.54.6
ssh: connect to host 172.20.54.6 port 22: Connection refused
[root@Centos7 ~]# telnet 172.20.54.6
Trying 172.20.54.6...
telnet: connect to address 172.20.54.6: Connection refused
--source-port, --sport port[:port]
匹配报文的源端口,可以是端口范围
--destination-port, --dport port[:port]
匹配报文的目标端口,可以是端口范围
--icmp-type {type[/code]|typename}
type/code
0/0 echo-reply:icmp应答
8/0 echo-request:icmp请求
[-m matchname[per-match-options]]
--source-ports, --sports port[,port|,port:port]...
指定多个源端口
--destination-ports, --dports port[,port|,port:port]...
指定多个目标端口
--ports port[,port|,port:port]...多个源或目标端口
/ 设置策略(172.20.54.6)
iptables -A INPUT -s 172.20.54.0/24 -p tcp -m multiport --dports 20:25,80 -j REJECT
/ 在其他主机测试
ftp 172.20.54.6
ssh 172.20.54.6
telnet 172.20.54.6
curl 172.20.54.6
--src-range from [-to] 源IP地址范围
--dst-range from [-to] 目标IP地址范围
iptables -A INPUT -p tcp -m iprange --src-range 172.20.54.7-172.20.54.20 -j REJECT
PREROUTING, FORWARD, INPUT chains
--mac-source XX:XX:XX:XX:XX:XX
iptables -A INPUT -p icmp -m mac --mac-source 00:50:56:3f:60:3c -j REJECT
--algo {bm|kmp}:字符串匹配检测算法
bm:Boyer-Moore
kmp:Knuth-Pratt-Morris
--from offset:开始偏移
--to offset:结束偏移
--string pattern:要检测的字符串模式
--hex-string pattern:要检测字符串模式,16进制格式
iptables -A OUTPUT -p tcp -sport 80 -m string --alog bm --string "goole" -j REJECT
--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...] 星期几,1 – 7 分别表示星期一到星期日
--kerneltz:内核时区,不建议使用,CentOS 7系统默认为 UTC
注意: centos6 不支持kerneltz ,--localtz指定本地时区(默认)
/ 设置时间段为UTC 04:00 - 10:00 ,当前时间在范围内,直接拒绝
iptables -A INPUT -p tcp -dport 80 -m time --timestart 04:00 --timestop 10:00 --weekdays Sau,Sun -j REJECT
/ 修改时间段为UTC 04:00 - 04:30 , 当前时间不在范围内,允许访问
iptables -R INPUT 1 -p tcp -dprot 80 -m time --timestart 04:00 --timestop 04:30 --weekdays Sau,Sun -j REJECT
--connlimit-upto n:连接的数量小于等于n时匹配,与默认的拒绝策略配合使用
--connlimit-above n:连接的数量大于n时匹配,与默认的允许策略配合使用
iptables -A INPUT -s 172.20.54.7 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
--limit rate [/second|/minute|/hour|/day]:限速
--limit-burst number:前多少个报文不做限速
/ 定义允许规则
iptables -A INPUT -p icmp --icmp-type 8/0 -m limit --limit-burst 5 --limit 6/minute -j REJECT
/ 定义拒绝规则
iptables -A INPUT -p icmp --icmp-type 8/0 -j DROP
根据连接追踪机制去检查连接的状态,较耗资源
conntrack机制:追踪本机上的请求和响应之间的关系,状态有如下几种:
NEW
到ESTABLISHED
时,它接收在相反方向上的有效响应。对于TCP连接,这意味着SYN/ACK
,对于UDP和ICMP流量,这意味着在原始数据包的源和目的地之间进行交换的响应。RELATED
。这可能意味着一个辅助连接,例如FTP数据传输连接,或者可能是ICMP对其他协议对连接尝试的响应。INVALID
如果数据包不与现有连接相关联并且不适合用于打开新连接,如果无法识别或在其他原因中不可路由,则可以进行标记。UNTRACKED
好像已在raw表链中被定位为绕过跟踪一样。查询连接追踪信息
/proc/net/nf_conntrack
/proc/sys/net/nf_conntrack_max
/proc/sys/net/netfilter/nf_conntrack_count
/proc/sys/net/netfilter/
modprobe nf_conntrack_ipv4
/proc/sys/net/nf_conntrack_max
kernel: ip_conntrack: table full, dropping packet错误
连接过多的解决方法两个:
nf_conntrack_max
值vi /etc/sysctl.conf
net.nf_conntrack_max = 393216
net.netfilter.nf_conntrack_max = 393216
nf_conntrack timeout
时间vi /etc/sysctl.conf
net.netfilter.nf_conntrack_tcp_timeout_established = 300
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
iptables -t nat -L -n
实验:开放ftp服务的被动模式
分析:ftp服务的被动模式端口不固定,一般指定端口的方法不适用,通过放行21端口的相关端口的方法设置相关策略
/ 查看模块是否加载
lsmod | grep ftp
/ 加载ftp模块
modprode nf_conntrack_ftp
/ 放行已经建立的命令连接、数据连接以及新发起的数据连接
iptables -A INPUT -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
/ 放行新发起的命令连接
iptables -A INPUT -p tcp --dport 21 -m state --state NEW -j ACCEPT
/ 拒绝其他无关连接
iptables -A INPUT -j REJECT
语法:-j targetname [per-target-options]
简单:
ACCEPT:放行
DROP:丢弃
扩展:
REJECT:拒绝
RETURN:返回调用链
REDIRECT:端口重定向
LOG:记录日志,dmesg
MARK:做防火墙标记
DNAT:目标地址转换
SNAT:源地址转换
MASQUERADE:地址伪装
target
,本身不拒绝和允许,放在拒绝和允许规则前并将日志记录在/var/log/messages
系统日志中--log-level level 级别:emerg, alert, crit, error, warning, notice, info or debug
--log-prefix prefix 日志前缀,用于区别不同的日志,最多29个字符
iptables -A INPUT -p tcp -m multiport --dports 22,80 -m state --state NEW -j LOG --log-prefix "new connections: "
-N:new,自定义一条新的规则链
-X:delete,删除自定义的空规则链
-P:Policy,设置默认策略;对filter表中的链而言,其默认策略有:
ACCEPT:接受
DROP:丢弃
-E:重命名自定义链
注意:
引用计数不为0的自定义链不能够被重命名,也不能被删除
不建议修改链默认策略,可以设置策略兜底
实验:自定义链"DENY_ICMP_SSH",作用为拒绝icmp和ssh连接。关联"DENY_ICMP_SSH"链至INPUT链,实现拒绝来自172.20.54.7-172.20.54.20范围内主机的icmp和ssh连接
/ 新建自定义链
iptables -N DENY_ICMP_SSH
iptables -A DENY_ICMP_SSH -p icmp -j REJECT
iptables -A DENY_ICMP_SSH -P tcp --dport 22 -j REJECT
/ 关联DENY_ICMP_SSH
iptables -A INPUT -m iprange --src-range 172.20.54.7-172.20.54.20 -j DENY_ICMP_SSH
/ 主机测试
ping -c3 172.20.54.6
ssh 172.20.54.6
/ 清楚自定义链
iptables -F INPUT 1 / 清除INPUT链上关联DENY_ICMP_SSH规则
iptables -F DENY_ICMP_SSH / 清除DENY_ICMP_SSH链上的规则
iptables -X DENY_ICMP_SSH / 删除DENY_ICMP_SSH链
任何不允许的访问,应该在请求到达时给予拒绝
规则在链接上的次序即为其检查时的生效次序
基于上述,规则优化
iptables -P
,建议在规则的最后定义规则做为默认策略规则有效期限:
使用iptables命令定义的规则,手动删除之前,其生效期限为kernel存活期限
保存规则至指定的文件:
/ 将规则覆盖保存至/etc/sysconfig/iptables文件中
service iptables save
/ 自动从/etc/sysconfig/iptables重新载入规则
service iptables start
/ 规则文件重定向至文件,以下两条命令等效
iptables -S > /PATH/TO/SOME_RULES_FILE
iptables-save > /PATH/TO/SOME_RULES_FILE
/ 重新载入预存规则文件中的规则
iptables-restore < /PATH/FROM/SOME_RULES_FILE
开机自动重载规则文件中的规则:
chkconfig --list iptables
/etc/rc.d/rc.local
文件添加规则恢复命令vim /etc/rc.d/rc.local
iptables-restore < /PATH/FROM/SOME_RULES_FILE
chmod +x /etc/rc.d/rc.local
yum install iptables-services
iptables-save > /etc/sysconfig/iptables
systemctl enable iptables.service