Tak bardzo się z tym zmagałem, więc oto ZUPEŁNE rozwiązanie. Jest testowany na Ubuntu 15 i 16. Możesz go szczególnie używać z OpenVPN do kierowania niektórymi aplikacjami poza interfejs tunelu VPN.
Kompletne rozwiązanie „cgroup”
Jak to działa
- Jądro Linux umieści aplikację w grupie kontrolnej . Ruch sieciowy z aplikacji w tej grupie będzie identyfikowany na podstawie identyfikatora klasy na poziomie kontrolera sieci.
- iptables oznaczy ten ruch i zmusi go do wyjścia z właściwym adresem IP
- Trasa ip przetworzy zaznaczony ruch w innej tabeli routingu, z domyślną trasą do dowolnego adresu IP bramy.
Zautomatyzowany skrypt
Zrobiłem novpn.sh skrypt do automatyzacji zależności zainstalować i uruchomić. Testowane na Ubuntu.
Najpierw uruchom 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
Podręcznik HowTo
Najpierw zainstaluj obsługę i narzędzia cgroup:
sudo apt-get install cgroup-lite cgmanager cgroup-tools
Uruchom ponownie (może nie być konieczne).
Potrzebujesz iptables 1.6 .0+. Pobierz źródło wydania iptables 1.6.0 , rozpakuj je, a następnie uruchom to ( --disable-nftables
flaga pozwoli uniknąć błędów) ze źródła iptables:
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
Teraz prawdziwa konfiguracja. Zdefiniuj grupę kontrolną o nazwie novpn
. Procesy w tej grupie będą miały klasę 0x00110011
(11:11).
sudo su
mkdir /sys/fs/cgroup/net_cls/novpn
cd /sys/fs/cgroup/net_cls/novpn
echo 0x00110011 > net_cls.classid
Załóżmy, że interfejs, którego chcesz używać dla konkretnej aplikacji, ma eth0
adres IP bramy 10.0.0.1
. Zastąp je tym, czego naprawdę chcesz (uzyskaj informacje ip route
). Uruchom nadal jako 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
Na koniec uruchom aplikację na określonym interfejsie:
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
Lub jeśli chcesz przenieść już działający proces do grupy, cóż ... nie możesz! Wydaje się, że wynika to z funkcji NAT (maskarady): iptables -nvL -t nat
nie pasuje, gdy cgroup jest przełączana, ale iptables -nvL -t mangle
pasuje.
# 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
Kredyty: Żadna odpowiedź nie działała zgodnie z oczekiwaniami, ale ich kombinacja działała: artykuł chripell odpowiedz evolware Na routing procesu weź 2: używając grup dyskusyjnych, iptables i routingu polityki , Jak wykonać konkretny proces, NIE przechodząc przez połączenie OpenVPN? , Przełącznik Kill dla OpenVPN na podstawie iptables
cgexec -g net_cls:novpn apache2
i podałem całą listę zmiennych niezdefiniowanych błędów!