在日常的网络拓扑规划、嵌入式开发或者实验室测试中我们经常会遇到这样的场景主机 B (Ubuntu B)是一台双网口计算机一个网口连接互联网WAN另一个网口直连主机 A (Ubuntu A)。为了网络安全或业务合规我们需要满足以下需求Ubuntu B自身能够正常上外网。Ubuntu A能够与Ubuntu B自由通信如 SSH、数据传输、共享服务等。Ubuntu A绝对不能通过 Ubuntu B 访问外网。本文将手把手带你完成这个网络隔离与互通的配置过程。1. 网络拓扑与 IP 规划首先我们梳理两个系统的网卡和 IP 配置。外网网口连接 Internet仅在 Ubuntu B 上网口名称为enx6c1ff72115c1。内网网口直连局域网Ubuntu B 的内网口假设名称为enp3s0配置静态 IP192.168.100.1。Ubuntu A 的网口假设名称为eth0直连 Ubuntu B 的内网口配置静态 IP192.168.100.2。[ Internet ] │ ▼ (enx6c1ff72115c1) ┌───────────┐ │ Ubuntu B │ (192.168.100.1 / enp3s0) └───────────┘ │ ▼ (直连网线 / 私有交换机) ┌───────────┐ │ Ubuntu A │ (192.168.100.2 / eth0) └───────────┘2. 步骤一基础 IP 配置路由物理隔离要限制 Ubuntu A 上网最基础的第一道关卡是在 Ubuntu A 上不配置默认网关Default Gateway和 DNS 服务器。在 Ubuntu A 上的配置编辑 Netplan 配置文件通常位于/etc/netplan/01-netcfg.yaml或类似文件network:version:2renderer:networkdethernets:eth0:# 直连网卡名称dhcp4:noaddresses:-192.168.100.2/24# 重点不要写 gateway4 (默认网关) 和 nameservers (DNS)应用配置sudonetplan apply在 Ubuntu B 上的配置内网口同样在 Ubuntu B 的 Netplan 中配置其内网口 IPnetwork:version:2renderer:networkdethernets:enp3s0:# 连接 A 的网卡dhcp4:noaddresses:-192.168.100.1/24应用配置sudonetplan apply此时的效果Ubuntu A 与 B 之间可以互相ping通。但即使 A 尝试向外网发送数据包因为本地路由表中没有“默认网关”数据包在 A 本地就会被丢弃。3. 步骤二关闭 Ubuntu B 的系统级内核转发为了防止 Ubuntu A 侧人为手动添加了网关路由例如ip route add default via 192.168.100.1我们必须在 Ubuntu B 上从系统内核层面关闭 IP 转发功能。默认情况下Ubuntu 是关闭 IP 转发的。可以通过以下步骤进行确认和加固临时关闭sudosysctlnet.ipv4.ip_forward0永久关闭编辑/etc/sysctl.conf文件确保包含以下这一行net.ipv4.ip_forward 0保存并重新加载配置sudosysctl-p4. 步骤三配置防火墙拦截双重保险在实际复杂的企业或实验室网络环境中Ubuntu B 可能会因为运行 Docker、VPN 或其他网络代理服务而不得不开启ip_forward转发功能。如果 Ubuntu B 必须开启转发我们应该如何针对性地仅禁止其它网口转发到外网网口enx6c1ff72115c1呢答案是使用iptables进行精确拦截。在 Ubuntu B 上运行以下命令sudoiptables-IFORWARD-oenx6c1ff72115c1-jDROP规则详解-I FORWARD在FORWARD转发链的最顶部插入一条拦截规则。-o enx6c1ff72115c1匹配所有输出Outgoing网口为外网网口enx6c1ff72115c1的中转数据包。-j DROP直接丢弃匹配到的数据包。为什么不影响 B 自己上网FORWARD链只处理经由 B 转发/中转的数据如来自 A 的包。B 自身产生的上网数据会走OUTPUT链因此 B 自身上网完全不受此规则限制。保存防火墙规则防止重启失效在 Ubuntu 上我们推荐使用iptables-persistent工具来保存和自动加载规则# 1. 安装工具安装过程中会弹窗询问是否保存当前规则选择“是”sudoapt-getinstalliptables-persistent# 2. 如果以后修改了规则运行以下命令手动保存规则sudoiptables-save|sudotee/etc/iptables/rules.v45. 验证测试配置完成后我们通过以下三个测试来验证方案是否成功测试 1验证 Ubuntu B 自身上网是否正常在 Ubuntu B 上运行ping-c4baidu.com预期结果可以正常ping通B 自身上网一切正常。测试 2验证 A 与 B 之间局域网互通是否正常在 Ubuntu A 上pingB 的内网 IPping-c4192.168.100.1在 Ubuntu B 上pingA 的内网 IPping-c4192.168.100.2预期结果双向均可秒通局域网内的 SSH、服务访问一切正常。测试 3验证 Ubuntu A 无法上网在 Ubuntu A 上尝试访问外网ping-c4baidu.com# 或者直接 ping 外网公网 IPping-c48.8.8.8预期结果提示Network is unreachable未配默认网关时或无限超时手动配了网关但被 B 拦截时。A 无法访问任何 Internet 资源。6. 总结通过“Netplan 基础路由隔离 系统内核转发关闭 iptables规则双重保险”的组合方案我们成功构建了安全的单向网络隔离安全性高即使 Ubuntu A 被植入后门或手动修改路由在 Ubuntu B 的防火墙关卡也会被直接丢弃。副作用小完全不会影响 Ubuntu B 自身的网络体验且保持了 A 与 B 之间的高速局域网互通。