AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / computer / 问题 / 1826586
Accepted
Tintenfisch
Tintenfisch
Asked: 2024-01-20 19:44:18 +0800 CST2024-01-20 19:44:18 +0800 CST 2024-01-20 19:44:18 +0800 CST

使用 Bird 和 WireGuard 将公共 IPv4 子网隧道连接到本地服务器

  • 772

在Bird 1.6.8中,我成功宣布了 IPv4/24子网,并且我主要使用根据RFC 5735 的示例 IP 地址/子网:

root@tunnel0:~# birdc show proto all vultr
BIRD 1.6.8 ready.
name     proto    table    state  since       info
vultr    BGP      master   up     2024-01-18  Established

我现在想使用WireGuard 在我家的本地服务器上使用203.0.113.32/27其中的一部分203.0.113.0/24

  • 本地服务器是多个 KVM 来宾的主机(libvirt在 Debian 12 Bookworm 上)。
  • 主机本身以及访客都需要一个公共 IPv4 地址。
  • 如果可能的话,我想使用基于策略的路由而不是 NAT。
  • 我确实使用了nftables而不是iptables因为后者变得越来越不赞成。

我能够在两台服务器之间设置 WireGuard 连接,但我不知道如何配置公共 IPv4 子网,以便我可以使用它而不是私有子网:

  • WireGuard 服务器:
    [Interface]
    Address = 10.17.0.1/24
    SaveConfig = true
    ListenPort = 51820
    PrivateKey = ...
    
    [Peer]
    PublicKey = ...
    AllowedIPs = 10.17.0.0/24
    
  • WireGuard 客户端:(= VM 的本地服务器/主机)
    # Client
    [Interface]
    PrivateKey = ...
    Address = 10.17.0.128/24
    
    # Server
    [Peer]
    PublicKey = ...
    AllowedIPs = 10.17.0.0/24
    PersistentKeepalive = 25
    Endpoint = 198.51.100.77:51820
    
  • 鸟:
    router id 198.51.100.77;
    
    protocol bgp vultr
    {
      # substitute with your AS or Vultr's private AS
      local as 123456;
      source address 198.51.100.77;
      import none;
      export all;
      graceful restart on;
      multihop 2;
      neighbor 169.254.169.254 as 64515;
      password "...";
    }
    
    protocol static
    {
      route 203.0.113.0/24 via 198.51.100.77;
    }
    
    protocol device
    {
      scan time 5;
    }
    
networking
  • 1 1 个回答
  • 97 Views

