一定要了解的iptables实用技巧
基本原理介绍
常见的几种数据包的流向:
- 进入本机某进程的报文
- 本机某进程发出的报文
- 由本机转发出去的报文
四张表,优先级顺序 raw
➡️ mangle
➡️ nat
➡️ filter
规则增删改查
一、查看规则
最简单的命令,直接查看 filter
规则。
1 | iptables -t filter -nvL |
可省略 -t
选项,默认为 filter
表,等价于 iptables -nvL
查看其它表规则内容
1 | iptables -t raw -nvL |
二、增加规则
在 INPUT 链最后增加一个规则
1 | iptables -t filter -A INPUT -s 192.168.0.3 -j DROP |
在 INPUT 链开头增加一个规则
1 | iptables -t filter -I INPUT -s 192.168.0.2 -j DROP |
在 INPUT 链的第 2 个位置插入一个规则
1 | iptables -t filter -I INPUT 2 -s 192.168.0.2 -j DROP |
规则按顺序匹配,只要匹配到就不在往下走了。
iptables -F INPUT
三、删除规则
删除 INPUT 第 3 条规则
1 | iptables -t filter -D INPUT 3 |
删除 INPUT 匹配的规则
1 | iptables -t filter -D INPUT -s 192.168.0.2 -j DROP |
删除 INPUT 链上所有规则
1 | iptables -t filter -F INPUT |
四、修改规则
修改 INPUT 链第 1 条规则
1 | iptables -t filter -R INPUT 1 -s 192.168.0.2 -j REJECT |
设置 FORWARD 默认为 ACCEPT
1 | iptables -t filter -P FORWARD ACCEPT |
五、保存恢复规则
默认显示所有设置的规则,使用重定向可以保存所有规则
1 | iptables-save |
加载恢复所有规则(覆盖)
1 | iptables-restore < /etc/sysconfig/iptables |
常用匹配条件
匹配目标地址
1 | iptables -t filter -I INPUT -d 192.168.0.3 -j DROP |
可指定匹配多个 IP 地址,多个地址使用逗号分隔
1 | iptables -t filter -I INPUT -s 192.168.0.2,192.168.0.3 -j DROP |
可指定匹配网段
1 | iptables -t filter -I INPUT -s 192.168.1.0/24 -j DROP |
匹配指定地址范围
1 | iptables -t filter -I INPUT -m iprange --src-range 192.168.0.2-192.168.0.20 -j DROP |
按照协议匹配
1 | iptables -t filter -I INPUT -p tcp -j REJECT |
指定匹配网口
1 | iptables -t filter -I INPUT -i eth4 -p icmp -j DROP |
按照四层端口匹配
1 | # `--dport` 目的端口 `--sport` 源端口 |
高级匹配条件
按照报文字符串来匹配
1 | iptables -t filter -I INPUT -m string --algo bm --string "Hello" -j REJECT |
根据时间段匹配
1 | iptables -t filter -I INPUT -p tcp --dport 80 -m time \ |
限制请求连接
1 | # 每个IP只能2个SSH连接 |
请求匹配 TCP 报文
1 | # 第 1 次握手包丢弃 |
匹配 ICMP 报文,禁止别人 ping 我们的设备
1 | iptables -t filter -I INPUT -p icmp --icmp-type 8/0 -j REJECT |
自定义链
当默认链中的规则非常多时,不方便我们管理。自定义链并不能直接使用,而是需要被默认链引用才能够使用。
1 | iptables -t filter -N WEB |
修改自定义链名称
1 | # 修改自定义链名称,引用自定义链处的名称会自动发生改变 |
删除自定义链
1 | iptables -t filter -X HTTP |
删除自定义链,要满足 2 个条件,一是自定义链没有被任何默认链引用,二是自定义链中没有任何规则。
NAT功能
设置 SNAT 功能(内网主动向外部网络请求)
1 | # SNAT 指定源地址 |
设置 DNAT 功能(外网主动向内部网络请求)
1 | iptables -t nat -I PREROUTING -d 192.168.1.146 -p tcp --dport 3389 -j DNAT --to-destination 10.1.0.6:3389 |
将本机的 80 端口映射到本机的 8080 端口上
1 | iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080 |
REDIRECT
规则只能定义在PREROUTING
链或者OUTPUT
链中
常用选项参数
-t
:指定表名称-L
:列出规则-v
:显示详细信息--line-number
:显示行号-X
:删除自定义链-I
:链的首部插入规则;-A
:链的尾部追加规则;
处理动作
ACCEPT
:接受DROP
:丢弃REJECT
:拒绝–reject-with
:拒绝选项- icmp-net-unreachable、icmp-host-unreachable、icmp-port-unreachable(默认)
- icmp-proto-unreachable、icmp-net-prohibited、icmp-host-pro-hibited、icmp-admin-prohibited
SNAT
- 内网主动访问外部网络
- 隐藏内网主机 IP、共享公网 IP
MASQUERADE
:特殊的 SNAT,能自动选择 SNAT 地址DNAT
- 外网主动访问内部网络
- 隐藏内网主机 IP
REDIRECT
LOG
--log-devel
- emerg、alert、crit、error、warning、notice、info、debug
--log_prefix