使用阿里云 服务器 搭建统一请求网关 本地微信开发调试时就不用一直放白名单了- 使用 zerotier 配置默认出口ip

avatar
作者
筋斗云
阅读量:2

 

使用阿里云 服务器 搭建统一请求网关 本地微信开发调试时就不用一直放白名单了!

使用 zerotier 配置默认出口ip ,然后加入zerotier 的 内网机器配置成 Allow Default 就可以直接在本地idea 起服务 请求微信接口了

以下是具体的配置网关教程


VPN Exit Node

完整隧道模式或覆盖默认路由

通过 ZeroTier 节点路由所有 Internet 流量。

在本教程中
  • 创建零层网络
  • 设置一个处理所有 Internet 流量的出口节点
  • 将个人节点加入 ZeroTier 网络exit node
  • 告诉您的个人节点使用您的exit node

ZeroTier 创建虚构的 LAN。默认路由覆盖意味着假想 LAN 上的计算机将通过它路由 Internet 流量。就像真正的局域网一样,您想象中的局域网现在需要一个网关。此处的设置与为传统有线 LAN 配置 NAT 网关的设置几乎相同。

首先,创建出口节点

这是将处理所有互联网流量的节点。它可以像 5 美元的 VPS 或 Raspberry Pi 一样小。

  • 如果您还没有,请创建一个网络并回来
  • 在其上安装 ZeroTier
  • 将出口节点加入 ZeroTier 网络:
sudo zerotier-cli join <nwid>

在出口节点上启用 IPv4 转发

在充当 VPN 出口节点的计算机上:

sudo nano /etc/sysctl.conf

添加以下行:

/etc/sysctl.conf
net.ipv4.ip_forward = 1

告诉内核重新加载设置:

sudo sysctl -p 

检查设置是否正确应用:

sudo sysctl net.ipv4.ip_forward

如果您已将出口节点加入(并授权)到您的网络,那么您就可以开始配置它了。首先设置一些环境变量,我们稍后将使用这些变量:

获取 ZeroTier 接口的名称,它将以以下开头:zt

ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00  2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether 96:00:02:8d:28:c7 brd ff:ff:ff:ff:ff:ff altname enp1s0  3: zthnhhqofq: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 2800 qdisc fq_codel state UNKNOWN mode DEFAULT group default qlen 1000 link/ether 86:61:c6:fe:ed:dc brd ff:ff:ff:ff:ff:ff 

在我们的例子中,它是.让我们设置环境变量:zthnhhqofq

export ZT_IF=zthnhhqofq

接下来,获取 Internet 的常规 WAN 接口的名称:

在我们的案例中,它是eth0

export WAN_IF=eth0

启用 NAT 和 IP 伪装:

sudo iptables -t nat -A POSTROUTING -o $WAN_IF -j MASQUERADE

允许流量转发:

sudo iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

允许从 ZeroTier 接口转发到 WAN 接口的流量:

sudo iptables -A FORWARD -i $ZT_IF -o $WAN_IF -j ACCEPT

使规则在重新启动后仍然存在:iptables

sudo apt-get install iptables-persistent

保存新规则:iptables

sudo netfilter-persistent save
重新启动

此时,最好重新启动出口节点并验证路由规则是否仍然存在。

sudo iptables-保存
...  -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A FORWARD -i zthnhhqofq -o eth0 -j ACCEPT  ...  -A POSTROUTING -o eth0 -j MASQUERADE  ... 

您的出口节点已完成,现在我们需要配置您的网络。

配置网络

现在,您的出口节点已设置好,我们需要将您的 ZeroTier 网络配置为通告一个,以便其他节点知道出口节点可以将流量路由到 Internet。Default Route

中央>网络>设置>托管路由

0.0.0.0/0通过<zerotier-ip-of-router-node>

告诉本地节点使用出口节点

在托盘应用程序中,在每个网络下,都有一个“允许默认”选项。选中此选项以使用您的出口节点。

~/.BASHRC

尝试添加如下内容以实现简单的隧道开/关控制:

tunnel() {  sudo zerotier-cli set $nwid allowDefault=1 }  notunnel() {  sudo zerotier-cli set $nwid allowDefault=0 } 

