7.1 NAT 基础概念

NAT 的工作原理

NAT(Network Address Translation,网络地址转换)是一种网络技术,用于在不同网络之间转换 IP 地址。它允许私有网络中的多个设备共享一个或少数几个公网 IP 地址访问互联网。

NAT 的类型

  1. SNAT(Source NAT):源地址转换

    • 修改数据包的源 IP 地址
    • 主要用于内网访问外网
    • 在 POSTROUTING 链中处理
  2. DNAT(Destination NAT):目标地址转换

    • 修改数据包的目标 IP 地址
    • 主要用于外网访问内网服务
    • 在 PREROUTING 链中处理
  3. MASQUERADE:地址伪装

    • SNAT 的特殊形式
    • 适用于动态 IP 地址
    • 自动使用出站接口的 IP 地址

NAT 表和链的关系

nat 表包含的链:
- PREROUTING:处理进入的数据包(DNAT)
- OUTPUT:处理本机产生的数据包
- POSTROUTING:处理离开的数据包(SNAT/MASQUERADE)

数据包在 NAT 中的流向

外网 → PREROUTING(DNAT) → 路由判断 → FORWARD → POSTROUTING(SNAT) → 内网
内网 → POSTROUTING(SNAT) → 路由判断 → FORWARD → PREROUTING(DNAT) → 外网

7.2 SNAT 配置

基本 SNAT 配置

固定 IP 的 SNAT

# 基本 SNAT 语法
iptables -t nat -A POSTROUTING -s source_network -o output_interface -j SNAT --to-source external_ip

# 示例:内网访问外网
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 203.0.113.1

# 多个内网段
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 203.0.113.1
iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o eth0 -j SNAT --to-source 203.0.113.1

# 指定端口范围
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -p tcp -o eth0 -j SNAT --to-source 203.0.113.1:1024-65535

多个外网 IP 的负载均衡

# 多个外网 IP 轮询
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 203.0.113.1-203.0.113.10

# 基于连接的负载均衡
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -m statistic --mode nth --every 3 --packet 0 -j SNAT --to-source 203.0.113.1
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -m statistic --mode nth --every 3 --packet 1 -j SNAT --to-source 203.0.113.2
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 203.0.113.3

基于协议的 SNAT

# TCP 协议使用一个 IP
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -p tcp -o eth0 -j SNAT --to-source 203.0.113.1

# UDP 协议使用另一个 IP
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -p udp -o eth0 -j SNAT --to-source 203.0.113.2

# ICMP 协议使用第三个 IP
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -p icmp -o eth0 -j SNAT --to-source 203.0.113.3

MASQUERADE 配置

基本 MASQUERADE

# 动态 IP 的网络共享
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp0 -j MASQUERADE

# 多网卡环境
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o eth1 -j MASQUERADE

# 指定端口范围
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -p tcp -o ppp0 -j MASQUERADE --to-ports 1024-65535

条件 MASQUERADE

# 基于时间的网络共享
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -m time --timestart 08:00 --timestop 18:00 -j MASQUERADE

# 基于目标地址的 MASQUERADE
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -d 8.8.8.8 -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 ! -d 192.168.0.0/16 -o eth0 -j MASQUERADE

企业网关 SNAT 配置

#!/bin/bash
# 企业网关 SNAT 配置

# 启用 IP 转发
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf

# 清空 NAT 表
iptables -t nat -F

# 不同部门使用不同的外网 IP
# 管理部门(192.168.1.0/24)使用 IP1
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 203.0.113.1

# 开发部门(192.168.10.0/24)使用 IP2
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth0 -j SNAT --to-source 203.0.113.2

# 销售部门(192.168.20.0/24)使用 IP3
iptables -t nat -A POSTROUTING -s 192.168.20.0/24 -o eth0 -j SNAT --to-source 203.0.113.3

# 其他部门使用 MASQUERADE
iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -o eth0 -j MASQUERADE

# 配置 filter 表规则
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -s 192.168.0.0/16 -j ACCEPT
iptables -A FORWARD -j DROP

7.3 DNAT 配置

