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
    • 最新
    • 标签
主页 / unix / 问题 / 708264
Accepted
ehammer
ehammer
Asked: 2022-07-02 06:10:26 +0800 CST2022-07-02 06:10:26 +0800 CST 2022-07-02 06:10:26 +0800 CST

不使用基于源的路由的 SNAT/Masquerade 的 VPS 端口转发?

  • 772

我正在尝试使用 VPS 通过 VPN 隧道将 80,443 端口转发到本地 Web 服务器进行测试,同时保持原始源公共 IP 不变。这里的主要问题是路由,因为边缘路由设备将有效地看到 2 个带有公共 IP 的接口(真正的 WAN 和 VPN 接口)。

显然,简单的解决方案是仅通过 vpn 隧道的 SNAT 流量,但我想深入了解 Web 流量的真正来源,加上我做的 NAT 越多,我引入系统的开销就越大。此外,我避免在 VPS 上放置任何反向代理,因为我拒绝在遍历 VPS 时随时解密网络流量。

现在开始测试:使用的 IP:Web SRV:192.168.0.2,VPS Wireguard Addr:192.168.200.1,Router Wireguard Addr:192.168.200.2。

我设置了一个虚拟测试网络,其中包含几个 Debian 11 机器作为 VPS 服务器、本地路由器和 Web 服务器。

在 VPS 上,我的 DNAT 流量从端口 80,443 上的接口传入:

iptables -t nat -A PREROUTING -i eth0 -p tcp -m multiport –dports 80,443 -j DNAT –to-destination 192.168.0.2

我已经设置 sysctl.conf 来启用 ipv4 转发。我在 VPS 上有一条静态路由,告诉我从哪里到达 192.168.0.2:

ip route add 192.168.0.2/32 via 192.168.200.2 dev wg0

在本地路由器上,我根据接口在网上找到了一些基于回复的规则:

echo 200 vpsrt >> /etc/iproute2/rt_tables

ip rule add from 192.168.200.2 table vpsrt prio 1
ip route add default via 192.168.200.1 dev wg0 table vpsrt

由于 VPN 隧道位于路由器上,因此 Web 服务器已经配置了其默认网关,因此本地路由器和 Web 服务器之间的返回流量根本不会改变。

VPS 上的 wg0.conf(充当服务器):

[Interface]
PrivateKey=*
Address=192.168.200.1/30
ListenPort=50000

[Peer]
PublicKey=*
AllowedIPs=192.168.200.2/32,192.168.0.2/32

路由器上的 wg0.conf(作为客户端):

[Interface]
Address=192.168.200.2/32
PrivateKey=*

[Peer]
Endpoint=PUBIPVPS:50000
PublicKey=*
AllowedIPs=172.20.200.0/30

我已经验证了 Wireguard 隧道的工作原理。我可以分别在每个设备上 ping 192.168.200.1 和 .2,wg show 说握手完成并且双向数据正在流动。

做一些 PCAP,通过 VPS 的流量是正确的。VPS 上 wg0 上的 Tcpdump 显示发往 192.168.0.2 端口 443 的数据包。VPS 上的 WG Show 说它正在传输 1.3Kb,但路由器上的 WG Show 说它只收到了 500 字节(测试 ping)。路由器 WAN 接口上的 Tcpdump 显示 Wireguard 数据包正在到达路由器。但是路由器 wg0 上的 Tcpdump 显示它没有收到任何数据包。

我很确定问题是 Wireguard 正在默默地丢弃具有未在 AllowedIPs (在路由器上)中配置的源 IP 的数据包。但问题是我不能将 0.0.0.0/0 放在路由器 wg0.conf 上,因为它会开始使用隧道作为整个网络的默认网关!

是否不可能使用 Wireguard 作为非默认网关进行基于源的路由?使用其他隧道软件是否有任何潜在的解决方法?我真的很喜欢 Wireguard 的速度,但是如果没有 SNAT/Masquerade,它会变得非常有限。

