Назад | Перейти на главную страницу

Как я могу добиться маршрутизации клиентов OpenVPN без NAT на Linode

Я настроил сеть 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