基本 DNAT 配置

端口映射

# 基本 DNAT 语法
iptables -t nat -A PREROUTING -d external_ip -p protocol --dport external_port -j DNAT --to-destination internal_ip:internal_port

# Web 服务器映射
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10:80
iptables -t nat -A PREROUTING -p tcp --dport 443 -j DNAT --to-destination 192.168.1.10:443

# SSH 服务器映射
iptables -t nat -A PREROUTING -p tcp --dport 2222 -j DNAT --to-destination 192.168.1.20:22

# 数据库服务器映射
iptables -t nat -A PREROUTING -p tcp --dport 3306 -j DNAT --to-destination 192.168.1.30:3306

多端口映射

# 多个端口映射到同一服务器
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10:80
iptables -t nat -A PREROUTING -p tcp --dport 443 -j DNAT --to-destination 192.168.1.10:443
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.10:8080

# 端口范围映射
iptables -t nat -A PREROUTING -p tcp --dport 8000:8999 -j DNAT --to-destination 192.168.1.10:8000-8999

# 使用 multiport 模块
iptables -t nat -A PREROUTING -p tcp -m multiport --dports 80,443,8080 -j DNAT --to-destination 192.168.1.10

负载均衡 DNAT

# 简单轮询负载均衡
iptables -t nat -A PREROUTING -p tcp --dport 80 -m statistic --mode nth --every 3 --packet 0 -j DNAT --to-destination 192.168.1.10:80
iptables -t nat -A PREROUTING -p tcp --dport 80 -m statistic --mode nth --every 3 --packet 1 -j DNAT --to-destination 192.168.1.11:80
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.12:80

# 基于源 IP 的负载均衡
iptables -t nat -A PREROUTING -p tcp --dport 80 -m statistic --mode random --probability 0.33 -j DNAT --to-destination 192.168.1.10:80
iptables -t nat -A PREROUTING -p tcp --dport 80 -m statistic --mode random --probability 0.50 -j DNAT --to-destination 192.168.1.11:80
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.12:80

条件 DNAT

基于源地址的 DNAT

# 不同源地址访问不同服务器
iptables -t nat -A PREROUTING -s 192.168.1.0/24 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10:80
iptables -t nat -A PREROUTING -s 192.168.2.0/24 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.11:80
iptables -t nat -A PREROUTING -s 10.0.0.0/8 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.12:80

# 外网和内网不同的映射
iptables -t nat -A PREROUTING -s ! 192.168.0.0/16 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10:80
iptables -t nat -A PREROUTING -s 192.168.0.0/16 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.20:80

基于时间的 DNAT

# 工作时间访问生产服务器
iptables -t nat -A PREROUTING -p tcp --dport 80 -m time --timestart 08:00 --timestop 18:00 --weekdays Mon,Tue,Wed,Thu,Fri -j DNAT --to-destination 192.168.1.10:80

# 非工作时间访问维护页面
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:80

基于接口的 DNAT

# 不同网络接口的不同映射
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10:80
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j DNAT --to-destination 192.168.2.10:80

高级 DNAT 配置

端口范围映射

# 连续端口范围映射
iptables -t nat -A PREROUTING -p tcp --dport 8000:8999 -j DNAT --to-destination 192.168.1.10:8000-8999

# 映射到不同的端口范围
iptables -t nat -A PREROUTING -p tcp --dport 9000:9999 -j DNAT --to-destination 192.168.1.10:8000-8999

# FTP 被动模式端口映射
iptables -t nat -A PREROUTING -p tcp --dport 21 -j DNAT --to-destination 192.168.1.10:21
iptables -t nat -A PREROUTING -p tcp --dport 20000:20100 -j DNAT --to-destination 192.168.1.10:20000-20100

协议特定的 DNAT

# TCP 和 UDP 使用不同的映射
iptables -t nat -A PREROUTING -p tcp --dport 53 -j DNAT --to-destination 192.168.1.10:53
iptables -t nat -A PREROUTING -p udp --dport 53 -j DNAT --to-destination 192.168.1.11:53

