google-cloud-platform - Wireguard 连接后无法上网
问题描述
我知道这个具体问题有很多问题,但相信我,我已经尝试了我所掌握的一切。连接到 Wireguard 并建立成功的握手后,我没有互联网连接。我将描述到目前为止我尝试过的所有事情,但没有运气。
我正在使用 Google Cloud 中的虚拟机和物理 Windows 机器作为客户端。
这是我的服务器配置(Google Cloud VM)的样子:
[Interface]
Address = 10.100.100.1/24
SaveConfig = true
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
ListenPort = 51820
PrivateKey = PRIVATE_KEY
[Peer]
PublicKey = CLIENTS_PUBLIC_KEY
AllowedIPs = 10.100.100.2/32
这是我的客户端连接的样子:
[Interface]
PrivateKey = CLIENTS_PRIVATE_KEY
Address = 10.100.100.2/32
[Peer]
PublicKey = SERVER_PUBLIC_KEY
AllowedIPs = 0.0.0.0/0
Endpoint = BASTION_SERVER_PUBLIC_IP:51820
我在修改/etc/sysctl.conf文件并取消注释以下行的云 VM 中启用了 IPV4 转发:
net.ipv4.ip_forward=1
由于这是一个带有外部防火墙的云环境,所以我手动将规则添加到云防火墙的 51820 端口。之后我可以成功握手,但客户端没有互联网。
- 我检查了服务器本身是否可以访问互联网,确实如此。
- 在客户端禁用了我的整个防火墙,因为我认为它可能会干扰某些事情。
- 我在另一篇文章中读到有人建议明确添加 MTU 值。Google 使用的 MTU 值为 1460,这显然与 Wireguard 的默认值不同。我已经将它添加到客户端和服务器配置中,但没有运气。
- 明确说明客户端配置中的 DNS 记录。仍然没有运气。
- 启用 UFW 并明确放置 Wireguard - 51820 所需的端口。
关于这一切,我有什么遗漏吗?我已经尝试了所有我能得到的东西,但握手后仍然没有来自客户端的互联网连接。
先感谢您!
更新 1
我已按照建议启用了 IP 转发:
完成此配置后,我可以在服务器端看到握手成功:
peer: PUBLIC_KEY
endpoint: CLIENT_IP:56507
allowed ips: 10.100.100.2/32
latest handshake: 4 minutes, 11 seconds ago
transfer: 52.60 KiB received, 344 B sent
它还显示它接收到 52.60 KiB 的数据。这是以前不在这里的。
然而问题仍然存在。我仍然无法从客户端访问互联网。
解决方案
默认情况下,Google Cloud 会对数据包执行严格的源和目标检查,以便:
- VM 实例只能发送源设置为与其在网络中的接口的内部 IP 地址相匹配的数据包。
- 只有当数据包的目的地与网络中实例接口的 IP 地址匹配时,数据包才会被传递到实例。
创建 VM 时,您必须启用IP 转发。这在创建 VM 后无法更改。
推荐阅读
- email - Google Cloud 上的 SMTP 电子邮件服务器托管 - 套接字错误 10060
- sharepoint - 如何上传 SharePoint 文档的自定义缩略图
- python - 如何在第二个显示器/显示器上打开 Tkinter GUI?(视窗)
- sql - 关于两个日期之间值总和的 SQL 查询
- reactjs - react-navigation 5和Formik处理提交不起作用
- c++ - 复制构造函数没有被调用
- c++ - 运行使用自定义 gcc 编译的应用程序时,动态链接器直接调用分段错误
- r - R中日期类对象中的字符数
- python - 使用 opencv 进行透视变形并使用 tkinter 显示它
- python - 尝试使用 <= 和 >= 日期明天 0100-2400 if 语句过滤 api 请求