У меня есть несколько хостов за маршрутизатором NAT, к которым я хочу получить доступ через VPN Wireguard. Я смог успешно настроить частную сеть, но есть еще кое-что, что меня сбивает с толку.
Я хочу, чтобы каждый коллега:
- получить доступ друг к другу (
172.9.9.*
) через VPN (черезwg0
) - получить доступ к любому другому хосту за пределами VPN (через
eth0
).
Вот схема сети и текущая конфигурация:
┌─────┐ ┌──────────┐ ┌─────┐
│ S ├────┤ Internet ├────┤ A │
└─────┘ └───┬──────┘ └─────┘
│
│
┌────┴─────┐
│ NAT DHCP │
┌──┤ Router ├──┐
│ └──────────┘ │
│ │
┌──┴──┐ ┌──┴──┐
│ X │ │ B │
└─────┘ └─────┘
S
является VPN-сервером и доступен в Интернете через статический IP;X
является «вычислительным сервером», он может иметь доступ к Интернету, но находится за NAT, а его IP-адрес является динамическим и заранее неизвестен;A
является «удалённым клиентом», который хочет подключиться кX
;B
является «локальным клиентом», который хочет подключитьсяX
и находится в той же локальной сети.
Я хочу этого A
и B
могу подключиться X
через S
, но все эти хосты должны использовать VPN только при взаимодействии друг с другом, а не при доступе в Интернет.
Так, например, A
можно напрямую пинговать google.com, но пинговать будет X
через S
.
После поиска и прочтения документации мне так и не стало ясно, можно ли это сделать без использования iptables
конфигурации Wireguard или можно ли это сделать, используя только ее.
Текущая конфигурация следующая:
## S wg0.conf
[Interface]
PrivateKey = S-private-key
Address = 172.9.9.1/24
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -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
ListenPort = 51820
[Peer]
# A
PublicKey = A-public-key
AllowedIPs = 172.9.9.100/32
[Peer]
# B
PublicKey = B-public-key
AllowedIPs = 172.9.9.101/32
[Peer]
# X
PublicKey = X-public-key
AllowedIPs = 172.9.9.10/32
# A wg0.conf
[Interface]
Address = 172.9.9.100/24
PrivateKey = A-private-key
DNS = 1.1.1.1
[Peer]
PublicKey = S-public-key
Endpoint = S-ip-address:51820
AllowedIPs = 0.0.0.0/0, ::/0
B
Конфигурация похожа на A
, но с IP 172.9.9.101
и другим закрытым ключом.
# X wg0.conf
[Interface]
Address = 172.9.9.10/24
PrivateKey = X-private-key
DNS = 1.1.1.1
[Peer]
PublicKey = S-public-key
Endpoint = S-ip-address:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25 # To keep the server reachable
Эта конфигурация работает, и все хосты могут получать доступ друг к другу через VPN, но я хочу, чтобы ТОЛЬКО трафик, направленный на хосты, 172.9.9.*
проходил через этот VPN. Остальной трафик должен маршрутизироваться шлюзом по умолчанию.
Меня озадачивает то, что если я изменю конфигурацию A
так, что
AllowedIPs = 172.9.9.0/24
тогда для A
пакеты маршрутизируются так, как и предполагалось (например, я могу curl ifconfig.me
и получить A
публичный IP-адрес ), но если я сделаю то же самое на X
, это не сработает, и пакеты, которые не будут доставлены, 172.9.9.0/24
не будут доставлены.
ПРАВКА №1
Забыл упомянуть, что мне бы также хотелось, чтобы при подключении к X
локальные клиенты, например, B
не отправляли пакеты за пределы локальной сети, так B -> Router -> X
и не B -> Router -> S -> Router -> X
.
решение1
Установите AllowedIPs
нужные вам IP-адреса.маршрут к/через одноранговый узел.
В обычной конфигурации «звезда» на концентраторе (S) вы настраиваете AllowedIPs
каждый одноранговый узел так, как вы это делали, маршрутизируя пакеты каждому одноранговому узлу, только если они используют IP-адрес WireGuard однорангового узла в качестве адреса назначения; а на ваших лучах (A, B и X) вы настраиваете AllowedIPs
CIDR вашей сети WireGuard ( 172.9.9.0/24
), маршрутизируя пакеты на концентратор, только если они используют IP-адреса WireGuard другого однорангового узла в качестве адреса назначения.
Таким образом, при обычной конфигурации вы получите доступ к A из B или X, используя IP-адрес WireGuard A 172.9.9.100
, к B из A или X — с помощью 172.9.9.101
, а к X из A или B — с помощью 172.9.9.10
.
Но если вы также хотите иметь возможность доступа к каждому серверу через IP-адрес, привязанный к физической сетевой карте сервера (например, eth0
), вам необходимо настроить AllowedIPs
как концентратор, так и серверы, чтобы включить эти IP-адреса.
Например, если eth0
адрес A — 198.51.100.65
, B — 192.168.0.66
, а X — 192.168.0.88
, вам следует настроить пиры в конфигурации WireGuard концентратора следующим образом:
## S wg0.conf
...
[Peer]
# A
PublicKey = A-public-key
AllowedIPs = 172.9.9.100/32
AllowedIPs = 198.51.100.65/32
[Peer]
# B
PublicKey = B-public-key
AllowedIPs = 172.9.9.101/32
AllowedIPs = 192.168.0.66/32
[Peer]
# X
PublicKey = X-public-key
AllowedIPs = 172.9.9.10/32
AllowedIPs = 192.168.0.88/32
И установите AllowedIPs
в конфигурации каждого из лучей следующее:
AllowedIPs = 172.9.9.0/24
AllowedIPs = 198.51.100.65/32
AllowedIPs = 192.168.0.66/32
AllowedIPs = 192.168.0.88/32
(Обратите внимание, что вы также можете указать все блоки в одной строке, AllowedIPs = 172.9.9.0/24, 198.51.100.65/32, 192.168.0.66/32, 192.168.0.88/32
если вам так удобнее.)
При текущей конфигурации, AllowedIPs = 0.0.0.0/0
когда вы работаете curl 198.51.100.65
с X, происходит следующее: X направляет пакеты, предназначенные для A (и всего остального), через свой туннель WireGuard в S, а затем S направляет эти пакеты в незашифрованном виде через Интернет в A (замаскированные под собственный публичный IP-адрес S); в ответ A отправляет незашифрованные пакеты через Интернет в S, которые S направляет через свой туннель WireGuard в X.
Если вы хотите убедиться, что Sникогда не делаетмаршрутизировать пакеты, проходящие через вашу сеть WireGuard, в Интернет, вы можете настроить правила iptables, чтобы предотвратить это; что-то вроде следующего, вероятно, поможет:
PostUp = iptables -A FORWARD -i wg0 -o wg0 -j ACCEPT; iptables -A FORWARD -i wg0 -o eth0 -j DROP; iptables -A FORWARD -i eth0 -o wg0 -j DROP
решение2
У меня возникла проблема с DNS: использование AllowedIPs = 172.9.9.0/24
позволяло мне пинговать 8.8.8.8
, но не google.com
.
Я решил включить интерфейс DNS в разрешенные IP-адреса, поэтому я получаю разрешение DNS через VPN, но трафик не проходит через VPN:
[Interface]
...
DNS = 1.1.1.1
[Peer]
...
AllowedIPs = 172.9.9.0/24, 1.1.1.1/32
Это не отвечает на второй вопрос, который у меня был: возможно ли сделать X
и B
общаться напрямую, не проходя через S
. Другой ответ помогает понять это.
РЕДАКТИРОВАТЬ
Похоже, это работает и при удалении DNS
поля, поэтому для обоих интерфейсов следует использовать один и тот же DNS-сервер.