# 游戏服务器(TCP + UDP)
iptables -t nat -A PREROUTING -p tcp --dport 7777 -j DNAT --to-destination 192.168.1.50:7777
iptables -t nat -A PREROUTING -p udp --dport 7777 -j DNAT --to-destination 192.168.1.50:7777

7.4 端口转发和重定向

REDIRECT 目标

本地端口重定向

# 基本重定向语法
iptables -t nat -A PREROUTING -p tcp --dport source_port -j REDIRECT --to-port target_port

# HTTP 重定向到代理
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3128

# HTTPS 重定向
iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 3129

# 端口范围重定向
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j REDIRECT --to-ports 8000-8999

透明代理配置

#!/bin/bash
# 透明代理配置

# HTTP 透明代理
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 3128

# HTTPS 透明代理(需要 SSL Bump)
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 443 -j REDIRECT --to-port 3129

# 排除代理服务器自身
iptables -t nat -I PREROUTING -s 192.168.1.100 -j ACCEPT

# 排除内网服务器
iptables -t nat -I PREROUTING -d 192.168.1.0/24 -j ACCEPT

条件重定向

# 基于源地址的重定向
iptables -t nat -A PREROUTING -s 192.168.1.0/24 -p tcp --dport 80 -j REDIRECT --to-port 3128
iptables -t nat -A PREROUTING -s 192.168.2.0/24 -p tcp --dport 80 -j REDIRECT --to-port 3129

# 基于时间的重定向
iptables -t nat -A PREROUTING -p tcp --dport 80 -m time --timestart 18:00 --timestop 08:00 -j REDIRECT --to-port 8080

# 基于用户的重定向
iptables -t nat -A OUTPUT -m owner --uid-owner 1000 -p tcp --dport 80 -j REDIRECT --to-port 3128

复杂端口转发场景

多层端口转发

#!/bin/bash
# 多层端口转发配置

# 第一层:外网到 DMZ
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.100.10:80
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j DNAT --to-destination 192.168.100.10:443

# 第二层:DMZ 到内网
iptables -t nat -A PREROUTING -i eth1 -s 192.168.100.10 -p tcp --dport 3306 -j DNAT --to-destination 192.168.1.30:3306
iptables -t nat -A PREROUTING -i eth1 -s 192.168.100.10 -p tcp --dport 6379 -j DNAT --to-destination 192.168.1.31:6379

# 配置相应的 SNAT
iptables -t nat -A POSTROUTING -o eth1 -d 192.168.1.30 -j SNAT --to-source 192.168.100.1
iptables -t nat -A POSTROUTING -o eth1 -d 192.168.1.31 -j SNAT --to-source 192.168.100.1

动态端口映射

#!/bin/bash
# 动态端口映射脚本

# 函数:添加端口映射
add_port_mapping() {
    local external_port=$1
    local internal_ip=$2
    local internal_port=$3
    
    iptables -t nat -A PREROUTING -p tcp --dport $external_port -j DNAT --to-destination $internal_ip:$internal_port
    iptables -A FORWARD -p tcp -d $internal_ip --dport $internal_port -j ACCEPT
    
    echo "Added mapping: $external_port -> $internal_ip:$internal_port"
}

# 函数:删除端口映射
remove_port_mapping() {
    local external_port=$1
    local internal_ip=$2
    local internal_port=$3
    
    iptables -t nat -D PREROUTING -p tcp --dport $external_port -j DNAT --to-destination $internal_ip:$internal_port
    iptables -D FORWARD -p tcp -d $internal_ip --dport $internal_port -j ACCEPT
    
    echo "Removed mapping: $external_port -> $internal_ip:$internal_port"
}

# 示例使用
add_port_mapping 8080 192.168.1.10 80
add_port_mapping 8443 192.168.1.10 443
add_port_mapping 2222 192.168.1.20 22

7.5 完整的 NAT 网关配置

基础 NAT 网关

#!/bin/bash
# 基础 NAT 网关配置脚本

# 网络配置
INTERNAL_NET="192.168.1.0/24"
INTERNAL_IF="eth1"
EXTERNAL_IF="eth0"
EXTERNAL_IP="203.0.113.1"

