У меня есть машина Ubuntu 14.04, весь исходящий трафик которой проходит через VPN, и я должен убедиться, что трафик HTTP и HTTPS не проходит через VPN.
Я изучал статическую маршрутизацию, но, похоже, она обрабатывает только уровень 3.
Как мне подойти к этой настройке? Спасибо.
Чтобы маршрутизировать пакеты, предназначенные для определенных портов, через другой шлюз по умолчанию, вам необходимо пометить эти пакеты с помощью 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
Я не тестировал приведенные выше команды, поэтому может потребоваться небольшая настройка.
Один из способов сделать это - использовать 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
Это должно сработать. В качестве упражнения для читателя, как сделать его постоянным и как создать маршрут по умолчанию :-)
Недавно я столкнулся с подобной ситуацией, как у ОП. Благодаря ответам @ Cha0s и @Pablo Martinez мне удалось заставить его работать в моей ситуации.
Во-первых, как они оба сказали, у нас должны быть правила iptables, чтобы отмечать те пакеты, которые не должны проходить через VPN. @ Cha0s был прав, поместив правила в таблицу исправлений. Согласно странице руководства iptables, вы должны использовать таблицу mangle для выполнения -j MARK target.
С другой стороны, @Pablo Martinez правильно помещает их в цепочку OUTPUT, хотя на странице руководства iptables говорится, что вы должны использовать -j MARK в цепочке PREROUTING. Эти пакеты генерируются на локальном хосте и выходят. Они не будут обрабатываться цепочкой PREROUTING. Но цепочка OUTPUT имеет смысл, и в ней также есть таблица искажений. Итак, вот правило 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 и туннельное устройство. Вторая строка должна показать, что пакет пройдет через ваш собственный шлюз и сетевое устройство.
ССЫЛКИ:
Вы можете попробовать настроить свои браузеры на использование прокси.
- Вы можете указать прокси в 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.