iptables
一、基础概念
防火墙是是一款报文隔离工具,工作于主机或网络的边缘,它能够根据事先定义的检查规则对进出本主机或网络的报文做匹配检测,发现被规则匹配的报文则做出相应处理。Linux防火墙发展到今天,已经迭代很多次了,Linux内核1.0时代的初代防火墙被叫做ipfirewall,到Linux内核2.0的时候,防火墙就被叫做ipchains,在往后就被称为iptables了,但是到Linux内核4.0又被改名为nftables
1. 防火墙种类
- 主机防火墙
- 网络防火墙
2. iptables与netfilter
iptables是用户空间规则管理工具,而真正实现防火的是netfilter。netfilter工作在内核中提供网络报文过滤处理框架(framework),它在内核中提供了五个钩子函数(hooks functions),iptables是在用户空间负责向钩子函数增删改查规则的工具,netfilter只是在tpc/ip协议栈设立的五个卡哨,真正能发挥功能还要在卡哨上添加规则
3. iptables的表
(1) 过滤(filter)
可实现过滤的链
INPUT
FORWARD
OUTPUT
(2) 网络地址转换(nat:network address translation)
可实现NAT的链
PREROUTING(DNAT)
POSTROUTING(SNAT)
OUTPUT
(3) mangle(拆解报文、做出修改、封装报文)
可实现mangle的链
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
(4) raw
防火墙为了可以将NAT转换后的请求无误的发送给每一个目标,其内部有一个追踪机制叫做raw。连接追踪很实用,但是在非常繁忙的前端负载均衡服务器一定要关闭连接追踪功能,如果开启请准备充足内存,并且调大连接追踪可用内存,不然会出现大量拒绝连接现象
可实现raw的链
OUTPUT
PREROUTING
4. 各表的生效次序
各表的生效优先级:raw --> mangle --> nat --> filter
如图所示当报文入站,需按照顺序经过raw表、mangle表、nat表的PREROUTING链处理,之后经拆解决定进入本机或转发
- 如果报文是进入本机,则需要按照优先级经由mangle表、filter表的INPUT链过滤后,转交给本机的进程,进程处理完请求将结果按照顺序经由raw表、mangle表、nat表、filter表的OUTPUT链处理,最后按照顺序经由mangle表、nat表的POSTROUTING链完成出站
- 如果报文需要经由本机转发,则按照次序经由mangle表、filter表的FORWARD链进行处理,最后交给mangle表、nat表的POSTROUTING完成出站
5. 报文流向需经过的链
- 进入本机:
PREROUTING --> INPUT
- 从本机流出:
OUTPUT --> POSTROUTING
- 本机负责转发:
PREROUTING --> FORWARD --> POSTROUTING
6. 规则的组成部分
(1) 报文的匹配条件
用来指定哪一类报文做出处理
- 基本匹配条件:根据源ip、目标ip、源端口、目标端口
- 扩展匹配:
(2) 匹配到之后的处理动作
一旦报文匹配成功后,对其的处理动作
- 内检处理机制:DROP(丢弃)、REJECT(拒绝)
- 扩展处理动作:
- 自定义处理机制:仅仅能够指明跳转自定义目标链,报文不会经过自定义链,只能在内置链上通过规则引用后生效;
8. 定义规则的注意事项
各链上的规则次序即为检查次序,因此隐含一定的应用法则
- 访问同一应用的规则:匹配范围小的应放上面
- 访问不同类的应用的规则:匹配报文频率较大的放在上面
- 可按需将多个小范围规则合并成一个大规则,如一条规则开放80端口、第二条规则开放443端口,可以将则两条合并成一条
- 设定默认规则
二、命令用法
iptables命令格式用法有很多,根据不同的子命令其标准格式也不同
- 修改规则命令格式:
iptables [-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
|
三、iptables构建网络防火墙
1. 配置网络路由器
使用iptables构建网络防火墙需要开启核心转发功能
- 核心转发查看:
cat /proc/sys/net/ipv4/ip_forward
- 临时开启核心转发功能:
sysctl -w net.ipv4.ip_forward=1
- 永久开启核心转发功能:编辑
/etc/sysctl.conf/
加入net.ipv4.ip_forward = 1
2. 客户端添加路由策略
在客户端中加入通往192.168.70.0
网络的路由条目:ip route add 192.168.70.0/24 via 192.168.60.230 dev ens33
3. 配置内网web
将内网主机的默认网关调整为192.168.70.254
,启动web服务
4. 在网络路由器中加入iptables策略
网络路由器开启核心转发功能、客户端添加路由条目后,就已经可以访问内网web了。不过如果把网络路由器的FORWARD链默认策略调整为DROP的话,就必须加入放行策略
iptables -I FORWARD -m state --state ESTABLISHED -j ACCEPT
iptables -A FORWARD -d 192.168.70.100 -p tcp --dport 80 -m state --state NEW -j ACCEPT
四、NAT
1. SNAT
源地址转换需要使用iptables处理动作的SNAT
格式:-j SNAT S_OPTION
--to-source ip[-ip][:port-port]
:IP地址可以指定范围,在此范围内轮询--random
:如果指定一个IP地址范围,挑选顺序改为随机而不是轮询--persistent
:如果指定一个IP地址范围,挑选顺序改为固定而不是轮询
如果没有固定的IP地址,那么使用SNAT固定指定的IP地址就存在失效的可能性,这种情况可以使用另外一个target叫做MASQUERADE,不过这个target需要消耗更多的资源,它每次转换都需要去判定你的接口IP地址
格式:-j MASQUERADE
2. DNAT
格式:-j DNAT S_OPTION
--to-destination ip[-ip][:port-port]
:IP地址可以指定范围,在此范围内轮询--random
:如果指定一个IP地址范围,挑选顺序改为随机而不是轮询--persistent
:如果指定一个IP地址范围,挑选顺序改为固定而不是轮询
3. REDIRECT
端口重定向使用REDIRECT处理动作
格式:-j REDIRECT
--to-ports #
五、iptables保存、导入规则
1. Centos 7
- 保存规则:
iptables-save > /path/to/somefile
- 导入规则:
iptables-restore < /path/to/somefile
2. Centos 6
- 保存规则方法1:
service iptables save
,会覆盖保存至/etc/sysconfig/iptables
文件中 - 保存规则方法2:
iptables-save > /path/to/somefile
- 导入规则:
iptables-restore < /path/to/somefile
- 重载规则:
service iptables restart
,会读取/etc/sysconfig/iptables
文件中的规则覆盖当前规则
六、iptables放行ftpd服务
1. 装载模块
只要启动iptables的链接追踪功能,nf_conntrack
模块就会被自动装载,但是这个模块不能追踪ftpd的状态,需要使用专用模块nf_conntrack_ftp
,所以第一步需要装载模块
modprobe nf_conntrack_ftp
2. 放行请求报文
在INPUT链中加入放行状态为NEW、ESTABLISHED、RELATED的链接
iptables -A INPUT -d 192.168.60.200 -p tcp --dport 21 -m state --state NEW -j ACCEPT
iptables -I INPUT -d 192.168.60.200 -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
3. 放行响应链接
iptables -I OUTPUT -s 192.168.60.200 -m state --state ESTABLISHED -j ACCEPT