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 规则多了之后不好维护
适用场景
这个方案特别适合:
多地办公网络冲突 —— 比如家里和公司恰好用了同一个网段
收购/合并场景 —— 两家公司网络已经定型,改起来麻烦
临时组网需求 —— 不想动原有网络配置,只想快速互通
学习和实验 —— 理解 NAT 和网络地址转换的好例子
总结
其实这个方案的核心就一句话:EasyTier 负责"连通",NETMAP 负责"欺骗地址空间"。
用 NAT 构建一个"逻辑网段",绕过真实物理网络的冲突。对于那些"动不得"的存量网络,这算是成本最低的解决方案了。
提示: 如果你需要开机自动应用规则,可以把脚本加入 /etc/rc.local 或者用 systemd 管理。
作者:张梦南
发布时间:2026年5月30日
版权声明:本文采用 MIT 许可协议