推介会

推介会

我正在从事家庭项目,并希望给我的机器赋予分配给云中我的 VPS 的公共 IP 地址。

在家里我有一个公共 IP 地址,并且我已经设置了 Wireguard 服务器,外部端口 1194 被转发到该机器,因此来自互联网的 WG 客户端可以连接到它。

现在,我在云中有一个具有静态公共 IP 地址的 VPS(假设为 IP 44.44.44.44),并且我在本地网络中有一台机器(假设为 IP 192.168.1.3),并且我希望本地网络中的机器处理流量,因为它实际上具有云中 VPS 的公共 IP( )。 这意味着进入 VPS 的所有传入流量都被路由到本地网络中的44.44.44.44机器( )。192.168.1.3

我使用 Wireguard 连接 WG 服务器和 VPS 时没有遇到任何问题,甚至无法通过 WG 服务器重定向来自 VPS 的所有流量(使用 iptables NAT 规则),但我在将传入流量从 VPS 路由到本地网络中的机器(保留原始 IP 地址)的部分遇到了困难。

我的客户端(VPS)WG 配置:

[Interface]
PrivateKey = dGhpcyBpcyBub3QgdGhlIGtleSA7KQ==
Address = 10.66.66.2/24
#This was part of the test usin
#PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;
#PostDown = iptables -D FORWARD -i wg0 -j ACCEPTl iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

[Peer]
PublicKey = dGhpcyBpcyBub3QgdGhlIGtleSBlYXRoZXIgOyk=
Endpoint = 33.33.33.123:1194
AllowedIPs = 10.66.66.1/32

我的服务器(WG)配置:

[Interface]
Address = 10.66.66.1/24
ListenPort = 1194
PrivateKey = dGhpcyBpcyBub3QgdGhlIGtleSA7KQ==
PostUp = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

[Peer]
PublicKey = dGhpcyBpcyBub3QgdGhlIGtleSBlYXRoZXIgOyk=
AllowedIPs = 10.66.66.2/32

我的理解是否正确,最好的做法是将机器(192.168.1.3)连接到 WG 服务器(假设使用 IP 10.66.66.3),然后在 VPS 上创建到eth0的静态路由10.66.66.3

这是网络的简单绘图以及我想要实现的目标: 在此处输入图片描述

答案1

推介会

这是一个需要服务器本身最低限度支持的答案,但是多项路由调整在 WireGuard 服务器上,尤其是在 VPS 上。我选择保留 OP 的设置,包括保留 VPS 和 WGserver 之间的 WireGuard 隧道。

本答案不会处理将配置正确集成到正在使用的特定分布中(但给出了提示)。

需要内核>=4.17对于 ipproto/dport/sport 策略路由功能,允许执行例外而不需要iptables和/或分数

扩展 fib 规则匹配支持,包括 sport、dport 和 ip proto 匹配(以完成 5 元组匹配支持)。数据中心中基于策略的路由的常见用例需要 5 元组匹配

此设置不使用iptables也不是 NAT:服务器的 44.44.44.44 地址将通过隧道双向路由,并且(可以说尽管如此)VPS 的 44.44.44.44 地址。可以想象,甚至 IPsec 的 ESP 数据包也由服务器可以通过此隧道正常工作(未经测试)。它主要依赖于ip route add table XXX ...策略路由 ( ) 选择的附加路由表 ( ip rule add ... lookup XXX)。

