
Я настроил сеть OpenVPN, и она работает правильно в том смысле, что я могу получить доступ к внутренним/LAN машинам с удаленного клиента. Однако моя проблема в том, что весь трафик с удаленных машин отображается для LAN машин так, как будто он исходит с сервера OpenVPN, а не с клиентской машины.
Чтобы лучше объяснить, рассмотрим топологию моей сети:
Машина R подключилась к серверу OpenVPN на машине A и получила IP-адрес 10.200.200.5.
Затем машина R делает запрос к Apache, запущенному на машине B. Запрос приходит правильно, и я получаю ответ. Проблема в том, что машина B видит запрос, приходящий с 192.168.0.10 (IP машины A), а не с 10.200.200.5.
Я бы хотел последнего.
Моя текущая настройка
Машина А
Это фрагмент соответствующих правил iptables:
*nat
:PREROUTING ACCEPT [18:1080]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -o eth0 -j MASQUERADE
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
// snip
# accept incoming VPN connections
-A INPUT -p udp -m udp --dport 1194 -j ACCEPT
# forward VPN traffic
-A FORWARD -s 10.200.200.0/25 -d 192.168.128.0/17 -i tun0 -j ACCEPT
-A FORWARD -i tun+ -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth0 -o tun+ -m state --state RELATED,ESTABLISHED -j ACCEPT
Я также включил ip_forwarding:
echo 1 > /proc/sys/net/ipv4/ip_forward
.. и внес соответствующие изменения в /etc/sysctl.conf, чтобы сделать его постоянным.
В конфигурации OpenVPN у меня есть:
server 10.200.200.0 255.255.255.128
push "route 192.168.0.0 255.255.255.0"
Машина Б
Поскольку машина A не является шлюзом машины B, я вручную добавил маршрут на машине B следующим образом:
ip route add 10.200.200.0/25 via 192.168.0.10 dev eth0
Чтобы проверить, какой IP маршрутизируется, я создал небольшой PHP-скрипт под названиемshowip.php:
<?php echo "Your IP is: ", $_SERVER['REMOTE_ADDR'], "\n"; ?>
Машина Р
# wget -q -O - http://192.168.0.11/showip.php
Your IP is: 192.168.0.10
Как мне сделать так, чтобы он отображал 10.200.200.5?
Обновлять
Для ясности: в моем конкретном случае машина A имеет одну сетевую карту (eth0), которая обслуживает как локальную сеть (LAN), так и глобальную сеть (WAN).
решение1
Отвечая на свой собственный вопрос:
В качестве дополнительной информации, эти машины размещены на Linode. Оказывается, они используют статические карты в своих коммутаторах для маршрутизации трафика на определенные узлы в локальной сети. Поскольку исходные IP-адреса VPN не являются частью этих статических карт, трафик никуда не направлялся.
Так что это, оказывается, проблема, специфичная для Linode, но, надеюсь, это поможет другим узнать об этом.
решение2
Поскольку вы обнаружили, что соединение между машиной A и машиной B на самом деле не является коммутируемым Ethernet и что оно может обрабатывать трафик только с использованием назначенных вам IP-адресов, вам необходимо найти другое решение.
Этого можно достичь с помощью туннеля. Существуют различные виды туннелей, которые можно использовать. Один из них — использовать VPN, что может быть самым простым, поскольку машина A уже является VPN-сервером. Затем вам просто нужно сделать машину B VPN-клиентом, а затем добавить записи в таблицу маршрутизации для пересылки необходимых префиксов через это VPN-подключение.
Другой вариант — использовать туннель GRE или просто IP поверх IP. Эти туннели и связанные с ними маршруты можно настроить статически, что даст им преимущество перед подходом VPN.
решение3
На машине A есть правило NAT, которое заставляет ее менять клиентский IP-адрес перед маршрутизацией пакетов на машину B. Первое, что вам нужно сделать, это удалить это правило NAT, чтобы пакеты пересылались на машину B без изменений.
Это изменение может привести к тому, что соединения перестанут работать, если таблица маршрутизации на Машине B неполна. В этом случае пакеты доставляются Машине B правильно, но у нее нет маршрута для доставки ответов обратно. Это приведет либо к тому, что она вообще не будет отвечать, либо отправит ответы в Интернет вместо VPN-сервера.
На машине B вы можете попробовать добавить маршрут с помощью следующей команды:ip route add 10.200.200.0/24 via 192.168.0.10