7.1 NAT 基础概念
NAT 的工作原理
NAT(Network Address Translation,网络地址转换)是一种网络技术,用于在不同网络之间转换 IP 地址。它允许私有网络中的多个设备共享一个或少数几个公网 IP 地址访问互联网。
NAT 的类型
SNAT(Source NAT):源地址转换
- 修改数据包的源 IP 地址
- 主要用于内网访问外网
- 在 POSTROUTING 链中处理
DNAT(Destination NAT):目标地址转换
- 修改数据包的目标 IP 地址
- 主要用于外网访问内网服务
- 在 PREROUTING 链中处理
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 和端口转发功能:
- NAT 基础:SNAT、DNAT、MASQUERADE 的概念和应用
- SNAT 配置:源地址转换的各种场景和配置方法
- DNAT 配置:目标地址转换和端口映射
- 端口转发:REDIRECT 和复杂转发场景
- 完整配置:企业级 NAT 网关的完整配置
- 故障排除:NAT 问题的诊断和解决方法
- 高级应用:双向 NAT、条件 NAT、负载均衡等
本章练习
基础练习:
- 配置基本的 NAT 网关
- 实现简单的端口转发
- 设置 MASQUERADE 规则
进阶练习:
- 配置多网段的 NAT
- 实现负载均衡的端口转发
- 设置条件 NAT 规则
实战练习:
- 搭建企业级 NAT 网关
- 实现 DMZ 网络架构
- 配置双线路负载均衡
故障排除练习:
- 诊断 NAT 连接问题
- 优化 NAT 性能
- 分析和解决端口转发问题
下一章我们将学习日志记录和监控的配置方法。