需要注意以下几点:

  • VPS 和路由器的地址不能动态更改,因为有几条规则依赖于它们。这意味着 WireGuard 的自动漫游功能在这里不起作用,因为所需的ip rule条目引用了特定的 IP 地址,也必须更改。如果 VPS 发生变化但已知位于单个地址块中,则 IP 规则和路由可能会更改以适应路由/网络掩码,而不仅仅是 44.44.44.44。如果它是完全随机的,那么可以让选择器只检查端口 1194。

  • VPS 自身的连接现在非常有限:它只是变成了一个有限的路由器。除了作为隧道端点之外,只有 SSH 可用,没有其他任何东西,甚至没有 DNS。对 VPS 的更新应使用可以在工作组服务器, 在服务器或通过 SSH 隧道。应进行配置以避免使用隧道过多,但即使不这样做也会起作用(无用地使隧道流量加倍)。

  • 可能需要检查 VPS 自己的防火墙规则。由于它将路由流量,因此该流量仍受iptables/nftables如果建立到位,更重要的是连接跟踪对于有状态的规则。连接跟踪不知道路由,因此将 44.44.44.44 视为唯一节点。这应该没有太大关系,因为本地流量将使用 INPUT/OUTPUT 链,而路由流量将使用 FORWARD 链,并且两者中不会存在相同类型的流量,因为 VPS 现在仅限于隧道和 SSH。所以我没有添加iptables规则中的生的表将 conntrack 划分为区域或阻止跟踪,但这仍然是选项

还有其他可能的选择:

  • 应用多层 NAT,但我宁愿尽可能避免使用 NAT。它也无法透明地实现“我希望本地网络中的机器处理流量,因为它实际上拥有公共 IP”的目标,因为例如 NAT 会破坏 IPSec 的本机 ESP 流量,并且需要正确处理同一远程 Internet 系统之间的完全相同的流量,然后虚拟专用服务器或者服务器(可能有标记和连接跟踪区域)。
  • 一些帮助虚拟专用服务器使用单独的网络命名空间并窃取非隧道数据包(使用或者nftables, 可能不会iptables),但这仍然需要大部分调整,甚至更多。

使用的路由调整的非详尽列表:

  • 在两个隧道端点:

    • 在隧道两侧添加路由例外,以便它们仍可正常路由
  • 工作组服务器

    • 允许来自 WireGuard 隧道的任何 IP 地址:允许服务器接收所有互联网而不是仅仅 10.66.66.2。
    • 不要使用 NAT 规则
  • 虚拟专用服务器

    • 除了 10.66.66.1 之外,还允许来自 WireGuard 隧道的 44.44.44.44
    • 移动规则调用当地的路由表的优先级更高,以便为例外留出空间,甚至当地的路由表,允许 虚拟专用服务器路由属于其自身的 IP 地址。这可能是最重要的改变。
    • 为 44.44.44.44 添加代理 ARP 条目,以使虚拟专用服务器尽管对其进行了路由,仍会应答路由器的 ARP 请求(这需要更常见的代理 ARP 案例)
  • 服务器

    • 服务器可以选择将其设为多宿主,默认情况下优先使用 44.44.44.44 通过隧道(因此不会对不支持多宿主的 UDP 服务产生问题)。

这个答案必须经过测试。第一次尝试不可能奏效。大多数测试都是使用tcpdump和进行的ip route get。它没有考虑到 WGserver 或 VPS 上使用的当前(和未知)防火墙规则可能造成的干扰。


设置

以下是按顺序排序的设置,旨在避免每个要配置的系统之间以及要运行的每个单独的命令之间的连接丢失。无论如何,应该有一个可用的远程控制台访问权限虚拟专用服务器解决问题。由于以下命令未保存(除了wg-quick的配置,除非选择wg直接使用),远程重置将恢复对的访问虚拟专用服务器

工作组服务器

最初配置如下:

ip link set dev eth0 up
ip address add 192.168.1.2/24 dev eth0
ip route add default via 192.168.1.1
  • 至少设置为路由器eth0以及未来的界面WG0(通常配置为/etc/sysctl.{conf,d/}):

    sysctl -w net.ipv4.conf.default.forwarding=1
    sysctl -w net.ipv4.conf.eth0.forwarding=1
    
  • wg-quick改变的配置:

    [Interface]
    Address = 10.66.66.1/24
    ListenPort = 1194
    PrivateKey = dGhpcyBpcyBub3QgdGhlIGtleSA7KQ==
    Table = off
    PostUp = 
    PostDown = 
    
    [Peer]
    PublicKey = dGhpcyBpcyBub3QgdGhlIGtleSBlYXRoZXIgOyk=
    PersistentKeepalive = 25
    AllowedIPs = 0.0.0.0/0
    

    不再有 NAT:流量将直接通过隧道路由,无需更改。只需确保防火墙规则允许所需流量通过,并且没有其他通用 NAT 规则。Table = off防止wg-quick配置额外路由,因为无论如何都会进行自定义路由。由于工作组服务器落后路由器的NAT,PersistentKeepalive应该用来刷新路由器的NAT关联表(例如:连接跟踪对于 Linux 路由器)。

    由于任何 IP 流量都可以通过隧道,因此 AllowedIPs 设置为 0.0.0.0/0 以关联任何IP 到对等端以进行 WireGuard 自己的加密密钥路由。

在应用以下设置之前,隧道必须处于开启状态。为了进行集成,也许可以创建一个自定义脚本,从 的wg-quick/PostUp运行PostDown,其中包含要遵循的配置。请注意,虽然当接口关闭时路由会消失,ip rule但即使接口被删除,条目也更有可能保留下来,因此应进行适当清理,以避免以后出现重复和混淆。

  • 保持与 44.44.44.44 隧道本身相关的互联网流量通过路由器并避免受到在主要的表格末尾。使用显式偏爱因此命令的顺序并不重要:

    ip route add table 1000 192.168.1.1/32 dev eth0
    ip route add table 1000 default via 192.168.1.1 dev eth0
    
    ip rule add preference 1000 to 44.44.44.44 iif lo ipproto udp sport 1194 table 1000
    ip rule add preference 1001 from 44.44.44.44 to 192.168.1.2 iif eth0 ipproto udp dport 1194 table 1000
    
  • 可选:让 SSH 也可以通过隧道路由到隧道外路由器。如果没有它,WGserver 将通过 ssh 连接到服务器当做ssh 44.44.44.44而不是虚拟专用服务器,但仍然可以 ssh 到虚拟专用服务器使用ssh 10.66.66.2

    ip rule add preference 1002 to 44.44.44.44 iif lo ipproto tcp dport 22 lookup 1000
    ip rule add preference 1003 from 44.44.44.44 to 192.168.1.2 iif eth0 ipproto tcp sport 22 lookup 1000
    
  • 有来自以下来源的一般流量:44.44.44.44服务器,通过隧道进行路由。工作组服务器对于不涉及 44.44.44.44 的一般情况,其本身不受影响,仍然使用路由器访问互联网:

    ip route add table 2000 default dev wg0
    
    ip rule add preference 2000 from 44.44.44.44 iif eth0 lookup 2000
    

    注:以前使用的iif eth0是指来自路由器,而最后一次使用iif eth0来自服务器。路由规则无法区分不同的网关(路由器对比服务器)用于到达同一接口(eth0),但这不是问题,因为用于隧道的特定端口足以区分情况。

  • 添加路线(标准,使用主要的表)达到剩余的服务器的 44.44.44.44 直接在 LAN 上(均来自工作组服务器以及通过隧道路由的流量):

    ip route add 44.44.44.44/32 dev eth0
    

    因此,家庭以太网广播域将看到两种本地地址:192.168.1.0/24 和 44.44.44.44/32(例如:ARP 从 192.168.1.2 获得 44.44.44.44)

虚拟专用服务器

