如图,园区网内(校园网或企业网)有台 Ubuntu 主机,家里有台 Windows 主机. 由于居家办公需求,使用 ZeroTier One 建立了虚拟局域网并自建 Moon 加速网络,Ubuntu 和 Windows 可以互联. 但是经过一段时间使用发现,还是有许多不便. 例如,需要获取园区网内资源时必须首先从 Windows 登录 Ubuntu,在 Ubuntu 上下载所需资源后再通过虚拟局域网传输到 Windows 本地.
这就产生了新的需求,能否通过转发代理让 Windows 直接连入 Ubuntu 所在的真实物理网络. 这样不仅可以让 Windows 直接访问园区网内资源,还可以让 Windows 以 Ubuntu 的公网 IP 访问互联网. 这样就能极大提高工作效率,避免频繁的数据传输工作.
通过调研发现:在上述条件下,仅使用 Ubuntu 上的 linux 内核的数据转发和 iptables 控制路由就能实现所需功能.
Linux 系统内核可以通过 sysctl
和 iptables
两个命令控制网络数据转.
查看内核 IP 转发设置,0
表示处于关闭状态:
$ sudo sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 0
编辑配置文件开启 Linxu 内核的 IP 数据转发:
sudo vim /etc/sysctl.conf
将第 28 行的注释去掉,设置 net.ipv4.ip_forward=1
net.ipv4.ip_forward=1 # lin 28
激活配置文件设置:
$ sudo sysctl -p
net.ipv4.ip_forward = 1
查看内核 IP 转发设置,1
表示开启状态:
$ sudo sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
查看网口信息
$ ifconfig
或
$ ip link show
可以发现,在 Ubuntu 上 enp123s0f0
用来接入真实物理网络,zt7u3fcxwr
用来接入 zerotier 虚拟网络. 注意后续命令中使用网口名称的地方~
使用 iptables
启用 enp123s0f0
的网络地址转换和 IP 伪装:
sudo iptables -t nat -A POSTROUTING -o enp123s0f0 -j MASQUERADE
允许流量转发和跟踪活动连接:
sudo iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
接下来设置从zt7u3fcxwr
到 enp123s0f0
流量转发。 反向规则不是必需的,因为在本文所述场景下没有用到:
sudo iptables -A FORWARD -i zt7u3fcxwr -o enp123s0f0 -j ACCEPT
以上配置就完成了.
但是 iptables
规则在重新启动后就无效了. 将上面设置保存为配置文件中.
安装 iptables 配置存储工具:
$ sudo apt-get install iptables-persistent
保存 iptables 配置到文件:
$ sudo netfilter-persistent save
run-parts: executing /usr/share/netfilter-persistent/plugins.d/15-ip4tables save
run-parts: executing /usr/share/netfilter-persistent/plugins.d/25-ip6tables save
查看 iptables 配置文件内容:
$ sudo iptables-save
# Generated by iptables-save v1.6.0 on Mon Aug 10 16:34:56 2020
*filter
:INPUT ACCEPT [847:52680]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [826:49425]
-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i zt7u3fcxwr -o enp123s0f0 -j ACCEPT
COMMIT
# Completed on Mon Aug 10 16:34:56 2020
# Generated by iptables-save v1.6.0 on Mon Aug 10 16:34:56 2020
*nat
:PREROUTING ACCEPT [16:1248]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [984:59012]
:POSTROUTING ACCEPT [983:58980]
-A POSTROUTING -o enp123s0f0 -j MASQUERADE
COMMIT
# Completed on Mon Aug 10 16:34:56 2020
配置文件保存路径在 /etc/iptables/
目录下.
增加 1 条路由,Destination 填入 0.0.0.0/0
表示全网,(via) 填入 zt7u3fcxwr
的 IP 地址,点击 Submit
提交.
Windows 可以使用客户端,需要勾选 Allow Global IP
.
在 LInux 上启用 ZeroTIer转发代理需要设置内核,使内核允许发送数据的地址和接受数据的地址不同. 默认情况下,当发送地址与接受地址不一致的时候,内核会丢弃接收的数据.
编辑 /etc/sysctl.conf
文件
sudo vim /etc/sysctl.conf
去掉第 20 行注释,并设置如下
net.ipv4.conf.all.rp_filter=2 # line 20
激活配置文件设置
$ sudo sysctl -p
net.ipv4.conf.all.rp_filter = 2
允许 ZeroTier One 转发全局流量
sudo zerotier-cli set NetworkID allowGlobal=1
开启转发代理:
sudo zerotier-cli set NetworkID allowDefault=1
关闭转发代理:
sudo zerotier-cli set NetworkID allowDefault=0
如果开启转代理后没有正常工作,可以尝试重启 ZeroTier One 服务或重启计算机.
在 Windows 上 ping Ubuntu 上的真实物理网络的 IP 地址,也就是 enp123s0f0
的 IP 地址. 如果 ping 通说明配置成功了.
也可以在 Ubuntu 和 Windows 上查询公网 IP. 如果 Windows 使用了 Ubuntu 的公网 IP,也说明成功了.
curl http://myip.ipip.net/