Как перенаправить трафик с порта 80 на tun0 на порт 80 на eth0?

284
CaseJ

У меня есть веб-сервер, работающий на том же сервере, на котором я использую VPN. Я хотел бы иметь возможность доступа к веб-серверу, когда VPN включена или выключена. На FreeBSD это было довольно просто, на мой взгляд, PF намного проще в использовании, чем IPTables.

Я пытаюсь перенаправить трафик с порта 80/443 на tun0 на порт 80/44 на eth0 . Я читал справочные страницы для iptables, но мне не повезло.

0

1 ответ на вопрос

0
grawity

Название вопроса не совсем имеет смысл, как написано. Во-первых, трафик не направляется на TCP-порты или с них (лучше думать о них как о метках), а TCP-порты никак не связаны с интерфейсами. И ничто из этого не имеет отношения к возможности использовать веб-сервер, когда VPN включена и выключена.

Маршруты для пакета выбираются в первую очередь на основе его IP-адреса назначения путем поиска его в таблице маршрутизации. Обычная проблема - какой FreeBSD pf (и из того, что я слышал, Windows) имеет дополнительные встроенные механизмы, чтобы избежать, но Linux придерживается основ - состоит в том, что исходящие «ответные» пакеты маршрутизируются полностью независимо от входящих » оригинальные пакеты. Поэтому, если у вас есть два маршрута по умолчанию (как через шлюз локальной сети, так и через VPN), Linux всегда будет предпочитать один и тот же.

В этой ситуации обычно требуется маршрутизация, зависящая от источника, или политика маршрутизации. ОС должна знать, что исходящие «ответные» пакеты a) с данного IP-адреса источника или b), принадлежащие определенным установленным соединениям, должны использовать другой выбор маршрута.

По великой традиции «но Linux - это выбор», вы должны настроить это вручную, объединяя различные механизмы. Я предполагаю, что вам также нужен IPv4, и, следовательно, вы не можете полностью полагаться на механизм «поддерева» (который намного проще в использовании, но, к сожалению, только для IPv6, как реализовано).

Сначала убедитесь, что у вас есть две таблицы маршрутизации, каждая из которых имеет свой маршрут по умолчанию:

ip -4 route add default via 192.168.1.1 dev eth0 table 2 ip -4 route add default dev tun0 table 3 

(Ярлык: если предположить, что у «основной» таблицы уже есть маршрут по умолчанию через VPN, вам здесь не нужна таблица 3, вы можете просто использовать «главную» для этого вместо создания таблицы 3.)

Затем добавьте правила маршрутизации политики, чтобы просмотреть эту таблицу в зависимости от исходного IP-адреса:

ip -4 rule add pref 200 from 192.168.1.0/24 lookup 2 ip -4 rule add pref 300 from <vpnnet> lookup 3 

(Опять же, если «главная» таблица уже предпочитает маршрут по умолчанию через VPN, вы можете пропустить последнее правило. Оно включено здесь для полноты.)

Затем проверьте результат с помощью:

ip -4 route get 8.8.8.8 from 192.168.1.x ip -4 route get 8.8.8.8 from <vpnip> 

Похожие вопросы