Я так боровся з цим, ось ось ЦІЛЬНЕ рішення. Це тестується на 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
Тепер ми припустимо, що інтерфейс, який ви хочете використовувати для конкретної програми, має eth0
IP шлюз 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
і подав мені весь список змінних невизначених помилок!