1 个回答

  • Voted
  1. Best Answer
    u1686_grawity
    2024-01-20T21:08:37+08:002024-01-20T21:08:37+08:00
    1. 在两台主机上,通过Table = 2在两个配置中进行设置来禁用 wg-quick 的自动策略路由。(我什至会用来Table = off禁用它的自动路由添加并手动完成这一切,但我认为在你的情况下保留它很好;稍后它会很有用。)

      [Interface]
      Table = 2
      

      当WireGuard隧道重新启动时,查看ip rule并ip route show table 2查看路由策略是什么。我希望没有非默认规则(只有下面显示的三个规则),并且表 2 中只有一个“dev wg0”路由。

      Both# ip -4 rule
      0:      from all lookup local
      32766:  from all lookup main
      32767:  from all lookup default
      
      Both# ip -4 route show table 2
      10.17.0.0/24 dev wg0
      
    2. 更新隧道的AllowedIPs以匹配将通过它的流量。

      • 在服务器端,dst=203.0.113.32/27的数据包将被发送到客户端,而src=203.0.113.32/27的数据包将从客户端接收,因此客户端的服务器端[Peer]条目必须在客户端的AllowedIP 中包含203.0.113.32/27。

      • 在客户端,来自任何源(即整个互联网)的数据包都会从隧道接收,而到任何目标的数据包都会被发送回隧道,因此客户端配置需要AllowedIPs允许0.0.0.0。 0.0.0/0 即一切。

      我只需将两侧的AllowedIPs 设置为0.0.0.0/0,以便WireGuard 成为一个完全标准的隧道,可以承载它所告知的任何IP 流量。

      [Peer]
      AllowedIPs = 0.0.0.0/0
      

      重新启动隧道;用于wg show确保更改生效。

      Both# wg show
      peer: asdf
          allowed ips: 0.0.0.0/0
      

      还可以ip route show table 2再次使用,检查 wg-quick 将AllowedIPs 转换为系统路由是否受此影响。

      Both# ip r sh table 2
      default dev wg0
      
    3. 在服务器上,实际上通过 WireGuard wg0 接口路由地址。

      # ip route add 203.0.113.32/27 dev wg0
      

      让它粘起来:

      [Interface]
      PostUp = ip route add 203.0.113.32/27 dev wg0
      
      • 由于是三层隧道接口,所以不需要指定网关via;所有路由都可以是just dev wg0(虽然添加via 10.17.0.128无害,但也无用)。WireGuard 使用AllowedIPs 来决定将数据包转发到哪个对等点;像 GRE 这样的纯点对点隧道只会将所有内容发送到“另一端”。但是,如果它是 L2TP 或 ZeroTier 等第 2 层隧道,则必须指定via 10.17.0.128为网关。

      • 在这种情况下,wg-quick 已经向表 2 添加了路由,因此我们可以通过添加 代替ip rule上述路由来使用它 - 这实际上在客户端是必要的- 但在服务器上,从为了理解起见,一条简单的路线。

      • 从技术上讲,您可以使用 Bird 的“静态协议”来使路由永久化,而不是使用 wg-quick 的“PostUp”,但我现在建议使用后者,因为使用 Bird,您需要添加过滤器以防止 /27 路由通过 BGP 发送。(无论如何,您的对等方都不会接受 /27 路由,但最好不要通告除 /24 聚合路由以外的任何内容。)

    4. 使用 tcpdump 验证数据包是否发送至客户端。

      • ping 203.0.113.32在 Vultr 服务器上运行。
      • 在Vultr服务器上运行tcpdump -n -i wg0以确保这些数据包通过隧道出去(即路由表正常)
      • 在 WG 客户端上运行相同的操作tcpdump -n -i wg0以确保数据包到达隧道的另一端(即AllowedIP 正常)。
      • 此时还不会收到任何 ping 回复 – 没关系;首先让它朝一个方向工作。

      还要验证来自 Internet 的数据包是否到达您的 VPS 并转发到客户端。

      • 在既不是家庭服务器也不是 VPS 的计算机上运行ping 203.0.113.32(如果是 Windows,请使用该选项)。(如果您没有任何其他位置可以进行 ping 操作,请使用公共“Looking glass”站点 – 许多大型运营商允许您从其网络进行 ping/traceroute 操作。)-t
      • 在Vultr服务器上运行tcpdump -n -i eth0 "host 203.0.113.32",查看数据包是否到达服务器(即BGP公告正常)。
      • 在 Vultr 服务器上运行tcpdump -n -i wg0以确保这些数据包通过隧道转发出去。如果不是,请检查 iptables 规则。
      • 再次在客户端上运行它以确保数据包到达。
    5. 在客户端上,您现在正在接收“发往”203.0.113.32/27 的数据包。出于所有意图和目的,您可以将其视为客户端直接执行 BGP 公告并且隧道不存在(除了仍然需要策略路由在两个上行链路之间进行选择之外)。

      我假设您的虚拟机主机有一个vmbr0所有虚拟机都连接到的网桥。

      我无法提供有关 libvirt 网络的任何说明,因为我几乎没有接触过 libvirt,但所需要的只是配置 libvirt 网络 IP 地址 - 其中不会有任何 WireGuard 特定或 BGP 特定的内容。

    6. 为主机本身分配一个地址。将其作为 /32 添加到其他接口(“lo”是传统接口,也可以使用“dummy0”或“wg0”),以便即使 vmbr0 由于某种原因关闭时它也能继续工作。

      让我们使用 /27 的第一个地址:

      Client# ip addr add 203.0.113.33/32 dev lo
      

      (因为它是 /32,所以您甚至可以使用第 0 个地址,即.32/32;“保留”规则在这里不适用。同样,/32 没有广播,因此最后一个地址.63也可用。)

      此时,如果仍然ping运行该程序,则主机应该开始发送回复(尽管仍然通过错误的接口),因此再次使用 tcpdump 来验证是否存在 ICMP 回显请求和响应。

      Client# tcpdump -e -n -i any "net 203.0.113.32/27"
      
    7. 添加策略路由规则,根据源地址通过 wg0 引导流量。

      Client# ip rule add from 203.0.113.32/27 lookup 2
      

      通常情况下,您需要首先将路由添加到表 2,但 wg-quick 已经做到了这一点(来自AllowedIPs)。不过,您应该验证它是否正确(如果不正确则更正):

      Client# ip -4 r ls table 2
      default dev wg0
      

      您可以使用它ip route get来检查内核对任何特定数据包的看法:

      Client# ip route get 8.8.8.8
      8.8.8.8 via <LanGW> dev eth0 src <LanIP>
      
      Client# ip r get 8.8.8.8 from 203.0.113.33
      8.8.8.8 dev wg0 src 203.0.113.33 table 2
      
    8. 策略规则到位后,客户端主机上的 tcpdump 现在应该显示 Echo Reply 数据包确实通过 wg0 而不是 eth0 – 并且现在应该ping 203.0.113.32实际上正在接收回复。如果没有,请在每一步(客户端 wg0、服务器 wg0、服务器 eth0)重复 tcpdump 以查找卡住的位置。

    9. 剩下的就是将 /27 的其余部分分配给您的 VM 网桥,就像它是普通子网一样:

      Client# ip addr add 203.0.113.33/27 dev vmbr0
      
      VM_1# ip addr add 203.0.113.34/27 dev eth0
      

      ...并编辑 libvirt 网络 XML 以实际使其持久化(甚至可能使其为此网络执行 DHCP)。


    其他注意事项:

    • 有了鸟1.6.8,

      您现在应该正在使用Bird 2 。虽然 1.6.x 系列不会停止工作,但它已经停止接受任何进一步的开发(自四年前的 1.6.8 版本以来仅完成了一次修复)。

    • protocol bgp vultr {
        import none;
        export all;
      }
      

      您应该对导出到 eBGP 对等方的内容有明确的过滤器(即使对等方已经过滤了从您那里导入的内容,也是一种良好的做法)。例如:

      export where net = 203.0.113.0/24;
      export where net ~ [ 203.0.113.0/24 ];
      export filter { if net ~ [ 203.0.113.0/24 ] then accept; reject; };

    • protocol static {
        route 203.0.113.0/24 via 198.51.100.77;
      }
      

      route 203.0.113.0/24 unreachable可能是首选。无论如何,网关规范不会成为 eBGP 声明的一部分(eBGP 总是将自身通告为下一跳)——但它将被导出到本地内核路由,并且最好有一个覆盖所有部分的“不可达”路由。您的网络没有专门路由到其他地方。

    • protocol device {
        scan time 5;
      }
      

      scan time在许多版本之前就不再需要了——Bird 从内核获得即时的 Netlink 通知。有一个空protocol device {}块就足够了。

    • 1

