Skip to main content

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 选项
  • 动作
    • --set-mark value[/mask] 设置 mark
    • --save-mark [--mask mask] 保存 mark
    • --restore-mark [--mask mask] 恢复 mark
    • --notrack 关闭链接跟踪
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
  • 参考

处理流

        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
  • 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

Notes

FAQ

How to do the port forwarding from one ip to another ip in same network?