张梦南
张梦南
发布于 2026-05-30 / 9 阅读
0
0

用 EasyTier + NETMAP 解决双局域网"撞衫"问题


title: 用 EasyTier + NETMAP 解决双局域网"撞衫"问题

date: 2026-05-30

tags:

  • EasyTier

  • 网络工程

  • iptables

  • NAT

categories:

  • 技术分享


前言

上周遇到一个挺头疼的问题:家里网络是 192.168.18.0/24,而爸妈店里的网络也是 192.168.18.0/24。本来想着用 EasyTier 组个 VPN 打通两边,结果一上手就发现——IP 冲突了,根本没法访问,两边都有相应的静态ip服务修改网段说不定哪里就要出问题,这可不能碰。

上网查了一圈,发现用 iptables 的 NETMAP 可以给地址"换个马甲",完美解决这个"撞衫"问题。今天就分享一下具体怎么搞。

问题的本质

先说说为什么会有这个问题。EasyTier 本质上是个 P2P 隧道工具,它负责把不同节点连起来。但是它并不懂"子网代理"这回事——它只是把你定义的网段广播出去。

当你两个局域网都是 192.168.18.0/24 时:

我的局域网:192.168.18.0/24
远端局域网:192.168.18.0/24
↓
冲突!网络变得混乱。

这时候就得想办法让"看起来不同"的网段去访问"实际相同"的网段。

解决思路

我的方案是:给远端网络虚拟一个"马甲地址"

简单说就是:

访问 192.168.180.x  →  实际访问 192.168.18.x

中间靠 Linux 网关做地址转换,让两边都能"假装"自己在访问不同的网段。

整体架构

整个方案是三层结构:

Windows / 其他客户端
         │
         │  虚拟网段 192.168.180.0/24
         ▼
    ┌─────────────┐
    │  OrangePi   │
    │   Linux     │
    │  (NETMAP)   │
    └─────────────┘
         │  EasyTier 隧道
         ▼
    ┌─────────────────┐
    │    远程网络      │
    │ 192.168.18.0/24 │
    └─────────────────┘

核心分工:

  • EasyTier 负责打通隧道,让两边的节点能互相通信

  • NETMAP 负责地址翻译,把虚拟网段映射到真实网段

  • Linux 内核 负责数据转发,让包能正确送达

开始配置

我的环境是 OrangePi Zero2W 跑 Ubuntu,EasyTier 已经正常运行,tun0 接口 IP 是 10.0.0.11。

1. 开启 IP 转发

首先得让 Linux 能转发数据包:

sudo sysctl -w net.ipv4.ip_forward=1

想永久生效的话:

echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p

2. 配置 NETMAP 规则

这是最关键的部分。我把规则分成四个部分:

第一,PREROUTING——处理远端发来的包

iptables -t nat -A PREROUTING \
  -d 192.168.180.0/24 -i tun0 \
  -j NETMAP --to 192.168.18.0/24

意思是:从 tun0 进来、目标地址是 192.168.180.x 的包,把地址转换成 192.168.18.x。

第二,OUTPUT——处理本机发出的包

iptables -t nat -A OUTPUT \
  -d 192.168.180.0/24 \
  -j NETMAP --to 192.168.18.0/24

这个处理本机直接访问虚拟网段的情况。

第三,POSTROUTING——回程地址伪装

iptables -t nat -A POSTROUTING \
  -o wlan0 -d 192.168.18.0/24 \
  -j MASQUERADE

远端设备回包的时候,需要把源地址伪装成 192.168.18.x,不然回不来。

第四,FORWARD——允许转发

iptables -A FORWARD -i tun0 -o wlan0 -j ACCEPT
iptables -A FORWARD -i wlan0 -o tun0 \
  -m state --state RELATED,ESTABLISHED -j ACCEPT

3. 一键脚本

每次重启都得重新配规则,写成脚本方便管理:

#!/bin/bash

