基于 zerotier 使用 Linux Kernel 设置转发代理

1. 场景

在这里插入图片描述
如图,园区网内(校园网或企业网)有台 Ubuntu 主机,家里有台 Windows 主机. 由于居家办公需求,使用 ZeroTier One 建立了虚拟局域网并自建 Moon 加速网络,Ubuntu 和 Windows 可以互联. 但是经过一段时间使用发现,还是有许多不便. 例如,需要获取园区网内资源时必须首先从 Windows 登录 Ubuntu,在 Ubuntu 上下载所需资源后再通过虚拟局域网传输到 Windows 本地.

这就产生了新的需求,能否通过转发代理让 Windows 直接连入 Ubuntu 所在的真实物理网络. 这样不仅可以让 Windows 直接访问园区网内资源,还可以让 Windows 以 Ubuntu 的公网 IP 访问互联网. 这样就能极大提高工作效率,避免频繁的数据传输工作.

通过调研发现:在上述条件下,仅使用 Ubuntu 上的 linux 内核的数据转发和 iptables 控制路由就能实现所需功能.
2. 配置
2.1 配置 Linux 的数据转发和路由控制

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/ 目录下.
2.2 配置 ZeroTier 网络路由管理

增加 1 条路由,Destination 填入 0.0.0.0/0 表示全网,(via) 填入 zt7u3fcxwr 的 IP 地址,点击 Submit 提交.
在这里插入图片描述
在这里插入图片描述
2.3 配置 Windows 客户端使用转发代理

Windows 可以使用客户端,需要勾选 Allow Global IP.

  • 开启转发代理:勾选 Allow Default Route
  • 关闭转发代理:取消 Allow Default Route
    在这里插入图片描述

2.4 配置 Linux 客户端使用转发代理

在 LInux 上启用 ZeroTIer转发代理需要设置内核,使内核允许发送数据的地址和接受数据的地址不同. 默认情况下,当发送地址与接受地址不一致的时候,内核会丢弃接收的数据.

编辑 /etc/sysctl.conf 文件

sudo vim /etc/sysctl.conf

 

去掉第 20 行注释,并设置如下

net.ipv4.conf.all.rp_filter=2    # line 20

 

激活配置wen件设置

$ 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 服务或重启计算机

3. 测试

在 Windows 上 ping Ubuntu 上的真实物理网络的 IP 地址,也就是 enp123s0f0 的 IP 地址. 如果 ping 通说明配置成功了

也可以在 Ubuntu 和 Windows 上查询公网 IP. 如果 Windows 使用了 Ubuntu 的公网 IP,也说明成功了.

curl http://myip.ipip.net/

允许随意转载;但,请点赞!点赞-NMBHOST:NMB HOST » 基于 zerotier 使用 Linux Kernel 设置转发代理

赞 (2) 无功不受禄

NMBHOST 需要你的支持

6+8=