Linux 的陷阱:rp_filter

Linux 的网络堆栈很复杂,功能丰富得几乎荒谬。这是一件好事,也是一件坏事。您几乎可以用它做任何事情,可能包括但不限于通过鸟类载体的 IP。但它也有很多奇怪的小边缘情况,可以咬人。

要使 Linux 主机通过 ZeroTier 网络进行路由,您可能(取决于发行版)需要更改名为 rp_filter 的设置:

sudo sysctl -w net.ipv4.conf.all.rp_filter=2

RedHat有一篇文章解释了这方面的细节。把它放在 /etc/sysctl.conf 中,使其成为永久的。

奇怪的是,这在网关/路由器上不是必需的,只有运行 Linux 的参与成员想要启用 allowDefault。

IPv6(可选)

使用 IPv6,您不需要 NAT,这使得此步骤的设置变得更加简单!我们的 ip6tables 如下所示:

*filter :INPUT ACCEPT [0:0] :FORWARD DROP [0:0] -A FORWARD -i zt+ -s 2001:19f0:6001:01a6::/64 -j ACCEPT -A FORWARD -i eth0 -d 2001:19f0:6001:01a6::/64 -j ACCEPT :OUTPUT ACCEPT [0:0] COMMIT 

更改为网关的 IPv6 /64 地址前缀。2001:19f0:6001:01a6::/64

数字海洋

我们已经有一段时间没有检查过了,但是 Digital Ocean 没有给你一个真正的 /64,这会导致一些令人困惑的问题。

IPv6 寻址

对于我们的配置,我们启用了基于 ZeroTier 的 RFC4193 IPv6 寻址方案的 IPv6 自动分配和范围 IPv6 自动分配。它还应该可以为网关分配一个与其他人相同的全局前缀的 IPv6 地址,然后将其用于默认路由,但我们喜欢使用 NDP 模拟的 RFC4193 地址,因为它可以更快地最初到达网关。

我们的示例网关具有内部 RFC4193 IPv6 地址,因此我们将其设置为 IPv6 默认路由(相当于 的 IPv6 地址)。我们还在网关的全局 IPv6 /64 子集添加了 /80 路由,我们将从该路由为我们的成员设备分配地址。与 IPv4 一样,ZeroTier 不会推送不属于分配的本地 LAN 路由的托管 IP 地址。fd80:56c2:e21c:2467:3d99:9322:c55a:1da60.0.0.0::0/0

我们网络的 IPv6 路由配置如下所示:

::0/0 via fd80:56c2:e21c:2467:3d99:9322:c55a:1da6 2001:19f0:6001:01a6:00ff::/80 (LAN)

然后,我们将需要配置 ZeroTier Central 的控制器,通过定义 IPv6 自动分配范围来自动为我们的设备分配公共 IPv6 地址。

我们的看起来像:

Auto-Assign from Range 2001:19f0:6001:01a6:00ff:0000:0000:0000 2001:19f0:6001:01a6:00ff:0fff:ffff:ffff

allowGlobal 和 allowDefault

对于 IPv6,您必须在成员设备上启用 和 ,或者至少在要参与的设备上启用。需要允许默认路由覆盖才能允许覆盖 ,而允许网络控制器分配全局 IPv6 地址是必需的。如果没有 ZeroTier,网络只能在专用 IP 空间内分配地址和路由。allowGlobalallowDefault::0/0allowGlobalallowGlobal

设置网关 NDP 代理(并非总是需要)

此时,您应该停止并确保 (1) 您的设备正在获得分配的 IPv6 地址,(2) 您的成员设备可以 ping 网关的私有RFC4193 IPv6 地址,以及 (3) 成员设备也可以 ping 网关的全局外部 IPv6 地址。后者验证网关是否确实在转发 IPv6 流量。

如果上述测试有效,请尝试 ping 全局 IPv6 地址,例如 ping6 ipv6.google.com。如果这不起作用,您可能需要为网关后面的主机代理 NDP 请求。

虽然像这样的提供商会很乐意给你一个通配符 /64,但他们不一定会在自己的路由器中设置到你的整个 IPv6 /64 的路由。他们这样做可能是为了防止路由表在他们这边膨胀。相反,它们依靠 IPv6 邻居查找 (NDP) 来找出 VM 已分配给自身的 IP 地址。

