Я так боровся з цим, ось ось ЦІЛЬНЕ рішення. Це тестується на 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. Процеси в цій групі матимуть клас 0x00110011(11:11).
sudo su
mkdir /sys/fs/cgroup/net_cls/novpn
cd /sys/fs/cgroup/net_cls/novpn
echo 0x00110011 > net_cls.classid
Тепер ми припустимо, що інтерфейс, який ви хочете використовувати для конкретної програми, має eth0IP шлюз 10.0.0.1. Замініть їх тим, що ви дійсно хочете (отримайте інформацію від ip route). Запустити ще як корінь:
# 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
Або якщо ви хочете перемістити вже запущений процес у групу, ну ... ви не можете! Це, мабуть, пов’язано з функцією 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 відповісти evolware статті за процес маршрутизації беруть 2: з допомогою контрольних груп, IPTables і політики маршрутизації , Як зробити процес конкретного НЕ відбувається за допомогою бездротової технології OpenVPN? , Kill перемикач для OpenVPN на основі iptables
cgexec -g net_cls:novpn apache2і подав мені весь список змінних невизначених помилок!