相关问题

  • 三台电脑,没有路由器/交换机怎么组网?

  • 用户使用 FileZilla 连接到 SFTP 服务器拒绝连接

  • NAT 后面的 NAT 如何工作(路由器的 NAT 和 ISP 的 NAT)?

  • Win10 1803:如何让移动热点成为专用网络?

  • nc如何识别服务名称

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何减少“vmmem”进程的消耗?

    • 11 个回答
  • Marko Smith

    从 Microsoft Stream 下载视频

    • 4 个回答
  • Marko Smith

    Google Chrome DevTools 无法解析 SourceMap:chrome-extension

    • 6 个回答
  • Marko Smith

    Windows 照片查看器因为内存不足而无法运行?

    • 5 个回答
  • Marko Smith

    支持结束后如何激活 WindowsXP?

    • 6 个回答
  • Marko Smith

    远程桌面间歇性冻结

    • 7 个回答
  • Marko Smith

    子网掩码 /32 是什么意思?

    • 6 个回答
  • Marko Smith

    鼠标指针在 Windows 中按下的箭头键上移动?

    • 1 个回答
  • Marko Smith

    VirtualBox 无法以 VERR_NEM_VM_CREATE_FAILED 启动

    • 8 个回答
  • Marko Smith

    应用程序不会出现在 MacBook 的摄像头和麦克风隐私设置中

    • 5 个回答
  • Martin Hope
    Vickel Firefox 不再允许粘贴到 WhatsApp 网页中? 2023-08-18 05:04:35 +0800 CST
  • Martin Hope
    Saaru Lindestøkke 为什么使用 Python 的 tar 库时 tar.xz 文件比 macOS tar 小 15 倍? 2021-03-14 09:37:48 +0800 CST
  • Martin Hope
    CiaranWelsh 如何减少“vmmem”进程的消耗? 2020-06-10 02:06:58 +0800 CST
  • Martin Hope
    Jim Windows 10 搜索未加载,显示空白窗口 2020-02-06 03:28:26 +0800 CST
  • Martin Hope
    andre_ss6 远程桌面间歇性冻结 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney 为什么在 URL 后面加一个点会删除登录信息? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension 鼠标指针在 Windows 中按下的箭头键上移动? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    jonsca 我所有的 Firefox 附加组件突然被禁用了,我该如何重新启用它们? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK 是否可以使用文本创建二维码? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 更改 git init 默认分支名称 2019-04-01 06:16:56 +0800 CST

热门标签

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve