Назад | Перейти на главную страницу

Интернет на базе EC2 Wireguard не работает

Резюме:

Я создал 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-клиентом.