# 清空现有规则
iptables -F
iptables -t nat -F
iptables -t mangle -F

# 设置默认策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# 启用 IP 转发
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf

# === INPUT 链规则 ===
# 允许本地回环
iptables -A INPUT -i lo -j ACCEPT

# 允许已建立的连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 允许内网管理访问
iptables -A INPUT -i $INTERNAL_IF -s $INTERNAL_NET -j ACCEPT

# 允许外网 SSH(可选)
iptables -A INPUT -i $EXTERNAL_IF -p tcp --dport 22 -j ACCEPT

# === FORWARD 链规则 ===
# 允许已建立的连接
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

# 允许内网访问外网
iptables -A FORWARD -i $INTERNAL_IF -s $INTERNAL_NET -j ACCEPT

# === NAT 规则 ===
# SNAT:内网访问外网
iptables -t nat -A POSTROUTING -s $INTERNAL_NET -o $EXTERNAL_IF -j SNAT --to-source $EXTERNAL_IP

# DNAT:外网访问内网服务(示例)
# iptables -t nat -A PREROUTING -i $EXTERNAL_IF -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10:80
# iptables -t nat -A PREROUTING -i $EXTERNAL_IF -p tcp --dport 443 -j DNAT --to-destination 192.168.1.10:443

# === 日志记录 ===
iptables -A INPUT -m limit --limit 5/m --limit-burst 10 -j LOG --log-prefix "[NAT-INPUT-DENIED]: "
iptables -A FORWARD -m limit --limit 5/m --limit-burst 10 -j LOG --log-prefix "[NAT-FORWARD-DENIED]: "

# === 默认拒绝 ===
iptables -A INPUT -j DROP
iptables -A FORWARD -j DROP

# 保存配置
iptables-save > /etc/iptables/rules.v4

echo "NAT Gateway configuration completed."

企业级 NAT 网关

#!/bin/bash
# 企业级 NAT 网关配置

# 网络配置
MANAGEMENT_NET="192.168.1.0/24"
DEVELOPMENT_NET="192.168.10.0/24"
PRODUCTION_NET="192.168.20.0/24"
DMZ_NET="192.168.100.0/24"

INTERNAL_IF="eth1"
DMZ_IF="eth2"
EXTERNAL_IF="eth0"

EXTERNAL_IP1="203.0.113.1"
EXTERNAL_IP2="203.0.113.2"
EXTERNAL_IP3="203.0.113.3"

# 清空规则
iptables -F
iptables -t nat -F
iptables -t mangle -F

# 设置默认策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# 启用 IP 转发
echo 1 > /proc/sys/net/ipv4/ip_forward

# === 基础规则 ===
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

# === 管理访问 ===
# 管理网段可以访问网关
iptables -A INPUT -i $INTERNAL_IF -s $MANAGEMENT_NET -j ACCEPT

# SSH 访问控制
iptables -A INPUT -i $EXTERNAL_IF -p tcp --dport 22 -s 203.0.113.100 -j ACCEPT

# === 内网访问控制 ===
# 管理网段可以访问所有网段
iptables -A FORWARD -s $MANAGEMENT_NET -j ACCEPT

# 开发网段只能访问开发和外网
iptables -A FORWARD -s $DEVELOPMENT_NET -d $DEVELOPMENT_NET -j ACCEPT
iptables -A FORWARD -s $DEVELOPMENT_NET -o $EXTERNAL_IF -j ACCEPT

# 生产网段只能访问 DMZ 和外网
iptables -A FORWARD -s $PRODUCTION_NET -d $DMZ_NET -j ACCEPT
iptables -A FORWARD -s $PRODUCTION_NET -o $EXTERNAL_IF -j ACCEPT

# DMZ 只能访问外网
iptables -A FORWARD -s $DMZ_NET -o $EXTERNAL_IF -j ACCEPT

