Моя цель - создать VPN, чтобы
Вот конфиг сервера:
[Interface]
Address = 10.0.0.1/24
ListenPort = 5555
PrivateKey = xxxxx
[Peer]
PublicKey = xxxxx
AllowedIPs = 0.0.0.0/0
И конфигурация клиента:
[Interface]
PrivateKey = xxxxx
ListenPort = 5555
Address = 10.0.0.2/32
DNS = 8.8.8.8
[Peer]
PublicKey = xxxxx
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = <server ip>:5555
Но когда я пытаюсь загрузить конфигурацию сервера wg setconf wg0 /etc/wireguard/wg0.conf
Я получаю такую ошибку:
Line unrecognized: `Address=10.0.0.1/24'
Configuration parsing error
Таким образом я прокомментировал эту строку. Но это, вероятно, заставляет WG выбирать случайные IP-адреса для сервера и клиентов.
Чтобы WireGuard заработал, я также выполнил следующие команды:
ip link add dev wg0 type wireguard
ip address add dev wg0 10.0.0.1/24
ip link set up dev wg0
После всего, wg
команды обеспечивают следующий вывод:
interface: wg0
public key: xxxxx
private key: (hidden)
listening port: 5555
peer: xxxxx
endpoint: <my IP address>:6228
allowed ips: 0.0.0.0/0
latest handshake: 2 minutes, 11 seconds ago
transfer: 26.02 KiB received, 248 B sent
С клиента (MacOS с графическим интерфейсом WireGuard) я могу подключиться, но:
10.0.0.1
.Итак, как я могу достичь своих целей? А что не так с моими конфигами ??
PS. Ни то, ни другое iptables
на сервере не установлены брандмауэры, так что это не может быть проблемой. Также я указал net.ipv4.ip_forward=1
& net.ipv6.conf.all.forwarding=1
в /etc/sysctl.conf
.
Версии программного обеспечения. ОС есть Ubuntu 18.04.4 LTS
, Ядро: 4.15.0-20-generic
, РГ: wireguard-tools v1.0.20200206
.
Я удалил Address
из конфигурации сервера и установите AllowedIPs = 10.0.0.2/24
в клиентском я наконец-то подключился к NginX сервера от клиента через частный IP-адрес и смог выйти в Интернет (трафик идет за пределы VPN).
Но если я установил AllowedIPs = 0.0.0.0/0
на клиенте у меня нет доступа в Интернет, хотя я все еще могу подключиться к серверу по IP-адресу VPN 10.0.0.1. Я пытался решить это с помощью ifconfig wg0 broadcast/multicast
, но безуспешно. Теперь команда ip address show wg0
обеспечивает следующий вывод:
4: wg0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
link/none
inet 10.10.10.1/24 scope global wg0
valid_lft forever preferred_lft forever
inet 10.10.10.1 peer 10.10.10.2/32 scope global wg0
valid_lft forever preferred_lft forever
Кроме того, у меня нет доступа к одному клиенту с другого, думаю, это та же проблема. Как я могу исправить конфигурации WireGuard или сетевые настройки сервера, чтобы решить проблему?
Использовать wg-quick
вместо того wg
с файлом конфигурации, и он будет работать ;-). Вы написали, что используете напрямую wg
команда, которая использует другой формат файла конфигурации, что приводит к ошибке:
Line unrecognized: `Address=10.0.0.1/24,fd86:ea04:1115::1/64'
Configuration parsing error
Что вы также можете проверить:
Трещина то Адрес строка для правильной конфигурации на сервере:
[Interface]
Address = 10.0.0.1/24
Address = fd86:ea04:1115::1/64
ListenPort = 5555
PrivateKey = xxxxx
[Peer]
PublicKey = xxxxx
AllowedIPs = 0.0.0.0/0
на стороне клиента также должно быть Конечная точка чтобы знать, где подключиться, а также сетевая маска будет соответствовать (быть одинаковой) со стороной сервера, поэтому в этом случае / 24:
[Interface]
PrivateKey = xxxxx
ListenPort = 5555
Address = 10.0.0.2/24
DNS = 8.8.8.8
[Peer]
PublicKey = xxxxx
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = <remote>:<ip>
Вы можете попробовать оба адреса в одной строке, но обязательно маска / 24 должно быть одинаковым с обеих сторон.
Ну за несколько дней, ночей и убитых серверов я решил все проблемы сам :)
Во-первых, хочу отметить, что wg
и wg-quick
утилиты по-разному обрабатывают файлы конфигурации. Так что мой wg setconf wg0 /etc/wireguard/wg0.conf
не работал ожидаемым образом, и я предполагаю, что он использует старый формат конфигурации. Сейчас использую wg-quick
через systemctl
.
Во-вторых, мое добавление net.ipv4.ip_forward=1
в файл /etc/sysctl.conf
не сработало, хотя я звонил systemctl daemon-reload ; systemctl restart systemd-networkd
. Мне пришлось связать конфиг с ядром, используя sysctl -p /etc/sysctl.conf
команда. Это позволяет одноранговым узлам общаться друг с другом и выходить в Интернет через VPN.
Приятно отметить, что для всех Address
отмечает, что лучше использовать маску подсети из 32 бита, что означает точный IP-адрес, а не диапазон.
Кроме того, я настроил собственный DNS с BIND9 для создания собственного домена в сети. И NginX с проверкой IP-адреса отправителя, чтобы ограничить доступ только для клиентов VPN.
На данный момент мои конфиги следующие.
Сервер
[Interface]
Address = 10.0.0.1/32
ListenPort = 5555
PrivateKey = ___some_private_key___
# The following is needed only if you have `ufw` installed
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; ip6tables -A FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; ip6tables -D FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
[Peer]
PublicKey = ___some_public_key___
AllowedIPs = 10.0.0.1/32
Клиент
[Interface]
PrivateKey = ___some_private_key___
ListenPort = 5555
Address = 10.0.0.1/32
[Peer]
PublicKey = ___some_public_key___
AllowedIPs = 10.0.0.0/24
Endpoint = ___some_ip_address__:5555