更新: 刚刚找到这篇文章: https ://techoverflow.net/2021/07/09/what-does-wireguard-allowedips-actually-do/ 它解释说,wireguard“防火墙”和路由使用 AllowedIPs 绑定在一起。

再做一点测试,我可以简单地将路由器上的 AllowedIPs 放到 0.0.0.0/0 并在 wg0.conf 中添加一个 postup 规则来删除默认网关路由,而只添加一个静态路由到隧道 IP。(不幸的是,wireguard 选择将“防火墙”和路由整合到一个选项中)

路由器 wg0 接口上的 Tcpdump 显示数据包现在正在穿越隧道。路由器 LAN 接口上的 Tcpdump 显示数据包已传输出去,并且 Web 服务器正在响应。但现在的问题是那些基于接口源的路由规则似乎无法正常工作,因为 Web 服务器的响应没有被传递到 wireguard 隧道中。

路由器 WAN 接口上的 Tcpdump 显示 Web 服务器 syn-acks 被推出该网关。所以现在我的问题在于我上面提到的基于源的路由规则。基于源的路由超出了我的知识范围,因此非常感谢您提供任何帮助。

routing vps
  • 2 2 个回答
  • 188 Views

2 个回答

  • Voted
  1. Best Answer
    Justin Ludwig
    2022-07-06T12:37:55+08:002022-07-06T12:37:55+08:00

    你已经完成了 90% 的路。在路由器上设置自定义vpsrt路由表时:

    echo 200 vpsrt >> /etc/iproute2/rt_tables

    ip rule add from 192.168.200.2 table vpsrt prio 1
    ip route add default via 192.168.200.1 dev wg0 table vpsrt
    

    您应该在第二行使用Web 服务器的IP 地址,而不是路由器的IP 地址:

    ip rule add from 192.168.0.2 table vpsrt prio 1
    

    这将指示您的路由器将所有流量从您的 Web 服务器发送到 WireGuard 隧道。只要您AllowedIPs=0.0.0.0/0在路由器的 WireGuard 配置中作为 VPS 服务器对等条目的一部分,WireGuard 隧道就会接受该流量,并将其发送回 VPS 服务器。

    此外,如果您在路由器的 WireGuard 配置中指定表,则不需要上面的第三行:

    [Interface]
    Address=192.168.200.2/32
    PrivateKey=*
    Table=vpsrt
    
    [Peer]
    Endpoint=PUBIPVPS:50000
    PublicKey=*
    AllowedIPs=0.0.0.0/0
    

    使用该设置,wg-quick会将默认路由添加到您的自定义vpsrt表中,而不是在全局范围内弄乱您的默认路由。

    此外,如果您不想将所有流量从 Web 服务器路由到 VPS(仅来自 TCP 端口 80 和 443 的响应),您可以使用这些规则代替上面的第二行:

    ip rule add from 192.168.0.2 ipproto tcp sport 80 table vpsrt priority 1
    ip rule add from 192.168.0.2 ipproto tcp sport 443 table vpsrt priority 2
    
    • 1
  2. Mr. Diba
    2022-07-05T23:35:58+08:002022-07-05T23:35:58+08:00

    您可以考虑使用 VRF(虚拟路由和转发)。VRF 用于使用自己的默认网关配置单独的路由表。您可以将您的wireguard 接口和您的Web 服务器连接到VRF,并且流量将与当前存在的连接分开。

    这是使用 VRF 的一个很好的例子:https ://interpip.es/linux/creating-a-vrf-and-running-services-inside-it-on-linux/

    • 0

相关问题

  • iptables -j REDIRECT *actually* 对数据包头做了什么?

  • 永久更改接口的指标

  • 为什么我的 CentOS 7.4 在内核 2.6.32 上?[关闭]

  • 任何为第 3 层交换/路由构建的发行版?

  • Debian 9;为 www 服务器设置网络设备

Sidebar

Stats

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

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

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

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve