Я настроил сеть 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"
Машина B
Поскольку машина 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"; ?>
Машина R
# 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.
Поскольку вы обнаружили, что соединение между машиной A и машиной B на самом деле не является коммутируемым Ethernet и что оно может обрабатывать трафик только с использованием назначенных вам IP-адресов, вам необходимо найти другое решение.
Это может быть достигнуто за счет использования туннеля. Существуют различные типы туннелей, которые можно использовать. Один из них - использовать VPN, что может быть самым простым, поскольку машина A уже является сервером VPN. Затем вам просто нужно сделать машину B клиентом VPN, а затем добавить записи в таблицу маршрутизации для пересылки необходимых префиксов через это соединение VPN.
Другой вариант - использовать туннель GRE или просто IP поверх IP. Эти туннели и связанные с ними маршруты можно настроить статически, что даст им преимущество перед подходом VPN.
Отвечая на свой вопрос:
В качестве дальнейшего фона эти машины размещены на Linode. Оказывается, они используют статические карты в своих коммутаторах для маршрутизации трафика к определенным узлам в локальной сети. Поскольку исходные IP-адреса VPN не являются частью этих статических карт, трафик никуда не направлялся.
Так что это проблема, специфичная для Linode, но, надеюсь, это поможет другим узнать об этом.
На машине A у вас есть правило NAT, которое заставляет его изменять IP-адрес клиента перед маршрутизацией пакетов на машину B. Первое, что вам нужно сделать, это удалить это правило NAT, чтобы пакеты перенаправлялись на машину B без изменений.
Это изменение может привести к прекращению работы соединений, если таблица маршрутизации на компьютере B неполна. В этом случае происходит то, что пакеты доставляются правильно на машину B, но у нее нет маршрута для доставки ответов обратно. Это либо заставит его вообще не отвечать, либо отправит ответы в Интернет, а не на сервер VPN.
На машине B вы можете попробовать добавить маршрут с помощью следующей команды ip route add 10.200.200.0/24 via 192.168.0.10