sysctl -w net.ipv4.ip_forward=1

# PREROUTING
iptables -t nat -C PREROUTING -d 192.168.180.0/24 -i tun0 -j NETMAP --to 192.168.18.0/24 2>/dev/null \
|| iptables -t nat -A PREROUTING -d 192.168.180.0/24 -i tun0 -j NETMAP --to 192.168.18.0/24

# OUTPUT
iptables -t nat -C OUTPUT -d 192.168.180.0/24 -j NETMAP --to 192.168.18.0/24 2>/dev/null \
|| iptables -t nat -A OUTPUT -d 192.168.180.0/24 -j NETMAP --to 192.168.18.0/24

# POSTROUTING
iptables -t nat -C POSTROUTING -o wlan0 -d 192.168.18.0/24 -j MASQUERADE 2>/dev/null \
|| iptables -t nat -A POSTROUTING -o wlan0 -d 192.168.18.0/24 -j MASQUERADE

# FORWARD
iptables -C FORWARD -i tun0 -o wlan0 -j ACCEPT 2>/dev/null \
|| iptables -A FORWARD -i tun0 -o wlan0 -j ACCEPT

iptables -C FORWARD -i wlan0 -o tun0 -m state --state RELATED,ESTABLISHED -j ACCEPT 2>/dev/null \
|| iptables -A FORWARD -i wlan0 -o tun0 -m state --state RELATED,ESTABLISHED -j ACCEPT

脚本用了 -C 检查规则是否存在,避免重复添加。保存后记得赋予执行权限:

chmod +x /usr/local/bin/easytier-netmap.sh

测试验证

配置完成后,来验证一下是否生效。

本机测试:

ping 192.168.180.1

如果能收到回复,说明 NETMAP 正常工作。

远端测试:

用 Windows 或者其他 EasyTier 节点 ping 192.168.180.x,应该都能正常访问远端的 192.168.18.x 设备了。

工作原理图解

用一张图来解释整个数据流向:

假设 Windows (10.0.0.2) 想访问 192.168.18.100:

  1. Windows 发送: 目标=192.168.180.100
                    │
                    ▼
  2. EasyTier 隧道转发到 OrangePi
                    │
                    ▼
  3. PREROUTING: 192.168.180.100 → 192.168.18.100
                    │
                    ▼
  4. 路由查找, 通过 wlan0 发送到真实设备
                    │
                    ▼
  5. 设备回复: 源=192.168.18.100
                    │
                    ▼
  6. POSTROUTING: MASQUERADE 伪装源地址
                    │
                    ▼
  7. 通过 tun0 返回, 对方收到: 源=192.168.18.x (伪装后的)

关键是:远端设备根本不知道我们在"作弊",它以为自己就是在和 192.168.180.x 的设备通信。

优缺点分析

优点:

  • 不用修改任何客户端配置

  • 可以解决任意网段冲突

  • 兼容性好,EasyTier 原生支持

  • 可以同时配置多组映射

缺点:

  • 本质是 NAT,不是纯路由,某些场景可能有问题

  • iptables 规则多了之后不好维护

适用场景

这个方案特别适合:

  1. 多地办公网络冲突 —— 比如家里和公司恰好用了同一个网段

  2. 收购/合并场景 —— 两家公司网络已经定型,改起来麻烦

  3. 临时组网需求 —— 不想动原有网络配置,只想快速互通

  4. 学习和实验 —— 理解 NAT 和网络地址转换的好例子

总结

其实这个方案的核心就一句话:EasyTier 负责"连通",NETMAP 负责"欺骗地址空间"

用 NAT 构建一个"逻辑网段",绕过真实物理网络的冲突。对于那些"动不得"的存量网络,这算是成本最低的解决方案了。


提示: 如果你需要开机自动应用规则,可以把脚本加入 /etc/rc.local 或者用 systemd 管理。

作者:张梦南

发布时间:2026年5月30日

版权声明:本文采用 MIT 许可协议


评论