# === NAT 配置 ===
# 不同网段使用不同的外网 IP
iptables -t nat -A POSTROUTING -s $MANAGEMENT_NET -o $EXTERNAL_IF -j SNAT --to-source $EXTERNAL_IP1
iptables -t nat -A POSTROUTING -s $DEVELOPMENT_NET -o $EXTERNAL_IF -j SNAT --to-source $EXTERNAL_IP2
iptables -t nat -A POSTROUTING -s $PRODUCTION_NET -o $EXTERNAL_IF -j SNAT --to-source $EXTERNAL_IP3
iptables -t nat -A POSTROUTING -s $DMZ_NET -o $EXTERNAL_IF -j SNAT --to-source $EXTERNAL_IP1

# === 服务发布 ===
# Web 服务器(DMZ)
iptables -t nat -A PREROUTING -i $EXTERNAL_IF -p tcp --dport 80 -j DNAT --to-destination 192.168.100.10:80
iptables -t nat -A PREROUTING -i $EXTERNAL_IF -p tcp --dport 443 -j DNAT --to-destination 192.168.100.10:443

# 邮件服务器(DMZ)
iptables -t nat -A PREROUTING -i $EXTERNAL_IF -p tcp --dport 25 -j DNAT --to-destination 192.168.100.20:25
iptables -t nat -A PREROUTING -i $EXTERNAL_IF -p tcp --dport 587 -j DNAT --to-destination 192.168.100.20:587
iptables -t nat -A PREROUTING -i $EXTERNAL_IF -p tcp --dport 993 -j DNAT --to-destination 192.168.100.20:993

# VPN 服务器
iptables -t nat -A PREROUTING -i $EXTERNAL_IF -p udp --dport 1194 -j DNAT --to-destination 192.168.100.30:1194

# === QoS 标记 ===
# 标记不同类型的流量
iptables -t mangle -A FORWARD -p tcp --dport 80 -j MARK --set-mark 1
iptables -t mangle -A FORWARD -p tcp --dport 443 -j MARK --set-mark 1
iptables -t mangle -A FORWARD -p tcp --dport 22 -j MARK --set-mark 2
iptables -t mangle -A FORWARD -p icmp -j MARK --set-mark 3

# === 安全防护 ===
# 防止 DDoS
iptables -A FORWARD -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT
iptables -A FORWARD -p tcp --syn -j DROP

# 防止端口扫描
iptables -A FORWARD -m recent --name portscan --rcheck --seconds 86400 -j DROP
iptables -A FORWARD -m recent --name portscan --set -j LOG --log-prefix "[PORT-SCAN]: "
iptables -A FORWARD -m recent --name portscan --set -j DROP

# === 日志记录 ===
iptables -A FORWARD -m limit --limit 10/m --limit-burst 20 -j LOG --log-prefix "[NAT-FORWARD]: "
iptables -A INPUT -m limit --limit 5/m --limit-burst 10 -j LOG --log-prefix "[NAT-INPUT]: "

# === 默认拒绝 ===
iptables -A INPUT -j DROP
iptables -A FORWARD -j DROP

echo "Enterprise NAT Gateway configuration completed."

7.6 NAT 故障排除

常见问题诊断

1. 连接跟踪问题

# 查看连接跟踪表
cat /proc/net/nf_conntrack | grep -E "(192.168.1.10|203.0.113.1)"

# 查看连接跟踪统计
cat /proc/net/stat/nf_conntrack

# 检查连接跟踪表是否满
echo "Current connections: $(cat /proc/net/nf_conntrack | wc -l)"
echo "Max connections: $(cat /proc/sys/net/netfilter/nf_conntrack_max)"

# 增加连接跟踪表大小
echo 'net.netfilter.nf_conntrack_max = 1048576' >> /etc/sysctl.conf
sysctl -p

2. 路由问题检查

# 检查路由表
ip route show

# 检查默认网关
ip route show default

# 检查特定目标的路由
ip route get 8.8.8.8
ip route get 192.168.1.10

# 检查 IP 转发是否启用
cat /proc/sys/net/ipv4/ip_forward

# 启用 IP 转发
echo 1 > /proc/sys/net/ipv4/ip_forward

3. NAT 规则检查

# 查看 NAT 表规则
iptables -t nat -L -n -v

