概括:
我在 AWS EC2 实例上创建了一个 Wireguard VPN 服务器。从 VPN 客户端,我可以正确连接到 VPN 并 ping VPN 服务器。当尝试从客户端访问互联网时,我无法从外部服务器获得任何响应。
完整技术细节:
我在具有公共弹性 IP 的 Amazon EC2 上创建了一个 Ubuntu 20.04 EC2 实例。与该实例关联的安全组允许使用以下入站规则(以及一揽子 0.0.0.0/0 出站规则):
Custom TCP TCP 41194 0.0.0.0/0 Wireguard listen port
SSH TCP 22 <my_known_ip> SSH
Custom UDP UDP 41194 0.0.0.0/0 Wireguard listen port
然后,服务器上的 Wireguard 配置如下:
[Interface]
Address = 192.168.2.1
PrivateKey = <priv_key>
ListenPort = 41194
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
[Peer]
# NAME OF CLIENT
PublicKey = <pub_key>
AllowedIPs = 192.168.2.3/32
然后,我在服务器上还使用以下命令配置操作系统的防火墙(以 root 用户身份完成):
ufw allow from 192.168.2.0/24
ufw allow 41194/any
ufw allow 22/any
ufw enable
/etc/sysctl.conf
我还通过更新以下设置来启用服务器转发 IPv4 流量:
net.ipv4.ip_forward = 1
并确保上述内容生效sysctl -p
完成后,我在服务器上启动 Wireguard 服务(wg-quick up wg0
)。
然后,在客户端上,我使用以下配置连接到 VPN 服务器:
[Interface]
PrivateKey = <priv_key_of_client>
ListenPort = 21841
Address = 192.168.2.3/32
DNS = 192.168.2.1
[Peer]
PublicKey = <pub_key_of_server>
AllowedIPs = 192.168.2.1/24, 0.0.0.0/0, ::/0
Endpoint = <public_ip_of_ec2_instance>:41194
一旦在客户端上启动 VPN,它就会成功连接,并且我可以从客户端成功 ping VPN 服务器(ping 192.168.2.1
)。但从客户端我无法访问任何其他外部服务器(即无法访问互联网)。
以下调试步骤均在VPN服务器本身上执行:
我确保在 wirguard 服务器本身上我可以访问互联网(curl -L google.com
正确返回)。
使用观察 Wireguard 接口上的网络流量,tcpdump -n -i wg0
我发现客户端(ip)尝试的所有连接192.168.2.3
都没有从第三方服务器获得返回。即,看到以下 SYN [S] 请求已发送,但没有看到相应的 [S.] 返回。例如:
09:04:36.133008 IP 192.168.2.3.57624 > 172.217.170.4.80: Flags [S], seq 1394306065, win 65535, options [mss 1380,nop,wscale 6,nop,nop,TS val 1126938286 ecr 0,sackOK,eol], length 0
ens5
在wireguard 服务器使用的默认接口上执行 tcpdump 时也可以看到同样的情况。因此,来自客户端的请求被 wireguard 服务器看到wg0
,然后该请求被转发ens5
到第三方服务器 (google.com),但对于发出的任何 SYN 数据包都看不到相应的回复。
答案1
我找到了自己的问题。我的ufw
设置不正确,无法正确进行 NAT。
因此我添加了以下内容/etc/ufw/before.rules
:
# NAT table rules
*nat
:POSTROUTING ACCEPT [0:0]
# Forward traffic through eth0 - Change to match you out-interface
-A POSTROUTING -s 192.168.2.0/24 -o ens5 -j MASQUERADE
# don't delete the 'COMMIT' line or these nat table rules won't
# be processed
COMMIT
然后重新启动ufw
,ufw disable
互联网ufw enable
现在可以通过 VPN 客户端正常运行。