Рейтинг:1

Назначение публичного IP клиенту OpenVPN. iptables, маршрут или что использовать для этого?

флаг jp

У меня есть сервер с Pi-Hole, настроенный на блокировку рекламы и трекеров. Клиенты подключаются через OpenVPN и получают адреса 10.8.0.0/24. OpenVPN только отправляет DNS клиенту, а трафик направляется через локальный шлюз, но, конечно, каждый клиент в VPN может связаться с любым другим клиентом через свои адреса 10.8.0.x.

Я заказал второй ipv4, который я хотел бы использовать специально для клиента 10.8.0.4.Я хочу иметь доступ к общедоступному IP-адресу и предоставлять этому клиенту доступ непосредственно к Интернету, чтобы использовать локально размещенный Nextcloud.

Я искал Server Fault и нашел несколько похожих проблем. Я пытался добавить правила POSTROUTING и PREROUTING в iptables, но это не сработало. В настоящее время ipv4 временно добавляется к eth0 через 'ip addr add xx.xx.xx.xx. dev eth0', а не tun0 (это правильно?). Сервер OpenVPN настроен точно так, как указано в документации Pi-Hole (https://docs.pi-hole.net/guides/vpn/openvpn/only-dns-через-vpn/). net.ipv4.ip_forward включен.

Мне вообще нужно использовать iptables? Возможно ли или рекомендуется добавить публичный IP-адрес в маршрут или что-то в этом роде? Извините, если вопрос звучит глупо. Я новичок в настройке OpenVPN и Route/iptables.

Это первое, что я попробовал: Перенаправить весь входящий трафик со вторичного общедоступного IP-адреса на внутренний IP-адрес с помощью iptables.

Мои текущие правила iptables:

# Сгенерировано xtables-save v1.8.2, четверг, 12 декабря, 14:37:26 2019 г.
*натуральный
: ПРЕДВАРИТЕЛЬНОЕ ПРИНЯТИЕ [329:28209]
:ВВОД ПРИНЯТ [281:25114]
:ОТПРАВКА ПРИНЯТИЯ [17:1423]
: ВЫВОД ПРИНЯТ [245:22126]
-A РАЗМЕЩЕНИЕ -s 10.8.0.0/24 ! -d 10.8.0.0/24 -j SNAT --to-source xx.xx.xx.xx
-A ПОСТРОЙКА -o eth0 -j МАСКАРАД
СОВЕРШИТЬ
# Завершено в четверг, 12 декабря, 14:37:26 2019 г.
# Сгенерировано xtables-save v1.8.2, четверг, 12 декабря, 14:37:26 2019 г.
*фильтр
:ВХОД ПАДЕНИЕ [0:0]
:ВПЕРЕД ПРИНЯТЬ [0:0]
: ВЫВОД ПРИНЯТЬ [0:0]
-A ВВОД -i lo -j ПРИНЯТЬ
-A ВВОД -m состояние --state СВЯЗАННО, УСТАНОВЛЕНО -j ПРИНЯТЬ
-A ВВОД -i tun0 -j ПРИНЯТЬ
-A INPUT -i tun0 -p tcp -m tcp --dport 53 -j ПРИНЯТЬ
-A INPUT -i tun0 -p udp -m udp --dport 53 -j ПРИНЯТЬ
-A INPUT -i tun0 -p tcp -m tcp --dport 80 -j ПРИНЯТЬ
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -j ПРИНЯТЬ
-A INPUT -i tun0 -p tcp -m tcp --dport 443 -j ПРИНЯТЬ
-A INPUT -i eth0 -p tcp -m tcp --dport 443 -j ПРИНЯТЬ
-A ВХОД -p tcp -m tcp --dport 2202 -j ПРИНЯТЬ
-A ВХОД -p tcp -m tcp --dport 1194 -j ПРИНЯТЬ
-A ВВОД -p udp -m udp --dport 1194 -j ПРИНЯТЬ
-A INPUT -p udp -m udp --dport 80 -j REJECT --reject-with icmp-port-unreachable
-A INPUT -p udp -m udp --dport 443 -j REJECT --reject-with icmp-port-unreachable
СОВЕРШИТЬ
# Завершено в четверг, 12 декабря, 14:37:26 2019 г.

Правила NAT iptables:

Цепь PREROUTING (политика ПРИНЯТЬ)
целевая защита выбор источника назначения

Сеть INPUT (политика ACCEPT)
целевая защита выбор источника назначения

Сеть POSTROUTING (правило ПРИНЯТЬ)
целевая защита выбор источника назначения
SNAT все -- 10.8.0.0/24 !10.8.0.0/24 до:xx.xx.xx.xx
МАСКАРАДируйте все -- где угодно и где угодно

Цепочка OUTPUT (политика ACCEPT)
целевая защита выбор источника назначения

После комментария от NiKiZe я временно добавил публичный IP-адрес через

IP-адрес добавить xx.xx.xx.xx dev eth0

и ввел оба правила (для уточнения: я экспортировал рабочий набор правил через iptables-save, отредактировал обе команды и восстановил его через iptables-restore)

-A PREROUTING -d xx.xx.xx.xx -j DNAT --to-destination 10.8.0.4
-A ОТПРАВКА -s 10.8.0.4 ! -d 10.8.0.4 -j SNAT --к источнику xx.xx.xx.xx

Затем я открыл несколько терминальных сеансов и отслеживал веб-трафик с помощью tcpdump на сервере OpenVPN и на моем локальном сервере, подтверждая, что входящий трафик с eth0 на pi.hole.http правильно направляется на мой локальный сервер server.vpn.http. Но время ответа истекает...

Мои текущие правила nat:

user@dns:~# iptables -t nat -vL --номера строк
Цепочка PREROUTING (политика ACCEPT 1 пакета, 52 байта)
num pkts bytes target prot opt ​​in out source target
1 0 0 DNAT все -- любое любое любое место pi.hole to:10.8.0.4

Цепочка INPUT (политика ACCEPT 0 пакетов, 0 байтов)
num pkts bytes target prot opt ​​in out source target

Цепочка POSTROUTING (политика ACCEPT 1 пакета, 60 байт)
num pkts bytes target prot opt ​​in out source target
1 0 0 SNAT all -- any any server.vpn !server.vpn to:xx.xx.xx.xx <- временно добавленный IP-адрес
2 0 0 SNAT all -- any any 10.8.0.0/24 !10.8.0.0/24 to:xx.xx.xx.xx <- основной IP-адрес, введенный статически
3 0 0 MASQUERADE all -- любой eth0 в любом месте в любом месте

Цепочка OUTPUT (политика ACCEPT 1 пакета, 60 байт)
num pkts bytes target prot opt ​​in out source target

Другое редактирование: Когда я добавляю «src server.vpn» в tcpdump, я вижу, что с локального сервера нет исходящего трафика. Таким образом, должна быть проблема либо с конфигурацией локального сервера, либо с правилом постмаршрутизации. Я прав?

После смены маршрута на server.vpn соединение работает. 'маршрут -n' Раньше:

Таблица IP-маршрутизации ядра
Шлюз назначения Флаги Генмаски Метрика Ссылка Использование Iface
0.0.0.0 192.168.178.1 0.0.0.0 UG 0 0 0 eth0
10.8.0.0 0.0.0.0 255.255.255.0 U 0 0 0 tun0
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth3
169.254.160.0 169.254.160.1 255.255.248.0 УГ 0 0 0 tun1000
169.254.160.0 0.0.0.0 255.255.248.0 U 0 0 0 tun1000
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 докер0
192.168.178.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0

И после:

Таблица IP-маршрутизации ядра
Шлюз назначения Флаги Генмаски Метрика Ссылка Использование Iface
0.0.0.0 10.8.0.1 0.0.0.0 UG 0 0 0 tun0
10.8.0.0 0.0.0.0 255.255.255.0 U 0 0 0 tun0
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth3
169.254.160.0 169.254.160.1 255.255.248.0 УГ 0 0 0 tun1000
169.254.160.0 0.0.0.0 255.255.248.0 U 0 0 0 tun1000
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 докер0
192.168.178.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0

Если я правильно понимаю, это означает, что КАЖДОЕ сетевое соединение, даже инициированное server.vpn, маршрутизируется через VPN. Это не ожидаемое поведение. Я просто хочу, чтобы сервер был доступен локально и использовал обычный, локально маршрутизируемый Интернет, а также отвечал на соединения, маршрутизируемые с общедоступного IP-адреса на сервере OpenVPN.

флаг in
Общедоступный IP-адрес необходимо добавить к тому же интерфейсу, где находится шлюз для этого адреса, поэтому, скорее всего, ваш интерфейс internet/eth0 (альтернативой может быть получение диапазона, который маршрутизируется через ваш общедоступный IP-адрес). «Первое, что я try" - это то, что вам нужно сделать, но, вероятно, на этом пути будет больше ошибок. tcpdump — отличный инструмент для отслеживания трафика и попытки понять поток. счетчики в iptables — еще один часто упускаемый инструмент для диагностики проблем.
Thomson avatar
флаг jp
Спасибо за подсказки. Я проверил интерфейс tun0 на локальном сервере и на сервере OpenVPN. После добавления правил предварительной и последующей маршрутизации я могу видеть через tcpdump трафик, поступающий на локальный сервер, но ответ не возвращается. Время истекло. Означает ли это, что мое правило постмаршрутизации неверно?
флаг in
Вам нужно будет направить трафик в обе стороны. с помощью tcpdump проверьте, откуда приходит трафик, и убедитесь, что у вас есть маршрут, по которому этот трафик возвращается.
Thomson avatar
флаг jp
Я думал, что это покрывается правилом POSTROUTING на сервере OpenVPN. Но очевидно, что server.vpn не отправляет ответ на http-ответ.Я снова проверил с помощью tcpdump и обнаружил, что ответ, поступающий от сервера OpenVPN на tun0, отвечает на eth0 и, следовательно, отбрасывается получателем. Нужно ли мне также добавлять правило статической маршрутизации в server.vpn? iptables там есть, но какое правило там нужно? Как убедиться, что трафик, входящий от tun0, отвечает без изменения шлюза по умолчанию?
флаг in
Да, это, вероятно, заканчивается настройкой «многодомных», что означает, что общий способ решить эту проблему — использовать «правило ip» и «маршрут ip», например. https://serverfault.com/a/736047/187998 (вам не нужно создавать имена для таблиц, вместо этого вы можете просто использовать числа)
Thomson avatar
флаг jp
Спасибо за помощь! Мне удалось заставить его работать, установив сервер OpenVPN в качестве шлюза, но пока не удалось настроить «многодомную» настройку. В настоящее время я больше читаю о настройке OpenVPN, iptables и маршрутизации в целом. Я надеюсь, что это сработает.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.