iptables命令规则格式:

ebtables 标记_操作系统

iptables [-t table] SUBCOMMAND chain [-m matchname[per-match-options]] -j targetname [per-target-options]

    四表    增删改查   五联   匹配条件(隐式/显式8个)   jump处理工作(ACCEPT/REJECT等)  

-t table:

  • raw, mangle, nat, [filter]默认

SUBCOMMAND:

  • 链管理:面向内网白名单,面向互联网黑名单
  • -N:new, 自定义一条新的规则链
  • -X:delete,删除自定义的空的规则链
  • -P:Policy,设置默认策略;对filter表中的链而言,其默认策略有:ACCEPT:接受;DROP:丢弃
  • -E:重命名自定义链;引用计数不为0的自定义链不能够被重命名,也不能被删除
  • 查看:
  • -L:list, 列出指定鏈上的所有规则,本选项须置后
  • -n:numberic,以数字格式显示地址和端口号
  • -v:verbose,详细信息
  • -vv 更详细,竖向显示(像mysql中的\G)
  • -x:exactly,显示计数器结果的精确值,而非单位转换后的易读值
  • --line-numbers:显示规则的序号
  • 常用组合:
  • -vnL
  • -vvnxL --line-numbers
  • -S selected,以iptables-save 命令格式显示链上规则;可利用while read做循环也可写入执行脚本
[root@centos7a ~]#iptables -nvL -t filter
Chain INPUT (policy ACCEPT 725 packets, 68356 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     all  --  *      *       192.168.141.102      0.0.0.0/0           
    0     0 ACCEPT     all  --  *      *       192.168.141.0        0.0.0.0/0           

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 273 packets, 35426 bytes)
 pkts bytes target     prot opt in     out     source               destination



规则管理:

  • -A:append,追加
  • -I:insert, 插入,要指明插入至的规则编号,默认为第一条
  • -D:delete,删除;(1) 指明规则序号;(2) 指明规则本身
  • -R:replace,替换指定链上的指定规则编号
  • -F:flush,清空指定的规则链
  • -Z:zero,置零
  • iptables的每条规则都有两个计数器(policy ACCEPT 0 packets, 0 bytes)
  • (1) 匹配到的报文的个数pkts
  • (2) 匹配到的所有报文的大小之和bytes

chain:

PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

  • 匹配条件
  • 基本:通用的,PARAMETERS;扩展:需加载模块,MATCH EXTENTIONS
  • 基本匹配条件:无需加载模块,由iptables/netfilter自行提供
  • [!] -s, --source address[/mask][,...]:源IP地址或范围
  • [!] -d, --destination address[/mask][,...]:目标IP地址或范围
  • [!] -p, --protocol protocol:指定协议,可使用数字如0(all)protocol: tcp, udp, icmp, icmpv6, udplite,esp, ah, sctp, mh or“all“参看:/etc/protocols
  • [!] -i, --in-interface name:报文流入的接口;只能应用于数据报文流入环节,只应用于INPUT、FORWARD、PREROUTING链
  • [!] -o, --out-interface name:报文流出的接口;只能应用于数据报文流出的环节,只应用于FORWARD、OUTPUT、POSTROUTING链
  • 扩展匹配条件:需要加载扩展模块(/usr/lib64/xtables/*.so),方可生效,查看帮助 man iptables-extensions
  1. 隐式扩展:在使用-p选项指明了特定的协议时,无需再用-m选项指明扩展模块的扩展机制,不需要手动加载扩展模块
  • tcp协议的扩展选项
  • [!] --source-port, --sport port[:port]:匹配报文源端口,可为端口范围
  • [!] --destination-port,--dport port[:port]:匹配报文目标端口,可为范围
  • [!] --tcp-flags mask comp
  • mask 需检查的标志位列表,用,分隔,例如 SYN,ACK,FIN,RST
  • comp 在mask列表中必须为1的标志位列表,无指定则必须为0,用,分隔
  • 示例:
  • --tcp-flags SYN,ACK,FIN,RST SYN 表示要检查的标志位为SYN,ACK,FIN,RST四个,其中SYN必须为1,余下的必须为0
  • --tcp-flags SYN,ACK,FIN,RST SYN,ACK
  • --tcp-flags ALL ALL
  • --tcp_flags ALL NONE
  • [!] --syn:用于匹配第一次握手,相当于:--tcp-flags SYN,ACK,FIN,RST SYN
  • udp协议的扩展选项
  • [!] --source-port, --sport port[:port]:匹配报文的源端口或端口范围
  • [!] --destination-port,--dport port[:port]:匹配报文的目标端口或端口范围
  • icmp协议的扩展选项(Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。
  • [!] --icmp-type {type[/code]|typename}
  • type/code
  • 0/0 echo-reply icmp应答
  • 8/0 echo-request icmp请求
  • 显式扩展:必须使用-m选项指明要调用的扩展模块的扩展机制,要手动加载扩展模块[-m matchname [per-match-options]]
  • 处理动作:-j targetname [per-target-options]
  • 简单:ACCEPT,DROP
  • 扩展:REJECT:--reject-with:icmp-port-unreachable默认
  • RETURN:返回调用链
  • REDIRECT:端口重定向
  • LOG:记录日志,dmesg
  • MARK:做防火墙标记
  • DNAT:目标地址转换
  • SNAT:源地址转换
  • MASQUERADE:地址伪装
  • ...
  • 自定义链:
  • 显式扩展:必须显式地指明使用的扩展模块进行的扩展
  • 使用帮助:CentOS 6: man iptables;CentOS 7: man iptables-extensions
  • 1、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.10 -p tcp -m multiport --dports 20:22,80 -j ACCEPT
  • 2、iprange扩展,指明连续的(但一般不是整个网络)ip地址范围
  • [!] --src-range from[-to] 源IP地址范围
  • [!] --dst-range from[-to] 目标IP地址范围
[root@centos7a ~]#iptables -A INPUT -d 172.16.1.100 -p tcp --dport 80 -m iprange --src-range 172.16.1.5-172.16.1.10 -j DROP
[root@centos7a ~]#ipshow 
Chain INPUT (policy ACCEPT 10 packets, 966 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   0     0 DROP       tcp  --  *      *       0.0.0.0/0            172.16.1.100         tcp dpt:80 source IP range 172.16.1.5-172.16.1.10



  • 3、mac扩展指明源MAC地址,适用于:PREROUTING, FORWARD,INPUT chains
  • [!] --mac-source XX:XX:XX:XX:XX:XX

[root@centos7a ~]#iptables -A INPUT -s 172.16.0.100 -m mac --mac-source 00:50:56:12:34:56 -j ACCEPT [root@centos7a ~]#ipshow Chain INPUT (policy ACCEPT 23 packets, 2044 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT all -- * * 172.16.0.100 0.0.0.0/0 MAC 00:50:56:12:34:56



  • 4、string扩展,对报文中的应用层数据做字符串模式匹配检测
  • --algo {bm|kmp} 字符串匹配检测算法。bm:Boyer-Moore;kmp:Knuth-Pratt-Morris
  • --from offset 开始偏移
  • --to offset 结束偏移
  • [!] --string pattern 要检测的字符串模式
  • [!] --hex-string pattern要检测字符串模式,16进制格式
[root@centos7a ~]#iptables -A OUTPUT -s 172.16.100.10 -d 0/0 -p tcp --sport 80 -m string --algo bm --string "google" -j REJECT
[root@centos7a ~]#ipshow 
Chain INPUT (policy ACCEPT 18 packets, 1188 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 10 packets, 1560 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 REJECT     tcp  --  *      *       172.16.100.10        0.0.0.0/0            tcp spt:80 STRING match  "google" ALGO name bm TO 65535 reject-with icmp-port-unreachable



  • 5、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...] 星期几,1 – 7 分别表示星期一到星期日
  • --kerneltz:内核时区,不建议使用,CentOS7系统默认为UTC。注意: centos6 不支持kerneltz ,--localtz指定本地时区(默认)
[root@centos7a ~]#iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.10 -p tcp --dport 80 -m time --timestart 14:30 --timestop 18:30 --weekdays Sat,Sun --kerneltz -j DROP
[root@centos7a ~]#ipshow 
Chain INPUT (policy ACCEPT 27 packets, 2116 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DROP       tcp  --  *      *       172.16.0.0/16        172.16.100.10        tcp dpt:80 TIME from 14:30:00 to 18:30:00 on Sat,Sun



  • 6、connlimit扩展。根据每客户端IP做并发连接数数量匹配,可防止CC(Challenge Collapsar挑战黑洞)攻击

--connlimit-upto #:连接的数量小于等于#时匹配
--connlimit-above #:连接的数量大于#时匹配
通常分别与默认的拒绝或允许策略配合使用



[root@centos7a ~]#iptables -A INPUT -d 172.16.100.10 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
[root@centos7a ~]#ipshow 
Chain INPUT (policy ACCEPT 32 packets, 2278 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 REJECT     tcp  --  *      *       0.0.0.0/0            172.16.100.10        tcp dpt:22 #conn src/32 > 2 reject-with icmp-port-unreachable



  • 7、limit扩展。基于收发报文的速率做匹配,令牌桶过滤器
  • --limit #[/second|/minute|/hour|/day]
  • --limit-burst number
[root@centos7a ~]#iptables -I INPUT -d 172.16.100.10 -p icmp --icmp-type 8 -m limit --limit 10/minute --limit-burst 5 -j ACCEPT 
[root@centos7a ~]#iptables -I INPUT 2 -p icmp -j REJECT
[root@centos7a ~]#ipshow 
Chain INPUT (policy ACCEPT 22 packets, 1476 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            172.16.100.10        icmptype 8 limit: avg 10/min burst 5
    0     0 REJECT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable



  • 8、state扩展。根据”连接追踪机制“去检查连接的状态,较耗资源
  • conntrack机制:追踪本机上的请求和响应之间的关系
  • 状态有如下几种:
  • NEW:新发出请求(第一次);连接追踪信息库中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求
  • ESTABLISHED:NEW状态之后(第二次及以后),连接追踪信息库中为其建立的条目失效之前期间内所进行的通信状态
  • RELATED:新发起的但与已有连接相关联的连接,如:ftp协议中的数据连接与命令连接之间的关系
  • INVALID:无效的连接,如flag标记不正确
  • UNTRACKED:未进行追踪的连接,如raw表中关闭追踪
  • [!] --state state
[root@centos7a ~]#iptables -A INPUT -d 172.16.1.10 -p tcp -m multiport --dport 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT
[root@centos7a ~]#iptables -A OUTPUT -s 172.16.1.10 -p tcp -m multiport --sport 22,80 -m state --state ESTABLISHED -j ACCEPT
[root@centos7a ~]#ipshow 
Chain INPUT (policy ACCEPT 18 packets, 1260 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            172.16.1.10          multiport dports 22,80 state NEW,ESTABLISHED

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 7 packets, 1108 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     tcp  --  *      *       172.16.1.10          0.0.0.0/0            multiport sports 22,80 state ESTABLISHED



  • 已经追踪到的并记录下来的连接信息库
  • /proc/net/nf_conntrack
  • 调整连接追踪功能所能够容纳的最大连接数量
  • /proc/sys/net/nf_conntrack_max
  • 不同的协议的连接追踪时长
  • /proc/sys/net/netfilter/
  • 注意:CentOS7 需要加载模块: modprobe nf_conntrack
  • iptables的链接跟踪表最大容量为/proc/sys/net/nf_conntrack_max,各种状态的超时链接会从表中删除;当模板满载时,后续连接可能会超时,解决方法两个:

(1) 加大nf_conntrack_max 值



vi /etc/sysctl.conf
net.nf_conntrack_max = 393216
net.netfilter.nf_conntrack_max = 393216



(2) 降低 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服务
  • (1) 装载ftp连接追踪的专用模块:
跟踪模块路径:/lib/modules/kernelversion/kernel/net/netfilter
vim /etc/sysconfig/iptables-config 配置文件
IPTABLES_MODULES=“nf_conntrack_ftp"
modproble nf_conntrack_ftp



  • (2) 放行请求报文:
命令连接:NEW, ESTABLISHED
数据连接:RELATED, ESTABLISHED
iptables –I INPUT -d LocalIP -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -d LocalIP -p tcp --dport 21 -m state --state NEW -j ACCEPT



  •  (3) 放行响应报文:

iptables -I OUTPUT -s LocalIP -p tcp -m state --state ESTABLISHED -j ACCEPT



开放被动模式的ftp服务示例



yum install vsftpd
systemctl start vsftpd
modprobe nf_conntrack_ftp
iptables -F
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -m state --state NEW -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -vnL



Target:

  • ACCEPT, DROP, REJECT, RETURN
  • LOG, SNAT, DNAT, REDIRECT, MASQUERADE,..
  • LOG:非中断target,本身不拒绝和允许,放在拒绝和允许规则前并将日志记录在/var/log/messages系统日志中
  • --log-level level 级别: debug,info,notice, warning, error, crit, alert,emerg
  • --log-prefix prefix 日志前缀,用于区别不同的日志,最多29个字符
[root@centos7a ~]#iptables -I INPUT -s 10.0.1.0/24 -p tcp -m multiport --dports 80,21:23 -m state --state NEW -j LOG --log-prefix "new connections"
[root@centos7a ~]#ipshow 
Chain INPUT (policy ACCEPT 19 packets, 1290 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 LOG        tcp  --  *      *       10.0.1.0/24          0.0.0.0/0            multiport dports 80,21:23 state NEW LOG flags 0 level 4 prefix "new connections"



任何不允许的访问,应该在请求到达时给予拒绝
规则在链接上的次序即为其检查时的生效次序
基于上述,规则优化

  1. 安全放行所有入站和出站的状态为ESTABLISHED状态连接
  2. 谨慎放行入站的新请求
  3. 有特殊目的限制访问功能,要在放行规则之前加以拒绝
  4. 同类规则(访问同一应用),匹配范围小的放在前面,用于特殊处理
  5. 不同类的规则(访问不同应用),匹配范围大的放在前面
  6. 应该将那些可由一条规则能够描述的多个规则合并为一条
  7. 设置默认策略,建议白名单(只放行特定连接)
  • iptables -P,不建议
  • 建议在规则的最后定义规则做为默认策略
  • 规则有效期限:
  • 使用iptables命令定义的规则,手动删除之前,其生效期限为kernel存活期限
  • 保存规则:
  • 保存规则至指定的文件
  • CentOS 6 
  • service iptables save 
  • 将规则覆盖保存至/etc/sysconfig/iptables文件中
  • CentOS 7
  • iptables-save > /PATH/TO/SOME_RULES_FILE
  • CentOS 6:
  • service iptables restart
  • 会自动从/etc/sysconfig/iptables 重新载入规则
  • CentOS 7 重新载入预存规则文件中规则:
  • iptables-restore < /PATH/FROM/SOME_RULES_FILE
  • -n, --noflush:不清除原有规则
  • -t, --test:仅分析生成规则集,但不提交

开机自动重载规则
开机自动重载规则文件中的规则:

  • (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
  • (3)自定义Unit File,进行iptables-restore