iptables3

防火墙

iptables命令

匹配条件

  • 基本:通用的,PARAMETERS
  • 扩展:需加载模块,MATCH EXTENTIONS

1、 基本匹配条件:无需加载模块,由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链

2、 扩展匹配条件:需要加载扩展模块(/usr/lib64/xtables/*.so),方可生效

查看帮助 man iptables-extensions

  • 隐式扩展:在使用-p选项指明了特定的协议时,无需再用-m选项指明扩展模块的扩展
    机制,不需要手动加载扩展模块

    • [!] –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

    [!] –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-option

    • 简单: ACCEPT,DROP
    • 扩展:
      • REJECT:–reject-with:icmp-port-unreachable默认
      • RETURN:返回调用链
      • REDIRECT:端口重定向
      • LOG:记录日志,
      • dmesgMARK:做防火墙标记
      • DNAT:目标地址转换
      • SNAT:源地址转换
      • MASQUERADE:地址伪装 或者自定义链

    使用帮助:
    CentOS 6: man iptables
    CentOS 7: man iptables-extensions

1、 multiport扩展
以离散方式定义多端口匹配,最多指定15个端口

  • [!] –source-ports,–sports port[,port|,port:port]…指定多个源端口
  • [!] –destination-ports,–dportsport[,port|,port:port]…指定多个目标端口
  • [!] –ports port[,port|,port:port]…多个源或目标端口

示例:

1
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地址范围

示例:

1
iptables -A INPUT -d 172.16.1.100 -p tcp --dport 80 -m iprange --srcrange 172.16.1.5-172.16.1.10 -j DROP

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

1
2
iptables -A INPUT -s 172.16.0.100 -m mac --mac-source 00:50:56:12:34:56 -j ACCEPT  
iptables -A INPUT -s 172.16.0.100 -j REJECT

4、 string扩展
对报文中的应用层数据做字符串模式匹配检测
–algo {bm|kmp}:字符串匹配检测算法
bm:Boyer-Moore
kmp:Knuth-Pratt-Morris
–from offset 开始偏移
–to offset 结束偏移
[!] –string pattern:要检测的字符串模式
[!] –hex-string pattern:要检测字符串模式,16进制格式

示例:

1
iptables -A OUTPUT -s 172.16.100.10 -d 0/0 -p tcp --sport 80 -m string --algo bm --string “google" -j REJECT

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…] 星期几
–kerneltz:内核时区,不建议使用,CentOS7系统默认为UTC
注意: centos6 不支持kerneltz ,–localtz指定本地时区(默认)
示例:

1
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

6、 connlimit扩展
根据每客户端IP做并发连接数数量匹配
可防止CC(Challenge Collapsar挑战黑洞)攻击
–connlimit-upto n:连接的数量小于等于n时匹配
–connlimit-above n:连接的数量大于n时匹配
通常分别与默认的拒绝或允许策略配合使用

示例:

1
iptables -A INPUT -d 172.16.100.10 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT

7、 limit扩展
基于收发报文的速率做匹配
令牌桶过滤器
–limit rate[/second|/minute|/hour|/day]
–limit-burst number
示例:

1
2
iptables -I INPUT -d 172.16.100.10 -p icmp --icmp-type 8 -m limit --limit 10/minute -- limit-burst 5 -j ACCEPT  
iptables -I INPUT 2 -p icmp -j REJECT

8、 state扩展
状态有如下几种:
NEW:新发出请求;连接追踪信息库中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求
ESTABLISHED:NEW状态之后,连接追踪信息库中为其建立的条目失效之前期间内所进行的通信状态
RELATED:新发起的但与已有连接相关联的连接,如:ftp协议中的数据连接与命令连接之间的关系
INVALID:无效的连接,如flag标记不正确
UNTRACKED:未进行追踪的连接,如raw表中关闭追踪

示例

1
2
iptables -A INPUT -d 172.16.1.10 -p tcp -m multiport --dports 22,80 -m state -- state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 172.16.1.10 -p tcp -m multiport --sports 22,80 -m state -- state ESTABLISHED -j ACCEPT

已经追踪到的并记录下来的连接信息库 /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 值

1
2
3
vi /etc/sysctl.conf
net.nf_conntrack_max = 393216
net.netfilter.nf_conntrack_max = 393216

(2) 降低 nf_conntrack timeout时间

1
2
3
4
5
6
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

1
2
3
vim /etc/sysconfig/iptables-config 配置文件
IPTABLES_MODULES="nf_conntrack_ftp"
modproble nf_conntrack_ftp

2、放行请求报文:

命令连接:NEW, ESTABLISHED
数据连接:RELATED, ESTABLISHED

1
2
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、放行响应报文:

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

具体命令

1
2
3
4
5
6
7
8
9
10
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

规则优化

1、 安全放行所有入站和出站的状态为ESTABLISHED状态连接
2、 谨慎放行入站的新请求
3、 有特殊目的限制访问功能,要在放行规则之前加以拒绝
4、 同类规则(访问同一应用),匹配范围小的放在前面,用于特殊处理
5、 不同类的规则(访问不同应用),匹配范围大的放在前面
6、 应该将那些可由一条规则能够描述的多个规则合并为一条
7、 设置默认策略,建议白名单(只放行特定连接)
1) iptables -P,不建议
2) 建议在规则的最后定义规则做为默认策略

保存规则

保存规则至指定的文件
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:仅分析生成规则集,但不提交

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

  • 用脚本保存各iptables命令;让此脚本开机后自动运行
    /etc/rc.d/rc.local文件中添加脚本路径 /PATH/TO/SOME_SCRIPT_FILE
  • 用规则文件保存各规则,开机时自动载入此规则文件中的规则
    /etc/rc.d/rc.local文件添加 iptables-restore < /PATH/FROM/IPTABLES_RULES_FILE
  • 自定义Unit File,进行iptables-restore

网络防火墙

iptables/netfilter网络防火墙:

(1) 充当网关
(2) 使用filter表的FORWARD链

注意的问题:
(1) 请求-响应报文均会经由FORWARD链,要注意规则的方向性
(2) 如果要启用conntrack机制,建议将双方向的状态为ESTABLISHED的报
文直接放行

实验:实现内网ping外网,外网无法Ping内网

ip_forward功能启用

方法一:

1
2
3
iptables  -P FORWARD DROP
iptables -t filter -A FORWARD -s 192.168.31.0/24 -p icmp --icmp-type 8 -j ACCEPT
iptables -t filter -A FORWARD -d 192.168.31.0/24 -p icmp --icmp-type 0 -j ACCEPT

方法二:

1
2
3
iptables  -A FORWARD -m state --state ESTABLISHED -j ACCEPT
iptables -t filter -A FORWARD -s 192.168.31.0/24 -p icmp --icmp-type 8 -j ACCEPT
iptables -A FORWARD -j REJECT

实验:实现从内网可访问外网,外网可访问内网的HTTP和SSH服务

1
2
3
4
iptables -P FORWARD DROP
iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT
iptables -A FORWARD -s 192.168.31.0/24 -m state --state NEW -j ACCEPT
iptables -A FORWARD -d 192.168.31.0/24 -p tcp -m multiport --dports 22,80 -m state --state NEW -j ACCEPT

实验:实现外网可访问内网的单个FTP服务器

1
2
3
4
iptables  -P FORWARD DROP
modprobe nf_conntrack_ftp
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -p tcp --dport 21 -d 192.168.31.17 -m state --state NEW -j ACCEPT

实验:实现从内网可访问外网的特定服务FTP,HTTP,HTTPS

1
2
3
4
iptables  -P FORWARD DROP
modprobe nf_conntrack_ftp
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -p tcp -m multiport --dports 21,80,443 -s 192.168.31.0/24 -m state --state NEW -j ACCEPT

实验:自定义链实现从内网可访问外网的特定服务FTP,HTTP,HTTPS,DNS,MYSQL

1
2
3
4
5
6
7
8
iptables  -P FORWARD DROP
iptables -N WEB
iptables -A WEB -s 192.168.31.0/24 -p tcp -m multiport --dports 21,80,443,53 -j ACCEPT
iptables -A WEB -s 192.168.31.0/24 -p udp --dport 53 -j ACCEPT

iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -j WEB
iptables -vnL

修改自定义链,增加MYSQL的访问

1
iptables -R WEB 1  -p tcp -m multiport --dports 21,80,443,3306 -s 192.168.31.0/24 -j ACCEPT

删除自定义链

1
2
3
4
iptables -vnL
iptables -D FORWARD 2
iptables -F WEB
iptables -X WEB

实验:SNAT DNAT 端口转发

1
2
3
iptables -t nat -A POSTROUTING -s 192.168.31.0/24 -j SNAT --to-source 172.18.0.123
iptables -t nat -A POSTROUTING -s 192.168.31.0/24 -j MASQUERADE
iptables -t nat -A PREROUTING -d 172.18.0.123 -p tcp --dport 80 -j DNAT --to-destination 192.168.31.17
-------------本文结束感谢您的阅读-------------