iptables实现内网隔离上网及原理

107 阅读4分钟

首先明确核心场景:有一台网关服务器(双网卡 / 单网卡配置网段转发),其中一块网卡连接公网(能上互联网),另一块网卡连接内网局域网(仅内网互通,无法直接上公网);内网中的客户端将网关指向这台网关服务器,通过网关服务器的iptablesSNAT(源地址转换) 实现内网机器共享公网 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无法在公网中路由。

  • 网关服务器通过iptablesnat表、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链(负责转发跨网卡数据包)设置规则,限制内网不同网段之间的互访,仅放行内网到公网的上网流量。

  • 核心思路:

    1. 放行内网网段访问公网的相关流量(TCP/UDP的上网请求、以及对应的返回流量)。
    2. 拒绝内网不同网段之间的互访。
    3. 拒绝非法流量(如伪造源IP的流量、无效连接的流量)。

3. 设置内网网关

把内网服务器网络配置的Gateway设置成172.16.0.1

4. 整体流程梳理

  1. 内网客户端配置网关为网关服务器的内网网卡IP(如172.16.0.1)。
  2. 内网客户端发起上网请求,数据包发送到网关服务器。
  3. 网关服务器通过iptablesFORWARD链验证流量是否合法(是否允许上网)。
  4. 合法流量进入nat表的POSTROUTING链,做SNAT转换(替换源IP为网关公网IP)。
  5. 网关服务器将转换后的数据包发送到公网,获取返回结果。
  6. 网关服务器将返回结果的目标IP转换回内网客户端 IP,转发给对应客户端。
  7. 非法流量(如内网互访、伪造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丢弃。

最后用人话总结就是,主机开启路由转发、设置好iptables,最后把内网的网关设为主机内网ip。后续转发的时候,conntrack表记录端口映射的不同来区分应该转发给谁。