Там, где я работаю, у нас такой же пул подсети (192.168.1.x), что и у меня дома. Следовательно, я не могу добраться до адресов домашней подсети при подключении к серверу OpenVPN.
Какой лучший / самый простой способ разрешить этот конфликт? Я бы не хотел менять адреса пула DHCP моего домашнего маршрутизатора.
Да, и хороший урок здесь - никогда не использовать 192.168.0.0/24, 192.168.0.1/24 в корпоративной среде, точно так же, как никогда не использовать 802.1q VLAN ID 1.
Но бывают случаи, когда вы ничего не можете сделать. В таких случаях OpenVPN, начиная с версии 2.4, поддерживает внутреннюю трансляцию адресов без сохранения состояния (NAT), также известную как сетевое сопоставление. Из man openvpn
:
--client-nat snat|dnat network netmask alias
This pushable client option sets up a stateless one-to-one NAT rule on
packet addresses (not ports), and is useful in cases where routes or
ifconfig settings pushed to the client would create an IP numbering
conflict.
network/netmask (for example 192.168.0.0/255.255.0.0) defines the
local view of a resource from the client perspective, while
alias/netmask (for example 10.64.0.0/255.255.0.0) defines the remote
view from the server perspective.
Use snat (source NAT) for resources owned by the client and dnat
(destination NAT) for remote resources.
Set --verb 6 for debugging info showing the transformation of
src/dest addresses in packets.
Итак, вы добавляете строку в ваш клиентский файл .conf:
client-nat dnat 192.168.2.0 255.255.255.0 192.168.1.0
route 192.168.2.0 255.255.255.0
а затем, если на вашей стороне сервера есть система 192.168.1.5, клиент сможет получить к ней доступ как 192.168.2.5, разрешив конфликт адресов. И так далее.
Если у кого-то такая же проблема на компьютере с Linux: вы можете использовать соединение openvpn только для выбранных программ, использующих сетевые пространства имен!
Этот небольшой скрипт подключается к openvpn и открывает bash, использующий VPN. Все остальное на вашем компьютере не видит VPN (и поэтому может подключиться к вашей локальной сети). Каждая программа, запускаемая в этой оболочке, будет использовать VPN-соединение (и не может получить доступ к локальной сети).
Я предполагаю, что команда запуска openvpn находится в файле ./start_openvpn, а команда остановки - в ./stop_openvpn:
#!/bin/bash
IP=`hostname -I | cut -d' ' -f1`
ip netns add myvpn
ip link add veth0 type veth peer name veth1
ip link set veth1 netns myvpn
ip netns exec myvpn ifconfig veth1 192.168.99.1/24 up
ifconfig veth0 192.168.99.2/24 up
ip netns exec myvpn route add default gw 192.168.99.2
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.99.0/24 -j SNAT --to-source $IP
ip netns exec myvpn ./start_openvpn &
ip netns exec myvpn sudo -u myunixuser /bin/bash
./stop_openvpn
iptables -t nat -D POSTROUTING -o eth0 -s 192.168.99.0/24 -j SNAT --to-source $IP
ifconfig veth0 down
ip netns exec myvpn ifconfig veth1 down
ip link delete veth0
ip netns delete myvpn
myunixuser - это локальный пользователь Linux, с которым вы обычно работаете. Этот сценарий должен вызываться от имени пользователя root.
По окончании работы закрыть ракушку выход.
Если вам нужна вторая VPN-оболочка, просто позвоните
ip netns exec myvpen /bin/bash
перед вы вышли из первой оболочки.
ИМО, это плохой выбор для подсети openvpn, поскольку она используется во многих домашних маршрутизаторах. Однако, если вы не можете изменить конфигурацию openvpn, вам придется изменить свою домашнюю сеть. Поскольку это DHCP, он не должен вызывать особых проблем - просто измените его на 192.168.42.0/24 и переподключите свои устройства.
РЕДАКТИРОВАТЬ:
Директива "push" добавит сеть, которая находится за сервером OpenVPN (ваша рабочая сеть), в таблицу маршрутизации на клиенте (ваш домашний компьютер). Директива push должна соответствовать рабочей подсети и должна не быть такой же, как и в домашней подсети.