结构
表(Table)
filter
表:用于过滤数据包,决定是否接受、拒绝或转发。nat
表:用于网络地址转换,修改数据包的源或目标地址。mangle
表:用于修改数据包的 TOS/DSCP 字段等。raw
表:用于配置特殊规则,如连接追踪(connection tracking)。
链(Chain)
每个表包含一系列链,每个链定义了对数据包的不同处理方式。以下是一些主要的链:
INPUT
: 处理进入本地系统的数据包。OUTPUT
: 处理从本地系统发出的数据包。FORWARD
: 处理通过系统进行的数据包转发。- 用户自定义链: 你可以创建自己的链,以更灵活地组织规则。
目标(Target)
ACCEPT
: 允许数据包通过。DROP
: 丢弃数据包,不给予任何响应。REJECT
: 拒绝数据包,返回错误消息。DNAT
: 目标地址转换,用于端口转发。SNAT
: 源地址转换,用于修改数据包的源地址。
使用规则
规则则是按照表、链、目标的顺序进行匹配数据包的操作,相当于在哪里,匹配哪一部分,怎样处理。
规则结构如下:
iptables -A <CHAIN> [OPTIONS] -j <TARGET>
<CHAIN>
:链的名称,如 INPUT、OUTPUT、FORWARD 等。
[OPTIONS]
:匹配条件,例如 -p(协议)、–dport(目标端口)等。
-j <TARGET>
:目标,定义了匹配条件满足时的操作,如 ACCEPT、DROP、REJECT 等。
常用方法
-
显示当前规则:
sudo iptables -L
加 -v显示详细信息 -
清除所有规则:
sudo iptables -F
-t nat 删除指定nat上的规则 -
添加规则:
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
允许 SSH 流量通过。
-
删除规则:
sudo iptables -D INPUT -p tcp --dport 22 -j ACCEPT
-
在指定链的指定位置插入规则:
sudo iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT
NAT 相关:
-
开启 IP 转发(用于路由器):
sudo sysctl -w net.ipv4.ip_forward=1
或者在 /etc/sysctl.conf 中添加 net.ipv4.ip_forward=1 并执行 sudo sysctl -p。 -
端口转发(将外部访问的 80 端口转发到内部主机的 8080 端口)
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.2:8080
状态查询:
- 显示连接追踪表(Connection Tracking Table):
sudo iptables -t raw -L -v
- 保存和加载规则:
保存规则到文件:
sudo sh -c 'iptables-save > /etc/iptables.rules'
从文件加载规则:
sudo sh -c 'iptables-restore < /etc/iptables.rules'