基本概念
netfilter是一个免费的包过滤防火墙,位于内核空间,替代商业防火墙方案,完成封包过滤,封包重定向,网络地址转换(NAT)等功能。
iptables是一个命令行工具,位于用户空间,用来操作netfilter。
- 5条链(关卡):
到本机某进程的报文:prerouting–>input
本机某进程发出的报文:output–>postrouting
本机转发的报文:prerouting–>forward–>postrouting
- 4张表:
表中包含一条条规则
规则组成:
匹配条件+处理动作
匹配条件:source ip,port destination ip, port
处理动作:accept, drop, reject, snat, masquerde, dnat, redirect, log
表的作用:
filter:过滤
nat:网络地址转换
mangle:拆解报文,作出修改,重新封包
raw:关闭nat表启用的连接追踪机制
规则查看
iptables -t 表名 -L 链名
选项:
-v 显示详细信息
-n 不解析IP地址
-x 显示计数器精确值
–line-number 规则显示编号
规则管理
- 添加规则:
1 | iptables -t filter -I INPUT -s ip -j ACCEPT |
-I 在表头插入规则
-A 在表尾追加规则
规则的顺序很重要,如果某个报文已经被前面的规则匹配了,那么后面的规则不会处理。
- 删除规则
按序号删除
1 | iptables --line -vnL INPUT |
按匹配条件和处理动作删除
1 | iptables -t filter -D INPUT -s ip -j ACCEPT |
- 修改规则
命令语法:iptables -t 表名 -R 链名 规则序号 规则原本的匹配条件 -j 动作
示例:iptables -t filter -R INPUT 3 -s 192.168.1.146 -j ACCEPT
修改默认规则
命令语法:iptables -t 表名 -P 链名 动作
示例:iptables -t filter -P FORWARD ACCEPT
!!! 修改iptables都是临时修改,iptables服务或者机器重启后都会丢失,一定要保存。
service iptables save
匹配条件
匹配条件可以取反
基本匹配条件源ip 目的ip
扩展匹配条件 源端口, 目的端口,需要 -m参数指定模块
- 扩展匹配模块
tcp:匹配tcp协议 –sport –dport –tcp-flags –syn
multiport:匹配多个端口
iprange: 匹配连续IP范围
string: 匹配报文中包含的字符
time: 匹配报文的时间段区
connlimit:匹配单个ip连接数量
limit: 匹配单位时间内的报文数量
udp: 匹配udp协议
icmp: 匹配icmp协议
state: 匹配连接状态,实现连接追踪
黑白名单机制
- 黑名单机制
INPUT链默认策略设置为ACCEPT,添加动作为DROP的规则。不够安全
- 白名单机制
1)链默认策略设置为RDROP,添加动作为ACCEPT的规则,但是规则清空后,管理员也无法登录主机。
2)链默认策略设置为ACCEPT,设置放行规则完毕之后,在最后设置一条拒绝所有连接的规则。
自定义链
方便管理各种规则,普通规则的动作设置为自定义链,符合条件的报文会经过自定义链的规则。
Docker一般也会添加自定义链。
1 | # 添加自定义链 |
动作总结
- accept
- drop
- log
- snat 用来隐藏内网IP或者共享公网IP。
- dnat 用来暴露内网服务
snat dnat 都用到了snat dnat两个动作,snat在前就叫snat, dnat在前就叫dnat
- masquerde 和snat相似,区别在于不绑定具体ip,而绑定网卡上的可用ip,用在外网ip地址常变动场景下。
- redirect 本机端口映射
套路总结
- 规则顺序很重要,如果前面规则匹配,后面规则不会执行,所以相同服务的规则,更严格的规则要放前面
- 规则中多个匹配项存在“与“的关系
- 不考虑第一条规则的情况下,使用频率更高的规则放前面,节省主机计算资源。
- iptables作为防火墙时,要考虑双向性,从内到外,从外到内。
- 设置白名单机制时,通常将链默认策略设置为ACCEPT,设置放行规则完毕之后,在最后设置一条拒绝所有连接的规则。