最初应像这样配置(以 44.44.44.1 为虚拟专用服务器'路由器):

ip link set dev eth0 up
ip address add 44.44.44.44/24 dev eth0
ip route add default via 44.44.44.1
  • 设置为路由器:

    sysctl -w net.ipv4.conf.default.forwarding=1
    sysctl -w net.ipv4.conf.eth0.forwarding=1
    
  • wg-quick改变的配置:

    [Interface]
    PrivateKey = dGhpcyBpcyBub3QgdGhlIGtleSA7KQ==
    Address = 10.66.66.2/24
    Table = off
    PostUp = 
    PostDown = 
    
    [Peer]
    PublicKey = dGhpcyBpcyBub3QgdGhlIGtleSBlYXRoZXIgOyk=
    Endpoint = 33.33.33.123:1194
    PersistentKeepalive = 1000
    AllowedIPs = 10.66.66.1/32,44.44.44.44/32
    

    PersistentKeepalive这里只是为了确保同行工作组服务器收到初始握手,然后知道其对等端点(设置端点可能更简单工作组服务器并且不需要虚拟专用服务器,但 OP 选择反过来做。许多规则取决于端口 1194 及其位置)。否则,如果没有任何初始传入流量,WGserver 就不会有任何传出流量,因为它还不知道其端点。44.44.44.44/32 被添加到 AllowedIPs 列表中,因此它与 WireGuard 的加密密钥路由的对等点相关联。

在应用以下内容之前,隧道必须启动(与之前一样,PostUp/PostDown可能用于包含以下设置)。

  • 向上移动当地的表规则为必须绕过的规则腾出空间当地的桌子。

    ip rule add preference 200 lookup local
    ip rule delete preference 0
    

    所有优先级低于 200 的规则现在都可以在此规则之前发生,该规则将相关流量归类为当地的流量:他们将能够阻止这种情况发生,并将 44.44.44.44 路由到其他地方,尽管它是一个当地的地址。

  • 隧道例外情况到稍后出台的例外规则:

    ip rule add preference 100 from 33.33.33.123 to 44.44.44.44 iif eth0 ipproto udp sport 1194 lookup local
    ip rule add preference 101 from 44.44.44.44 to 33.33.33.123 iif lo ipproto udp dport 1194 lookup main
    
  • 可选的 SSH 例外规则,允许任何互联网源仍然连接到虚拟专用服务器使用时远程控制, 而不是服务器。可选,但如果没有,则只能通过隧道进行访问。如果隧道配置错误,虚拟专用服务器失去访问权限。

    ip rule add preference 102 to 44.44.44.44 iif eth0 ipproto tcp dport 22 lookup local
    ip rule add preference 103 from 44.44.44.44 iif lo ipproto tcp sport 22 lookup main
    
  • 添加代理 ARP 条目,以保持 VPS 响应 44.44.44.44 的 ARP 请求,该请求现在由虚拟专用服务器而它自己的路由器却不知道这一点:

    ip neighbour add proxy 44.44.44.44 dev eth0
    

    如果没有这个,在下一组规则之后,连接将不再正常工作,因为 ARP 应答不再发送到 VPS 的路由器(实际上,在 VPS 路由器 FAILED ARP 条目超时后,连接偶尔会正常工作,同时接收来自虚拟专用服务器,但该条目会在几秒钟后再次变为失败,直到下一次超时)。

  • 例外路由和一般情况的规则:路由 44.44.44.44,而不是将其视为本地流量(一些路由只是从主要的路由表):

    ip route add table 150 44.44.44.0/24 dev eth0
    ip route add table 150 default via 44.44.44.1 dev eth0
    ip route add table 150 10.66.66.0/24 dev wg0 src 10.66.66.2
    ip route add table 150 44.44.44.44/32 dev wg0 src 10.66.66.2
    
    ip rule add preference 150 to 44.44.44.44 iif eth0 lookup 150
    ip rule add preference 151 from 44.44.44.44 iif wg0 lookup 150
    
  • 可选地,添加两条路线(一条从当地的表)并在所有其他规则之前插入两个规则以仍然允许虚拟专用服务器本身连接到服务器10.66.66.2 中的 44.44.44.44,如果出于某种原因需要这样做的话。可能需要避免一些重复,但这是可选的...

    ip route add table 50 local 10.66.66.2 dev wg0
    ip route add table 50 44.44.44.44/32 dev wg0
    
    ip rule add preference 50 from 10.66.66.2 iif lo to 44.44.44.44 table 50
    ip rule add preference 51 from 44.44.44.44 iif wg0 to 10.66.66.2 lookup 50
    

    使用示例虚拟专用服务器到达服务器(配置完成后):

    ssh -b 10.66.66.2 44.44.44.44
    

    使用示例来自服务器(配置完成后)达到虚拟专用服务器

    ssh 10.66.66.2
    
  • 可选地,保护家庭免受通过虚拟专用服务器,只需使用tc ... netemqdisc。它设置在WG0的出口,而将其设置为eth0的入口。

    例如,如果家庭可以承受约 50mbits/s 的传入带宽工作组服务器的隧道(实际上意味着更多路由器):

    tc qdisc add dev wg0 root netem rate 49mbit
    

服务器

服务器最初配置如下:

ip link set dev eth0 up
ip address add 192.168.1.3/24 dev eth0
ip route add default via 192.168.1.1

进行了以下更改:

  • 将直接与 192.168.1.2/32 关联的 44.44.44.44(这只是ip address+ip route命令的快捷方式)添加到eth0, 使用工作组服务器作为优先选择 44.44.44.44 源的路由器:

    ip address add 44.44.44.44 peer 192.168.1.2/32 dev eth0
    ip route delete default
    ip route add default via 192.168.1.2 src 44.44.44.44
    
  • 可选择完全删除 192.168.1.3 以仅保留 44.44.44.44:

    ip address delete 192.168.1.3/24 dev eth0
    
  • 或者代替上一个命令,设置多宿主(44.44.44.44 保持默认使用):

    ip route add table 192 default via 192.168.1.1 dev eth0
    ip rule add from 192.168.1.3 iif lo lookup 192
    

    多宿主示例:

    • 默认使用源 44.44.44.44:

      curl http://ifconfig.co/
      
    • 手动选择源 192.168.1.3:

      curl --interface 192.168.1.3 http://ifconfig.co/
      

    如果服务器本身配置为路由器+NAT托管容器或虚拟机,MASQUERADEiptables规则可能会选择错误的发件地址(因为它总是选择第一的接口上的地址(首先设置 192.168.1.3/24)会干扰现有的路由。始终使用 SNAT 以确保结果。

    LXC 示例,使用 SNAT 代替 MASQUERADE(应在 LXC 提供的lxc-net脚本命令中进行更改):

    • 一般情况:

      iptables -t nat -A POSTROUTING -s 10.0.3.0/24 -o eth0 -j SNAT --to-source 44.44.44.44
      
    • IP 地址为 10.0.3.123/24 的容器应该通过家庭路由器进行路由:

      iptables -t nat -I POSTROUTING -s 10.0.3.123/24 -o eth0 -j SNAT --to-source 192.168.1.3
      
    • 可能需要从此类容器复制一条到达 192.168.1.3 本身的路由(并不是说有任何理由需要这样做)。对于 LXC:

      ip route add table 192 10.0.3.0/24 dev lxcbr0
      
  • 可选地,如果路径 MTU 发现无法正常工作(例如:ICMP 被过滤了)服务器以及远程客户端或服务器,直接将 MTU 设置为 WireGuard 隧道接口的 MTU 在某些情况下可能会有所帮助,因为已建立的 TCP 连接似乎保持冻结状态。这可以针对每个路由而不是每个接口进行设置,因此不会影响可选的多宿主 192.168.1.3 源路由。

    ip route delete default
    

    然后(推荐):

    ip route add default via 192.168.1.2 src 44.44.44.44 mtu 1420
    

    或者根本不要尝试 PMTUD:

    ip route add default via 192.168.1.2 src 44.44.44.44 mtu lock 1420
    

托管于服务器现在可以通过 44.44.44.44 从 Internet 访问,但 SSH 除外(如果在虚拟专用服务器,并且互联网上的任何服务都可以通过服务器使用 44.44.44.44 源地址。

相关内容