я ооочень боролся с этим, так что вот полное решение. Он протестирован на Ubuntu 15 и 16. Вы можете особенно использовать его с OpenVPN для маршрутизации определенных приложений за пределами интерфейса VPN-туннеля.
полное решение "cgroup"
как это работает?
- ядро Linux поместит приложение в группа контроля. Сетевой трафик от приложений в этой группе будет идентифицироваться по идентификатору класса на сетевом контроллере уровень.
- iptables пометит этот трафик и заставит его выйти с правильным IP
- ip route будет обрабатывать отмеченный трафик в другой таблице маршрутизации с маршрутом по умолчанию на любой IP-адрес шлюза, который вы хотите.
автоматизированный скрипт
я сделалnovpn.sh скрипт для автоматизации установки и запуска зависимостей. Проверена на Ubuntu.
сначала запустите VPN.
wget https://gist.githubusercontent.com/kriswebdev/a8d291936fe4299fb17d3744497b1170/raw/cf8b37fbe6c3f50a0be825eb77cafa3e0134946f/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
руководство HowTo
Сначала установите поддержку и инструменты cgroup:
sudo apt-get install cgroup-lite cgmanager cgroup-tools
перезагрузка (может не потребоваться).
вам нужны iptables 1.6.0+. получить iptables 1.6.0 релиз Источник, извлеките его, затем запустите это (--disable-nftables
флаг позволит избежать ошибок) из iptables source dir:
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
теперь, реальная конфигурация. Определите группу управления с именем 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
). Еще как 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
cgexec -g net_cls:novpn firefox
или, если вы хотите переместить уже запущенный процесс в cgroup, хорошо... вы не можете! это, кажется, связано с Функция NAT (маскарад): iptables -nvL -t nat
не совпадает при переключении cgroup, но 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 ответ evolware статья на процесс маршрутизации взять 2: с помощью контрольных групп, iptables и маршрутизации политики,как сделать так, чтобы конкретный процесс не проходил через соединение OpenVPN?,Kill switch для OpenVPN на основе iptables