简介:
iptables的前身叫ipfirewall (内核1.x时代,当内核发展到2.x系列的时候,软件更名为ipchains,现在更名iptables,可以将规则组成一个列表,实现绝对详细的访问控制功能。
工作在用户空间中,定义规则的工具,本身并不算是防火墙。它们定义的规则,让在内核空间当中的netfilter来读取,并且实现让防火墙工作。
内核空间中共有5个位置,用以执行用户空间的规则:
1.内核空间中:从一个网络接口进来,到另一个网络接口去的
2.数据包从内核流入用户空间的
3.数据包从用户空间流出的
4.进入/离开本机的外网接口
5.进入/离开本机的内网接口
这五个位置也被称为五个钩子函数(hook functions),也叫五个规则链:
PREROUTING (路由前):
在进入 IP 路由之前触发,就意味着只要接收到的数据包,无论是否真的发往本机,也都会触发这个钩子。它一般是用于目标网络地址转换(Destination NAT,DNAT)。
INPUT (数据包流入口):
报文经过 IP 路由后,如果确定是发往本机的,将会触发这个钩子,它一般用于加工发往本地进程的数据包。
FORWARD (转发管卡):
报文经过 IP 路由后,如果确定不是发往本机的,将会触发这个钩子,它一般用于处理转发到其他机器的数据包。
OUTPUT (数据包出口):
从本机程序发出的数据包,在经过 IP 路由前,将会触发这个钩子,它一般用于加工本地进程的输出数据包。
POSTROUTIN (路由后):
从本机网卡出去的数据包,无论是本机的程序所发出的,还是由本机转发给其他机器的,都会触发这个钩子,它一般是用于源网络地址转换(Source NAT,SNAT)
将使用场景和功能类似的规则组合在一起,通称为表:(security表不常用,所以一般都说4表5链)
raw表:
用于去除数据包上的连接追踪机制(Connection Tracking)。
mangle表:
修改报文原数据,修改数据包的报文头信息,比如服务类型(Type Of Service,ToS)、生存周期(Time to Live,TTL)。
nat表:
定义地址转换的,用于修改数据包的源或者目的地址等信息,典型的应用是网络地址转换(Network Address Translation)。
filter表:
定义允许或者不允许的,用于对数据包进行过滤,控制到达某条链上的数据包是继续放行、直接丢弃或拒绝(ACCEPT、DROP、REJECT),典型的应用是防火墙。
security表:
用于在数据包上应用SELinux,这张表并不常用
表优先级:raw→mangle→nat→filter→security
其中
raw表 可作用在:PREROUTING、OUTPUT链
mangle表 可作用在:PREROUTING、FORWARD、INPUT、OUTPUT、POSTROUTING
nat表需要分情况:
SNAT 可作用在: INPUT、POSTROUTING
DNAT 可作用在: OUTPUT、PREROUTING
filter表 可作用在:INPUT、FORWARD、OUTPUT
写法:
格式:iptables [-t table] COMMAND chain CRETIRIA -j ACTION
其中:
-t table :filter nat mangle等
COMMAND chain:定义如何对规则进行管理
-n 不进行反向解析,直接使用IP
-L 列出规则
iptables -t filter -nL
-A 追加
iptables -t filter -A INPUT -j ACCEPT
-I 插入
iptables -t filter -I OUTPUT 3 -j ACCEPT 插入后作为第三条规则
-D 删除
iptables -t filter -D INPUT 3 删除第三条
-R 替换
iptables -t filter -R INPUT 3 -p tcp --dport 22 -j ACCEPT 将第3条规则替换成接下来的规则
-S 打印
iptables -t filter -S [OUTPUT] 打印OUTPUT的链
-F 清空
iptables -t filter -F [OUTPUT] 清空OUTPUT链的规则,如果不加链,则并清空表的规则
-Z 清空并置零
iptables -t filter -Z [INPUT] 清空规则并将统计计数置零
-N 创建自定义链
iptables -t filter -N docker-user
-X 删除自定义链
iptables -t filter -X docker-user 要求先清空规则
-P 设置默认规则
iptables -t filter -P INPUT ACCEPT
CRETIRIA:指定匹配标准
根据IP地址匹配:-s xxx.xxx.xxx.xxx/xx -d xxx.xxx.xxx.xxx/xx
根据端口匹配:-p tcp --dport 80 --sport 8888
根据协议匹配:-p icmp/http/tcp/udp
根据进出网口:-i ethX -o ethX
-j ACTION :指定如何进行处理,匹配到规则之后,需要做什么动作
DROP:
直接将数据包丢弃。
REJECT:
跟DROP类似,但会给请求方返回一些拒绝信息,给客户端返回 Connection Refused 或 Destination Unreachable 报文。
RETURN:
跳出当前链,该链里后续的规则不再执行。一般用以自定义链
ACCEPT:
同意数据包通过,继续执行后续的规则。
JUMP:
跳转到其他用户自定义的链继续执行。
REDIRECT:
在本机做端口映射。
iptables -t nat -A PREROUTING -p tcp --dport 4444 -j REDIRECT --to-ports 6666
MASQUERADE:
地址伪装,自动用修改源或目标的 IP 地址来做 NAT。
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j MASQUERADE
LOG :
跟RETURN不同,LOG只是记录日志,并不会改变数据包的处理流程或导致数据包跳出当前链,系统日志路径为:/var/log/syslog or /var/log/messages
iptables -A INPUT -p tcp --dport 22 -j LOG --log-prefix "SSH connection: "
-m 显示扩展
multiport 模块 :可以在一条规则中匹配多端口,指定多个端口用逗号分隔,连续端口用冒号
iptables -t filter -A INPUT -p TCP -m multiport --dports 22,80,443 -j ACCEPT
iprange 模块可以指定一段连续ip地址范围:
iptables -t filter -A INPUT -p TCP -m iprange --src-range 192.168.15.1-192.168.15.10 -j ACCEPT
string 模块:匹配数据包内容
数据包中包含Hellworld 的数据不允许通过
iptables -t filter -A INPUT -p TCP -m string --string "Hellworld" --alog kmp -j DROP
time 模块:可以指定可访问的时间
每天1 到 3 时之间不允许访问
iptables -t filter -A INPUT -p TCP -m time --timestart 1:00 --timestop 3:00 -j DROP
icmp 模块:可以限制icmp的包类型
iptables -t filter -A INPUT -p icmp -m icmp --icmp-type "echo-request" -j DROP
connlimit 模块:可以限制同时连接数
iptables -t filter -A INPUT -p TCP --dport 22 -m connlimit --connlimit-above 2 -j DROP
limit 模块:可以限制速率
每秒限制333个连接
iptables -t filter -A INPUt -p TCP -m limit 333/s -j ACCEPT
每分钟只允许 5 个新的连接尝试,防止暴力破解攻击
iptables -A INPUT -p tcp --dport 22 -m limit --limit 5/min -j ACCEPT iptables -A INPUT -p tcp --dport 22 -j DROP
示例:
本地端口转发:
通过PREROUTING链,将外网访问4444端口转发到本机6666端口,此时本机访问4444并不进行转发
iptables -t nat -A PREROUTING -p tcp --dport 4444 -j REDIRECT --to-ports 6666
通过OUTPUT链,将本机访问4444端口转发到本机6666端口,此时外网访问4444并不进行转发
iptables -t nat -A OUTPUT -p tcp --dport 4444 -j REDIRECT --to-ports 6666
分流:通过PREROUTING链,将192.168.10.0/24网段访问4444端口的包转发到本机6666端口,其他网段则正常访问4444端口
iptables -t nat -A PREROUTING -p tcp -s 192.168.10.0/24 --dport 4444 -j REDIRECT --to-ports 6666
远程端口转发
1.开启Linux内核的转发功能,编辑 /etc/sysctl.conf文件
将net.ipv4.ip_forward = 0
修改为:net.ipv4.ip_forward = 1
2.修改完成后执行:
sysctl -p 使配置修改生效
DNAT模式:
是用来做目的网络地址转换, 可以做某种类型地负载平衡。只能用在nat表的PREROUTING和OUTPUT链,并且有一个--to-destination选项指定要写入IP头的地址,可以是一个ip范围192.168.10.141-192.168.10.151
SNAT模式:
用来源网络地址转换的,就是重写包的源IP地址。如果直接转发包的话,网络响应包上就不知道往哪儿发送应答,所以需要改为防火墙的地址。只能用在nat表的POSTROUTING链,且有一个--to-source选项
1、单独的地址。
2、一段连续的地址,如194.236.50.155-194.236.50.160,这样可以实现负载平衡。
iptables -t nat -A PREROUTING --dst 192.168.10.142 -p tcp --dport 4444 -j DNAT --to-destination 192.168.10.6:6666iptables -t nat -A POSTROUTING --dst 192.168.10.6 -p tcp --dport 6666 -j SNAT --to-source 192.168.10.142
MASQUERADE模式:
和SNAT模式作用一样,区别就是它不需要指定--to-source ,而是动态获取IP地址的连接的。比如,拨号上网、DHCP连接时我们ip是会变的。只能用于nat表的POSTROUTING链 ,有一个非必须--to-ports选项
iptables -t nat -A POSTROUTING --dst 192.168.10.6 -p tcp --dport 6666 -j MASQUERADEiptables -t nat -A PREROUTING --source 172.16.250.1 -p tcp --dport 4444 -j DNAT --to-destination 172.16.250.3:22iptables -t nat -A PREROUTING --dst 192.168.171.139 -p tcp --dport 5555 -j DNAT --to-destination 192.168.171.1:9999iptables -t nat -A POSTROUTING --dst 172.16.250.3 -p tcp --dport 22 -j MASQUERADEiptables -t nat -A POSTROUTING --dst 192.168.171.1 -p tcp --dport 9999 -j SNAT --to-source 192.168.171.139
自定义链的使用
定义一个名为ssh-rules的链来管理ssh登录的一些规则:
iptables -t filter -N ssh-rules1
在这个链中添加具体的规则:
iptables -t filter -A ssh-rules -s 18.130.0.0/16 -j ACCEPT
iptables -t filter -A ssh-rules -s 18.11.0.0/16 -j ACCEPT
iptables -t filter -A ssh-rules -j DROP1
然后将该链作为一个规则出口,挂在到iptable内置的链上:
iptables -A INPUT -p tcp -m tcp --dport 22 -j ssh-rules
删除自定义链,需要先清空规则,然后再删除:
iptables -t filter -F ssh-rules
iptables -t filter -X ssh-rules
保存:
iptables-save > /etc/iptables.rules
恢复:
iptables-restore < /etc/iptables.rules