问题在于,现在你的 VM 是一个路由器,并且希望在其 /64 中获取一大堆 IP 的流量,而不仅仅是分配给其主网络接口的 IP。为此,它必须回答这些 IP 的 IPv6 NDP 查询。

Linux 内核无法做到这一点,或者至少不能在不手动指定每个 IP 的情况下为 /64 中的每个 IP 执行此操作。幸运的是,GitHub 上有一个名为 ndppd 的不错的小项目可以为您做到这一点。

您的发行版可能有一个包。

apt install ndppd

现在,您需要将 ndpd.conf-dist 从 ndppd 源代码树复制到 /etc/ndppd.conf 并对其进行编辑。我们只需要在他们的示例规则条目下编辑前缀:

rule 2001:19f0:6001:01a6:00ff:0000:0000:0000/80 { 

这告诉 nndpd 响应整个 /80 的 NDP 请求,我们将从中为我们的设备分配 IPv6 地址。显然,您需要将该 IP 前缀更改为您自己的 IP 前缀。

有一个方便的程序可以帮助您进行 ip 子网划分:apt install ipcalc

规则应使用 or 选项。我们看到了一些片状。staticifaceauto

然后,您需要启动 nndpd 并告诉它在启动时启动。

systemctl start ndppd  systemctl enable ndppd

运行 nndpd 后,再次尝试从您的设备之一 ipv6.google.com ping6。对我们来说,它马上就起作用了!

祝贺!现在,虚拟网络上的每个设备都有一个全局 IPv6 地址。

curl -4 ifconfig.co curl -6 ifconfig.co 

应返回您的 ZeroTier 网关地址。

IPv6 安全性

此配置为 ZeroTier 网络上的每台设备提供真正的全球可访问 IPv6 地址。这很棒,但也可能有点危险。

如果您不希望一切都像这样完全开放,则可以使用 ip6tables 规则来实现有状态防火墙,该防火墙允许所有出站 IPv6 流量,但将入站流量限制为对出站流量的回复数据包。

这可以通过使用替代配置来完成,例如:

*filter :INPUT DROP [0:0] :FORWARD DROP [0:0] -A FORWARD -i zt+ -s 2001:19f0:6001:01a6::/64 -j ACCEPT -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT :OUTPUT ACCEPT [0:0] COMMIT 

这允许从零层端传出 IPv6,但仅允许传入 IPv6(如果它与现有连接或关联相关)。

可以进行更复杂的配置。例如,您可以通过在有状态规则之前添加这些规则来插入允许特定类型的入站流量的特定规则,例如 ssh (22)、http (80) 或 https (443)。

附录

SNAT型

如果您有公共静态 IP,则可以使用 SNAT 而不是 MASQUERADE。

*nat :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] -A POSTROUTING -o eth0 -s 10.6.4.0/22 -j SNAT --to-source <public-ip> COMMIT *filter :INPUT ACCEPT [0:0] :FORWARD DROP [0:0] -A FORWARD -i zt+ -s 10.6.4.0/22 -d 0.0.0.0/0 -j ACCEPT -A FORWARD -i eth0 -s 0.0.0.0/0 -d 10.6.4.0/0 -j ACCEPT :OUTPUT ACCEPT [0:0] COMMIT

iptables 手册解释道:

“这个目标(化装舞会)只在 POSTROUTING 链中的 nat 表中有效。它只能用于动态分配的 IP(拨号)连接:如果具有静态 IP 地址,则应使用 SNAT 目标。伪装等同于指定数据包要传出的接口的 IP 地址的映射,但也具有在接口关闭时忘记连接的效果。当下一个拨号不太可能具有相同的接口地址时,这是正确的行为(因此任何已建立的连接都会丢失)。

FreeBSD 的

FreeBSD 客户端上的 allowDefault=1 设置不起作用。有关解决 https://github.com/zerotier/ZeroTierOne/issues/580,请参阅此 github 问题。

我们已经在 FreeBSD 上禁用了 允许默认设置 从 1.10.6 更新的版本开始,直到我们找到解决方案。

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!