Резюме:
Я создал VPN-сервер Wireguard на экземпляре AWS EC2. Из VPN-клиента я могу правильно подключиться к VPN и пропинговать VPN-сервер. При попытке получить доступ к Интернету с клиента я не могу получить никаких ответов от внешних серверов.
Полная техническая информация:
Я создал экземпляр Ubuntu 20.04 EC2 на amazon EC2 с общедоступным эластичным IP-адресом. Группа безопасности, связанная с экземпляром, допускает следующие правила для входящих подключений (и общие правила для исходящего трафика 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
Я также разрешаю серверу пересылать трафик IPv4, обновляя /etc/sysctl.conf
иметь следующий набор:
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 на клиенте он успешно подключается, и с клиента я могу успешно пропинговать 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
То же самое можно увидеть при выполнении tcpdump по умолчанию ens5
интерфейс, который использует сервер Wireguard. Таким образом, запрос от клиента виден сервером Wireguard на wg0
, этот запрос затем пересылается на ens5
и на сторонний сервер (google.com), но не видно соответствующего ответа ни на один из отправленных SYN-пакетов.
Я разобрался со своими проблемами. Мой ufw
не был настроен правильно для правильного выполнения NATional.
Итак, я добавил следующее в /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-клиентом.