# 查看规则匹配统计
iptables -t nat -L -n -v --line-numbers

# 重置计数器
iptables -t nat -Z

# 检查特定规则
iptables -t nat -L PREROUTING -n -v
iptables -t nat -L POSTROUTING -n -v

调试工具和技巧

1. 数据包跟踪

# 使用 tcpdump 跟踪数据包
# 在外网接口抓包
tcpdump -i eth0 -n host 203.0.113.1

# 在内网接口抓包
tcpdump -i eth1 -n host 192.168.1.10

# 跟踪特定端口
tcpdump -i any -n port 80

# 跟踪 NAT 转换
tcpdump -i any -n "(src 192.168.1.10 or dst 192.168.1.10) and port 80"

2. 连接测试

# 测试内网到外网的连接
# 从内网主机测试
ping 8.8.8.8
curl -I http://www.google.com

# 测试外网到内网的连接
# 从外网主机测试
telnet 203.0.113.1 80
nc -zv 203.0.113.1 80

# 测试端口转发
nc -zv 203.0.113.1 2222  # SSH 端口转发测试

3. 日志分析

# 查看防火墙日志
tail -f /var/log/messages | grep "\[NAT"

# 分析被拒绝的连接
grep "NAT-FORWARD-DENIED" /var/log/messages | tail -20

# 统计日志中的 IP 地址
grep "NAT-FORWARD" /var/log/messages | grep -oE 'SRC=[0-9.]+' | cut -d= -f2 | sort | uniq -c | sort -nr

NAT 性能优化

1. 连接跟踪优化

# 优化连接跟踪参数
echo 'net.netfilter.nf_conntrack_max = 1048576' >> /etc/sysctl.conf
echo 'net.netfilter.nf_conntrack_tcp_timeout_established = 3600' >> /etc/sysctl.conf
echo 'net.netfilter.nf_conntrack_tcp_timeout_time_wait = 30' >> /etc/sysctl.conf
echo 'net.netfilter.nf_conntrack_tcp_timeout_close_wait = 30' >> /etc/sysctl.conf
echo 'net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 30' >> /etc/sysctl.conf

# 应用配置
sysctl -p

2. 跳过连接跟踪

# 对于高流量的静态内容,跳过连接跟踪
iptables -t raw -A PREROUTING -p tcp --dport 80 -m string --string "GET /static/" --algo bm -j NOTRACK
iptables -t raw -A OUTPUT -p tcp --sport 80 -m string --string "HTTP/1.1 200 OK" --algo bm -j NOTRACK

# 跳过内网流量的连接跟踪
iptables -t raw -A PREROUTING -s 192.168.1.0/24 -d 192.168.1.0/24 -j NOTRACK
iptables -t raw -A OUTPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -j NOTRACK

3. 规则优化

# 将最常用的规则放在前面
# 使用 multiport 模块合并规则
iptables -t nat -A PREROUTING -p tcp -m multiport --dports 80,443,8080 -j DNAT --to-destination 192.168.1.10

# 使用 iprange 模块
iptables -t nat -A POSTROUTING -m iprange --src-range 192.168.1.1-192.168.1.100 -o eth0 -j SNAT --to-source 203.0.113.1

7.7 高级 NAT 应用

双向 NAT

#!/bin/bash
# 双向 NAT 配置(网络合并场景)

# 场景:两个网络都使用 192.168.1.0/24,需要互相访问
# 网络 A:192.168.1.0/24 (eth1)
# 网络 B:192.168.1.0/24 (eth2)
# 解决方案:将网络 B 映射为 10.0.1.0/24

# 清空规则
iptables -F
iptables -t nat -F

# 网络 A 访问网络 B:将目标地址 10.0.1.x 转换为 192.168.1.x
iptables -t nat -A PREROUTING -i eth1 -d 10.0.1.0/24 -j DNAT --to-destination 192.168.1.0/24

# 网络 B 访问网络 A:将目标地址 192.168.1.x 保持不变,但源地址需要转换
iptables -t nat -A POSTROUTING -o eth2 -s 192.168.1.0/24 -j SNAT --to-source 10.0.1.1

