У меня есть Linux-машина, которая направляет весь свой интернет-трафик через соединение openVPN. Он был явно настроен для работы таким образом.
Однако на машине есть несколько приложений, которые не должны использовать VPN-соединение (tun +) и использовать открытое соединение (eth0).
Поскольку это не маршрутизация, основанная на IP-адресе назначения, я первым делом создал локальный прокси socks5, который приложения должны использовать, чтобы избежать канала openVPN. Однако мои попытки сделать это с помощью ssh -D или другого sw) потерпели неудачу (вероятно, это моя вина), и теперь мне интересно, есть ли для этого другое и лучшее решение.
Я недавно опубликовал другой ответ это касается этой конкретной ситуации, но вопросы не повторяются, поскольку этот вопрос более специфичен для OpenVPN. Поскольку некоторые люди предпочитают отрицать ссылки на ответы, а не помещать ответ прямо в вопрос, я копирую / вставляю его здесь.
Я ооочень боролся с этим, поэтому вот ПОЛНОЕ решение. Он протестирован на Ubuntu с 15 по 19.10. Вы можете особенно использовать его с OpenVPN для маршрутизации определенных приложений за пределы интерфейса VPN-туннеля.
Я сделал novpn.sh скрипт для автоматизации установки и запуска зависимостей. Проверено на Ubuntu с 15 по 19.10.
Сначала запустите свой VPN.
wget https://gist.githubusercontent.com/kriswebdev/a8d291936fe4299fb17d3744497b1170/raw/novpn.sh
# If you don't use eth0, edit the script setting.
sudo chmod +x novpn.sh
./novpn.sh traceroute www.google.com
./novpn.sh --help
Сначала установите поддержку и инструменты cgroup:
sudo apt-get install cgroup-lite cgroup-tools
Вам нужен iptables 1.6.0+. Получить исходный код выпуска iptables 1.6.0, извлеките его, затем запустите это (--disable-nftables
flag позволит избежать ошибок) из исходного каталога iptables:
iptables --version
sudo apt-get install dh-autoreconf bison flex
./configure --prefix=/usr \
--sbindir=/sbin \
--disable-nftables \
--enable-libipq \
--with-xtlibdir=/lib/xtables
make
sudo make install
iptables --version
Теперь настоящий config. Определите контрольную группу с именем novpn
. Процессы в этой cgroup будут иметь classid 0x00110011
(11:11).
sudo su
mkdir /sys/fs/cgroup/net_cls/novpn
cd /sys/fs/cgroup/net_cls/novpn
echo 0x00110011 > net_cls.classid
Теперь предположим, что реальный интерфейс, который вы хотите использовать для конкретного приложения, - это eth0
с IP-адресом шлюза 10.0.0.1
. ЗАМЕНИТЬ это то, что вы действительно хотите (получите информацию от ip route
), особенно в новых версиях Ubuntu, где интерфейсы имеют странные имена. Запустить еще как root:
# Add mark 11 on packets of classid 0x00110011
iptables -t mangle -A OUTPUT -m cgroup --cgroup 0x00110011 -j MARK --set-mark 11
# Force the packets to exit through eth0 with NAT
iptables -t nat -A POSTROUTING -m cgroup --cgroup 0x00110011 -o eth0 -j MASQUERADE
# Define a new "novpn" routing table
# DO THIS JUST ONCE !
echo 11 novpn >> /etc/iproute2/rt_tables
# Packets with mark 11 will use novpn
ip rule add fwmark 11 table novpn
# Novpn has a default gateway to the interface you want to use
ip route add default via 10.0.0.1 table novpn
# Unset reverse path filtering for all interfaces, or at least for "eth0" and "all"
for i in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 > $i; done
Наконец, запустите приложение в определенном интерфейсе:
exit
sudo cgcreate -t $USER:$USER -a $USER:$USER -g net_cls:novpn
cgexec -g net_cls:novpn traceroute www.google.com
# Close all Firefox windows first
killall firefox; cgexec -g net_cls:novpn firefox
Или, если вы хотите переместить уже запущенный процесс в cgroup, ну ... ты не можешь! Похоже, это связано с функцией NAT (маскарад): iptables -nvL -t nat
не совпадает при смене контрольной группы, но iptables -nvL -t mangle
совпадает.
# Get PID of the process (we'll then suppose it's 1234)
pidof firefox
# Add to cgroup - THIS DOESN'T WORK! Silently fails to produce the final result.
sudo echo 1234 > /sys/fs/cgroup/net_cls/novpn/tasks
# Remove - but this works...
sudo echo 1234 > /sys/fs/cgroup/net_cls
Кредиты: ни один ответ не сработал, как ожидалось, но их сочетание сработало: chripell answer evolware article Маршрутизация на процесс занимает 2 места: использование cgroups, iptables и маршрутизации политик, Как сделать так, чтобы конкретный процесс НЕ проходил через соединение OpenVPN?, Kill switch для OpenVPN на основе iptables