首先明确核心场景:有一台网关服务器(双网卡 / 单网卡配置网段转发),其中一块网卡连接公网(能上互联网),另一块网卡连接内网局域网(仅内网互通,无法直接上公网);内网中的客户端将网关指向这台网关服务器,通过网关服务器的iptables做SNAT(源地址转换) 实现内网机器共享公网 IP 上网,同时通过iptables规则做内网隔离(限制内网网段互访、仅放行上网相关流量)。
1. 核心必备条件(网关服务器)
-
网关服务器配置双网卡(内网用
172.16.0.1,外网用192.168.0.1) -
网关服务器开启IP 转发功能(Linux内核默认关闭,必须开启才能实现数据包转发)。
- 临时生效:
echo 1 > /proc/sys/net/ipv4/ip_forward - 永久生效:修改
/etc/sysctl.conf中的net.ipv4.ip_forward = 1,执行sysctl -p加载。
- 临时生效:
-
网关服务器有公网出口,且内网网段与公网网段无冲突(如内网用
172.16.0.0/24)。
2. 两大核心技术点
(1)SNAT(源地址转换)—— 实现内网上网
内网机器访问公网时,数据包的源IP是内网私有IP(如172.16.0.1),这种私有IP无法在公网中路由。
-
网关服务器通过
iptables的nat表、POSTROUTING链做SNAT转换:将出站数据包的源 IP(内网私有 IP)替换为网关服务器的公网网卡 IP。 -
公网服务器返回数据包时,目标IP是网关服务器的公网IP,网关服务器再将数据包的目标IP转换回内网私有IP,转发给对应的内网机器,完成整个通信流程。
-
核心规则示例(将
172.16.0.0/24内网网段的流量,通过网关公网网卡eth33的IP做SNAT转发):iptables -t nat -A POSTROUTING -s 172.16.0.0/24 -o ens33 -j SNAT --to-source 192.168.0.1 或者 iptables -t nat -A POSTROUTING -s 172.16.0.0/24 -o eth33 -j MASQUERADE
(2)iptables 规则 —— 实现内网隔离
内网隔离的核心是默认拒绝,按需放行,通过filter表的FORWARD链(负责转发跨网卡数据包)设置规则,限制内网不同网段之间的互访,仅放行内网到公网的上网流量。
-
核心思路:
- 放行内网网段访问公网的相关流量(TCP/UDP的上网请求、以及对应的返回流量)。
- 拒绝内网不同网段之间的互访。
- 拒绝非法流量(如伪造源IP的流量、无效连接的流量)。
3. 设置内网网关
把内网服务器网络配置的Gateway设置成172.16.0.1
4. 整体流程梳理
- 内网客户端配置网关为网关服务器的内网网卡IP(如
172.16.0.1)。 - 内网客户端发起上网请求,数据包发送到网关服务器。
- 网关服务器通过
iptables的FORWARD链验证流量是否合法(是否允许上网)。 - 合法流量进入
nat表的POSTROUTING链,做SNAT转换(替换源IP为网关公网IP)。 - 网关服务器将转换后的数据包发送到公网,获取返回结果。
- 网关服务器将返回结果的目标IP转换回内网客户端 IP,转发给对应客户端。
- 非法流量(如内网互访、伪造IP)被
iptables规则直接丢弃。
4. 原理介绍
(1)IP转发原理
开启IP转发(net.ipv4.ip_forward=1),是让Linux内核从“主机模式”切换为“网关模式”,能够接收非本机目标IP的数据包,并根据路由表转发到对应网卡(公网/内网),这是所有转发功能的基础。
(2)SNAT(源地址转换)原理
内网私有IP无法在公网路由,SNAT的核心是“替换源IP”:内网机器访问公网时,网关服务器通过iptables将数据包的内网源IP,替换为自身公网网卡IP;公网返回数据时,再将目标IP(公网IP)替换回对应内网IP,完成双向通信,实现内网共享公网上网。
(3)iptables内网隔离原理
核心是“默认拒绝、按需放行”,通过filter表的FORWARD链(负责跨网卡数据包转发)控制流量:仅放行内网到公网的上网请求及返回流量,拒绝内网不同网段之间的互访和非法流量,实现内网隔离。
(4)整体数据包流转原理
内网客户端→网关(验证流量合法性)→SNAT替换源IP→公网(获取返回数据)→网关还原目标IP→内网客户端,非法流量直接被iptables丢弃。