# 网络 B 的回包:将源地址 192.168.1.x 转换为 10.0.1.x
iptables -t nat -A POSTROUTING -o eth1 -s 192.168.1.0/24 -j SNAT --to-source 10.0.1.0/24

# 网络 A 的回包:将目标地址 10.0.1.1 转换为原始源地址
iptables -t nat -A PREROUTING -i eth2 -d 10.0.1.1 -j DNAT --to-destination 192.168.1.0/24

条件 NAT

#!/bin/bash
# 条件 NAT 配置

# 基于时间的 NAT
# 工作时间使用高速线路
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -m time --timestart 08:00 --timestop 18:00 --weekdays Mon,Tue,Wed,Thu,Fri -j SNAT --to-source 203.0.113.1

# 非工作时间使用备用线路
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth1 -j SNAT --to-source 203.0.114.1

# 基于负载的 NAT
# 根据连接数选择出口
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -m connlimit --connlimit-above 100 --connlimit-mask 0 -j SNAT --to-source 203.0.114.1
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 203.0.113.1

# 基于应用的 NAT
# HTTP 流量使用一个出口
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -p tcp --dport 80 -o eth0 -j SNAT --to-source 203.0.113.1

# HTTPS 流量使用另一个出口
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -p tcp --dport 443 -o eth0 -j SNAT --to-source 203.0.113.2

NAT 负载均衡

#!/bin/bash
# NAT 负载均衡配置

# Web 服务器负载均衡
# 方法1:轮询
iptables -t nat -A PREROUTING -p tcp --dport 80 -m statistic --mode nth --every 3 --packet 0 -j DNAT --to-destination 192.168.1.10:80
iptables -t nat -A PREROUTING -p tcp --dport 80 -m statistic --mode nth --every 3 --packet 1 -j DNAT --to-destination 192.168.1.11:80
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.12:80

# 方法2:随机
iptables -t nat -A PREROUTING -p tcp --dport 443 -m statistic --mode random --probability 0.33 -j DNAT --to-destination 192.168.1.10:443
iptables -t nat -A PREROUTING -p tcp --dport 443 -m statistic --mode random --probability 0.50 -j DNAT --to-destination 192.168.1.11:443
iptables -t nat -A PREROUTING -p tcp --dport 443 -j DNAT --to-destination 192.168.1.12:443

# 方法3:基于源 IP 的一致性哈希
iptables -t nat -A PREROUTING -p tcp --dport 8080 -m statistic --mode nth --every 3 --packet 0 -j DNAT --to-destination 192.168.1.10:8080
iptables -t nat -A PREROUTING -p tcp --dport 8080 -m statistic --mode nth --every 3 --packet 1 -j DNAT --to-destination 192.168.1.11:8080
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.12:8080

# 健康检查和故障转移(需要外部脚本支持)
# 当服务器故障时,动态调整规则

本章小结

本章详细介绍了 iptables 的 NAT 和端口转发功能:

  1. NAT 基础:SNAT、DNAT、MASQUERADE 的概念和应用
  2. SNAT 配置:源地址转换的各种场景和配置方法
  3. DNAT 配置:目标地址转换和端口映射
  4. 端口转发:REDIRECT 和复杂转发场景
  5. 完整配置:企业级 NAT 网关的完整配置
  6. 故障排除:NAT 问题的诊断和解决方法
  7. 高级应用:双向 NAT、条件 NAT、负载均衡等

本章练习

  1. 基础练习

    • 配置基本的 NAT 网关
    • 实现简单的端口转发
    • 设置 MASQUERADE 规则
  2. 进阶练习

    • 配置多网段的 NAT
    • 实现负载均衡的端口转发
    • 设置条件 NAT 规则
  3. 实战练习

    • 搭建企业级 NAT 网关
    • 实现 DMZ 网络架构
    • 配置双线路负载均衡
  4. 故障排除练习

    • 诊断 NAT 连接问题
    • 优化 NAT 性能
    • 分析和解决端口转发问题

下一章我们将学习日志记录和监控的配置方法。