Обойти VPN для трафика HTTP/HTTPS в Ubuntu?

Обойти VPN для трафика HTTP/HTTPS в Ubuntu?

У меня есть машина Ubuntu 14.04, весь исходящий трафик которой идет через VPN, и мне нужно убедиться, что трафик HTTP и HTTPS не проходит через VPN.
Я рассмотрел статическую маршрутизацию, но, похоже, она обрабатывает только уровень 3.
Как мне подойти к этой настройке? Спасибо.

решение1

Чтобы направить пакеты, предназначенные для определенных портов, через другой шлюз по умолчанию, вам необходимо пометить эти пакеты с помощью iptables, а затем направить их через другую таблицу маршрутизации.

Итак, сначала создайте новую таблицу маршрутизации, в которой в качестве шлюза по умолчанию будет ваш локальный шлюз (не ваш VPN-шлюз).

ip route add table 4 default via 192.168.0.1

Затем отметьте нужные вам пакеты в зависимости от портов назначения.

iptables -t mangle -A PREROUTING -p tcp --dport 80  -j MARK --set-mark 4
iptables -t mangle -A PREROUTING -p tcp --dport 443 -j MARK --set-mark 4

Наконец, направьте отмеченные пакеты через вновь созданную таблицу маршрутизации.

ip rule add fwmark 4 table 4

Я не тестировал приведенные выше команды, поэтому, возможно, их нужно немного доработать.

решение2

Один из способов сделать это — использовать ip ruleи iptables. Например, можно отметить трафик, который вы хотите направить

iptables -I OUTPUT -m tcp -p tcp -m multiport --dports 80,443 -j MARK --set-mark 0x0001

Затем вы создаете новую таблицу маршрутизации:

echo 101 r_http >> /etc/iproute2/rt_tables
ip route add default via 10.0.0.1 dev eth0 table r_http
ip route flush cache

Теперь, когда ваш HTTP- и HTTPS-трафик помечен, вы можете создать правило для применения этой новой таблицы маршрутизации.

ip rule fwmark 0x0001 table 101

Это должно сработать. В качестве упражнения для читателя — как сделать это постоянным и как создать маршрут по умолчанию :-)

решение3

Недавно я столкнулся с похожей ситуацией, что и OP. Благодаря ответам @Cha0s и @Pablo Martinez, мне удалось заставить это работать в моей ситуации.

Во-первых, как они оба сказали, у нас должны быть правила iptables, чтобы помечать те пакеты, которые не должны проходить через VPN. @Cha0s был прав, поместив правила в таблицу mangle. Согласно странице руководства iptables, вам нужно использовать таблицу mangle, чтобы сделать -j MARK target.

С другой стороны, @Pablo Martinez прав, помещая их в цепочку OUTPUT, хотя на странице руководства iptables говорится, что следует использовать -j MARK в цепочке PREROUTING. Эти пакеты генерируются на локальном хосте и выходят. Они не будут обрабатываться цепочкой PREROUTING. Но цепочка OUTPUT имеет смысл, и в ней также есть таблица mangle. Вот правило iptables, которое я использовал:

iptables -t mangle -I OUTPUT -p tcp -m multiport --dports 80,443 -j MARK --set-mark 0x101

Затем создайте новую таблицу маршрутизации и добавьте в нее маршрут, как описал @Pablo Martinez:

echo 101 r_http > /etc/iproute2/rt_tables.d/r_http.conf
ip route add table r_http default via 192.168.0.1 dev enp2s0
ip route flush cache

Замените 192.168.0.1 на IP вашего шлюза или маршрутизатора (не VPN), а enp2s0 на имя вашего сетевого интерфейса. Вы можете использовать "ip addr" для проверки имен интерфейсов.

Наконец, добавьте правило IP, чтобы позволить iproute2 проверять метку и использовать нашу новую таблицу маршрутизации.

ip rule add fwmark 0x101 table 101

Вы можете добавить правило iptables для регистрации пакетов, идущих на порты 80 и 443. Обратите внимание, что это правило добавляется в начало цепочки OUTPUT в таблице фильтров, поскольку таблица фильтров обрабатывается после таблицы mangle, и оно должно быть первым правилом, чтобы не быть проигнорированным.

iptables -I OUTPUT -p tcp -m multiport --dports 80,443 -j LOG --log-prefix "<HTTP/S>" --log-level info

Записи журнала должны отображаться в /var/log/kern.log (в системе Debian). Вы можете проверить, все ли из них содержат MARK=0x101. Не забудьте удалить правило для ведения журнала, как только соберете достаточно записей.

cat /var/log/kern.log | grep '<HTTP/S>' | less

Убедившись, что пакеты правильно маркированы, вы можете проверить, выберет ли iproute2 правильный маршрут для маркированных пакетов.

ip route get to 8.8.8.8
ip route get to 8.8.8.8 mark 0x101

Результат из первой строки должен сказать вам, что пакет пройдет через VPN-шлюз и туннельное устройство. Вторая строка должна показать, что пакет пройдет через ваш собственный шлюз и сетевое устройство.

ИСПОЛЬЗОВАННАЯ ЛИТЕРАТУРА:

решение4

Вы можете попробовать настроить браузеры на использование прокси-сервера.
- Вы можете указать прокси-сервер в DNS, но я не знаком с этой техникой. (Как работают DNS-запросы при использовании HTTP-прокси (или без него) в IE) - Это также можно сделать с помощью групповой политики (http://social.technet.microsoft.com/wiki/contents/articles/5156.how-to-force-proxy-settings-via-group-policy.aspx), и если соответствующие браузеры учитывают настройки Internet Explorer, вы можете легко развернуть его по всей сети.

Однако для работы вам понадобится HTTP-прокси-сервер (https://stackoverflow.com/questions/1994846/open-source-http-or-https-proxy)

Это не даст трафику веб-браузера проходить через VPN, но все остальное должно быть в порядке. Настройте свой прокси-сервер таким образом, чтобы никакой трафик не направлялся через VPN.

Связанный контент