linux中配置公网ip和私网ip的双ip并非nat映射,而是通过策略路由实现流量分离:公网ip对外服务,私网ip访问内网资源,需为不同源地址绑定独立路由表,确保请求与响应路径一致,避免不对称路由导致连接超时。

Linux 中配置公网 IP 和私网 IP 的“双 IP 映射”,严格来说不是传统意义上的“映射”(如 NAT 地址转换),而是指同一台主机同时拥有公网可路由 IP 和私网(内网)IP,并能根据流量来源/目标,合理选择出接口和路由路径。常见于云服务器、跳板机、网关或混合网络环境。核心目标是:
✅ 公网 IP 用于对外提供服务(如 Web、SSH 管理)
✅ 私网 IP 用于访问内部资源(如数据库、内网服务)
✅ 流量不回流、不误发、响应路径与请求路径一致(即策略路由)
下面分三类典型场景说明配置要点:
一、双网卡:公网 + 私网各走一张物理网卡
这是最清晰、推荐的部署方式(如 eth0 接公网,eth1 接内网交换机)。-
网卡配置示例(RHEL/CentOS)
/etc/sysconfig/network-scripts/ifcfg-eth0(公网):DEVICE=eth0 BOOTPROTO=static IPADDR=203.0.113.42 # 公网IP(假设) NETMASK=255.255.255.0 ONBOOT=yes # 不配 GATEWAY!避免覆盖默认路由
/etc/sysconfig/network-scripts/ifcfg-eth1(私网):DEVICE=eth1 BOOTPROTO=static IPADDR=192.168.10.50 # 内网IP NETMASK=255.255.255.0 ONBOOT=yes
-
关键操作:禁用冗余默认网关 + 设置策略路由
- 删除
ifcfg-eth0中的GATEWAY=行(或设为注释),防止network服务自动添加冲突的默认路由 - 使用策略路由确保:
• 源地址为203.0.113.42的响应包,必须从 eth0 出去
• 源地址为192.168.10.50的响应包,必须从 eth1 出去
步骤(持久化写入
/etc/rc.local或 systemd service):# 创建自定义路由表 echo "200 public" >> /etc/iproute2/rt_tables echo "201 private" >> /etc/iproute2/rt_tables # 配置公网路由表(假设公网网关为 203.0.113.1) ip route add default via 203.0.113.1 dev eth0 table public ip route add 203.0.113.0/24 dev eth0 src 203.0.113.42 table public # 配置私网路由表(假设内网网关为 192.168.10.1) ip route add default via 192.168.10.1 dev eth1 table private ip route add 192.168.10.0/24 dev eth1 src 192.168.10.50 table private # 绑定源地址到对应路由表 ip rule add from 203.0.113.42 table public ip rule add from 192.168.10.50 table private
- 删除
二、单网卡双 IP:公网 + 私网共用一个物理接口(如云主机多 EIP)
常见于阿里云、腾讯云等——一块网卡绑定多个弹性公网 IP(EIP),同时配置内网 IP。前提:网卡已配置主 IP(如内网 172.16.0.10)+ 辅助 IP(如公网 119.123.45.67)
可通过ip addr add 119.123.45.67/32 dev eth0临时添加;持久化需在 ifcfg-eth0 中加别名(如ifcfg-eth0:0)或使用 cloud-init/netplan。-
必须配置策略路由(否则系统默认只认主 IP 的路由)
否则会出现:
❌ 公网 IP 收到请求,但响应从内网 IP 发出 → 连接超时(不对称路由)解决方案同上,但路由表规则按具体 IP 地址匹配:
ip rule add from 119.123.45.67 table public ip rule add from 172.16.0.10 table private
⚠️ 注意:公网 IP 通常是
/32主机路由,无子网,所以ip route add ... table public中直连网段可省略,仅保留default via GW dev eth0即可(GW 由云平台提供)。
三、需要 NAT 映射?那其实是网关/转发场景
如果你真正想要的是「内网机器通过本机访问公网」或「公网用户访问本机后转到内网服务」,那就不是双 IP 配置,而是开启 **NAT 转发 + iptables 规则**:-
开启内核转发:
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf sysctl -p
-
假设 eth0(公网)、eth1(私网),让私网设备上网:
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.10.0/24 -j MASQUERADE iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
-
若需端口映射(如公网 80 → 内网 192.168.10.100:8080):
iptables -t nat -A PREROUTING -d 203.0.113.42 -p tcp --dport 80 -j DNAT --to-destination 192.168.10.100:8080
不复杂但容易忽略的是:策略路由必须配源地址规则,且路由表中要包含对应网段的直连路由(dev ethX src X.X.X.X),否则 ip route get 查询会失败,导致连接中断。











