IPTable
- SNAT
- Source NAT
- 内部访问外部
- NAT/DNAT
- Destination NAT
- 外部访问内部
- 操作
- -A 追加
- -C 检查
- -D 删除
- -I 插入
- -R 替换
- -L 列表
- -S 列表 - 输出结果类似于 iptables-save,结果可以被解析
- -F 清空
- -Z 重置计数
- -N 创建 Chain
- -X 删除 Chain
- -P 为 Chain 设置目标 - ACCEPT DROP REJECT
- -E 重命名 Chain
- 条件 - 支持
!
取反- -p 协议 all, tcp, udp, udplite, icmp, esp, ah, sctp 活着
/etc/protocols
中的数字 - -s 来源地址
address[/mask]
- -d 目标地址
- -j 跳转到目标 - 停止处理当前 Chain - 内建目标或者扩展
- -g 前往到 Chain - 继续处理
- -i 进入的网口 - INPUT, FORWARD, PREROUTING - 网口名字如果为
eth+
则会匹配 eth 前缀 - -o 出去的网口 - FORWARD, OUTPUT, POSTROUTING
- -f 规则只会处理第二个和之后的 fragmented packets, 例如 ICMP
- --src-type 来源地址类型
- --dst-type 目标地址类型
- --connbytes
from[:to]
匹配包大小 - --ctstate 链接状态
- --ctproto 匹配 4 层协议
- --src-range
from[-to]
来源地址范围 - --dst-range
from[-to]
目标地址范围 - --ipvs 属于 IPVS 的链接
- --vproto VIP 协议
- --vaddr VIP 地址
- --vport VIP 端口
- --vmethod
{GATE|IPIP|MASQ}
IPVS 转发方法 - --vportctl 控制端口 - 例如 FTP 是 21
- --length
length[:length]
匹配 3 层的包长度 - length 模块 - --limit
rate[/second|/minute|/hour|/day]
达到限流后会匹配 - limit 模块 - --limit-burst 限流峰值 默认 5
- --mac-source MAC 地址匹配
- --mark
value[/mask]
匹配 netfilter 的 mark 字段 - --source-ports/--sports
port[,port|,port:port]
匹配来源端口 - --destination-ports/--dports 目标端口
- --ports 目标和来源端口
- --uid-owner
username/userid[-userid]
- --gid-owner
groupname/groupid[-groupid]
- --socket-exists 包关联到 socket
- --rateest-lt 频率小于
- --rateest-gt 频率大于
- --probability 概率匹配
- --every 每 N 包匹配
- --string 模式匹配
- --hex-string 模式匹配
- --source-port,--sport 来源端口
- --destination-port,--dport 目标端口
- --tcp-flags 匹配 TCP 标记
- --syn 匹配 SYN
- --tcp-option number 匹配 TCP 选项
- -p 协议 all, tcp, udp, udplite, icmp, esp, ah, sctp 活着
- 动作
- --set-mark
value[/mask]
设置 mark - --save-mark [--mask mask] 保存 mark
- --restore-mark [--mask mask] 恢复 mark
- --notrack 关闭链接跟踪
- --set-mark
tip
- SDNAT 务必限定来源地址或网口
- DNAT 务必限定目标地址或网口 - 否则全量替换不一定是期望结果
- 处理的是连续的被跟踪的包,而不是离散的 - conntrack
- nat 只会处理连接的第一包
- 操作对象 Table/Chain
- filter - 默认
- INPUT - 目标是本地的包
- FORWARD - 路由经过的包
- OUTPUT - 本地生成的包
- nat - 当创建新的包时会使用该表
- PREROUTING - 修改进入的包
- OUTPUT - 在路由之前修改本地生成的包
- POSTROUTING - 修改出去的包
- mangle - 用于特殊包修改
- PREROUTING - 在路由前 修改进入的包
- OUTPUT - 在路由前 修改本地生成的包
- INPUT - packets coming into the box itself
- FORWARD - packets being routed through the box
- POSTROUTING - altering packets as they are about to go out
- raw - 主要用于配合 NOTRACK 使用,在所有 IP 表之前处理
- PREROUTING - packets arriving via any network interface
- OUTPUT - packets generated by local processes
- security - 用于 Mandatory Access Control 网络规则,SELinux
- filter - 默认
- 参考
- Lochnair/xt_tls
- 支持 SNI 匹配的扩展
- Lochnair/xt_tls
处理流
IN OUT
+ ^
| |
| |
+--------v--------+ +-----------------+
|PREROUTING | |POSTROUTING |
| nat | | nat |
| mangle | | raw |
| raw | | mangle |
+-----------------+ +----------------+ +--------^--------+
| |FORWARD | |
+--------------> filter +--------------+
localhost | mangle | |
+-----------------+ +----------------+ +-----------------+
|INPUT | |OUTPUT |
| filter | | filter |
| mangle +---------> LOCAL +--------->+ nat |
| | | mangle |
| | | raw |
+-----------------+ +-----------------+
# 重置 iptables
# ===============
# 设置默认策略为 ACCEPT
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -t nat -F
iptables -t mangle -F
# 删除规则
iptables -F
# 删除额外 CHAIN
iptables -X
# 重置 counter
iptables -Z
# -C --check 检测是否存在
iptables -C FORWARD -i eth0 -j ACCEPT
# 以前的检测方式
iptables-save | grep -- "-A INPUT -p tcp -m tcp --dport 8080 -j ACCEPT"
# 查看状态
iptables -nvL
# 查看所有规则
# -c 包含包和字节计数
# -t 指定表
iptables-save
# 纯规则 - 便于进行 diff
iptables-save | grep -v '^#' | sed -r 's/(^:[^[]]+).*/\1[0:0]/'
# 排除规则 - 排除 libvirt 相关规则
iptables-save | grep -v LIBVIRT
# 常用
ipts() { iptables-save "$@" | grep -v '^#' | sed -r 's/(^:[^[]]+).*/\1[0:0]/' | grep -v LIBVIRT | grep -i -v DOCKER; }
# 查看 nat 路由表
iptables -t nat -v -L -n --line-number
# 显示 PREROUTING 表
iptables -t nat -v -L PREROUTING -n --line-number
# 显示 POSTROUTING 表
iptables -t nat -v -L POSTROUTING -n --line-number
# 通过行号删除规则
iptables -t nat -D POSTROUTING 3
# 规则处理统计
iptables -t nat -L -v
iptables -t nat -A POSTROUTING -s 10.0.0.0/24 ! -d 10.0.0.0/24 -j MASQUERADE
# 设置备注
iptables -A INPUT -i eth1 -m comment --comment "my local LAN"
# ICMP 的帮助 - 支持 --icmp-type
iptables -p icmp -h
NAT 表
NIC +----> PREROUTING +-------------------> Local
+ ^
| |
| |
v +
NIC <----+ POSTROUTING <----+ OUTPUT <----+ Local
- iptables-save
- debian
- /etc/iptables/rules.v6
- /etc/iptables/rules.v4
- debian
iptables-restore < /etc/iptables/rules.v4
netfilter-persistent save|reload
empty
*mangle
:PREROUTING ACCEPT [8:584]
:INPUT ACCEPT [8:584]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [6:616]
:POSTROUTING ACCEPT [6:616]
COMMIT
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT
*filter
:INPUT ACCEPT [8:584]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [11:1432]
COMMIT