我正在使用 Wireguard 将 Linux 服务器设置为 VPN(之前通过 Algo 配置,现在自己配置)。我的目标是拥有两个不同的公共 IP 地址:一个用于入口(VPN 客户端在此处连接,例如192.0.2.10
),一个用于出口(从 VPN 访问的网站将视其为客户端的 IP 地址,例如198.51.100.20
)。
我尝试过各种方法,过去有一次我让它完美地运行。但是,从那时起,我删除了旧的 Algo VPN 服务器,现在不知道如何让它重新运行。作为背景,当它以前工作时,两个 IP 都连接到同一个 NIC,我认为我不需要对路由或 iptables 做任何棘手的事情。不过,我认为这是在 netplan 之前的 Ubuntu 发行版上,现在使用 netplan 为这种情况正确设置接口很棘手。
我尝试将两个 IP 添加到同一个接口(单个 NIC),将出口 IP 作为主 IP,将入口 IP 作为辅助 IP(因此所有出站流量默认将使用出口 IP)。我还尝试添加两个 NIC(eth0
和eth1
),每个 NIC 使用不同的 IP。
有时它可以工作,但我遇到的问题是,Wireguard 返回客户端的 UDP 数据包有时会通过出口 IP 发出,这意味着 Wireguard 客户端不会通过 NAT 接收它们。客户端日志显示如下消息:Handshake did not complete after 5 seconds, retrying (try 4)
,使用tcpdump
我可以看到响应数据包是从出口源 IP 而不是入口源 IP 发送的。
我尝试使用ip route
和ip rule
命令的组合来设置对称路由,并为每个接口/ip 使用单独的路由表号,但在尝试这样做时总是遇到问题。
更复杂的是,我在 Azure 中执行此操作,因此 VM 位于 VNet 上,并且只能看到内部 IP 地址(10.10.0.4
例如)。因此,在双 NIC 设置中,出口 IP 可能会转换为10.10.0.4
,然后入口 IP 可能会转换为10.10.0.5
。我还尝试让每个 NIC 位于自己的/24
子网上,例如10.10.0.4
和10.10.1.4
。
我尝试使用 iptables 将源地址更改为入口 IP,然后将 UDP 流量发送到端口 51820 (Wireguard)。我还考虑过将入口 IP 设置为默认 IP,然后设置 iptables FORWARD 规则,让任何来自该 IP 的数据都wg0
通过(出口 NIC/出口 IP)传出。
我仍在学习网络和路由,所以也许我的方法不对,过于复杂,或者忽略了一些显而易见的东西。我的问题是,解决这个问题的“正确”或“适当”的解决方案是什么?
答案1
为不同类别的服务使用单独的公共 IP 是一个不错的主意,尽管它们可能都运行在同一个公共网络上。有些人(比如我)在经历了“所有服务都使用一个 IP”设置的问题后才明白这一点,但很快就能改正这个错误。
在 Azure 上,您需要安装 NAT 规则,将每个公共 IP 转换为其自己的私有 IP。假设它是这样的:
192.0.2.10 - 10.10.0.4
— 用于“私人”服务(VPN、管理)198.51.100.20 - 10.10.0.5
— 用于“公共”服务(公共网站、电子邮件等)
您需要设置双向地址转换(SNAT 和 DNAT):您需要两个都将 10.10.0.4(以及其他私有服务,如果 Azure 中有的话)源翻译为 192.0.2.10和目标翻译 UDP 192.0.2.10:51820 为 10.10.0.4:51820(这是针对 Wireguard 的,可针对其他服务进行调整)。
在你的服务器上你需要绑定将您的服务分配到相应的私有 IP。对于每项服务,这都是单独完成的,具体如何做取决于实现它的软件。
Nginx: 代替
listen 80
listen 443 ssl
或者
listen *:80
listen *:443 ssl
你用
listen 10.10.0.5:80
listen 10.10.0.5:443 ssl
Apache 中有类似的设置,我相信所有其他服务器(例如 Postfix:inet_interfaces = 10.10.0.5
等等)中也有类似的设置,您必须使用它,除非......
WireGuard:它将在所有 IP 上应答。因此,请谨慎在 Azure 上设置 NAT。很难找到有关此内容的文档,但您可以设置它在启动连接时将使用哪个地址:
[Interface]
Address = 10.10.0.4/32
默认情况下,对于 IPv4,它使用路由提示它存在于本地路由的路由表中(运行ip route
并查看src
属性)。为了保持安全大小,请列出要与 Wireguard 一起使用的 IP第一的在网络配置中,因此如果您选择“单一专用网络”路线,该地址将会成为提示。
使用单个专用网络还是多个网络并不重要,但有一些配置注意事项。如果是单个网络,则需要将两个 IP 地址分配给同一个虚拟 NIC(因此您将拥有单身的具有两个 IP 地址的虚拟 NIC);在这种情况下,我假设您的网关将是10.10.0.1
(与所有先前的解释一致)。如果有多个网络,您需要设置路由策略数据库因此它将使用正确的路由表和与所选私有 IP 地址相对应的正确的 Azure 网关:
ip route add default via 10.10.0.1 table 100
ip route add default via 10.10.1.1 table 200
ip rule add from 10.10.0.4 lookup 100
ip rule add from 10.10.1.4 lookup 200
对于单网络情况,无需执行此操作,因为无论如何只有一个 NIC 和一个网关。
答案2
配置VPN服务器上每个接口的IP地址。
安装必要的 VPN 软件并根据所需的协议进行配置。
通过运行以下命令访问服务器的路由表并启用 IP 转发:
sysctl -w net.ipv4.ip_forward=1
将入口 IP 地址的静态路由添加到路由表。
将出口 IP 地址的静态路由添加到路由表。
最后,重新启动VPN服务并测试连接。