Saya telah sooo berjuang dengan ini jadi inilah solusi SELESAI. Ini diuji pada Ubuntu 15 & 16. Anda terutama dapat menggunakannya dengan OpenVPN untuk merutekan aplikasi tertentu di luar antarmuka terowongan VPN.
Solusi "cgroup" lengkap
Bagaimana cara kerjanya?
- Kernel Linux akan menempatkan aplikasi ke dalam kelompok kontrol . Lalu lintas jaringan dari aplikasi dalam cgroup ini akan diidentifikasi oleh ID kelas mereka di tingkat pengontrol jaringan.
- iptables akan menandai lalu lintas ini dan memaksanya untuk keluar dengan IP yang tepat
- ip route akan memproses traffic yang ditandai dalam tabel routing yang berbeda, dengan rute default ke gateway IP apa pun yang Anda inginkan.
Script otomatis
Saya telah membuat skrip novpn.sh untuk mengotomatiskan instalasi & jalankan dependensi. Diuji di Ubuntu.
Mulai VPN Anda terlebih dahulu.
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
Cara Manual
Pertama, instal dukungan dan alat cgroup:
sudo apt-get install cgroup-lite cgmanager cgroup-tools
Reboot (mungkin tidak perlu).
Anda membutuhkan iptables 1.6 .0+. Dapatkan sumber rilis iptables 1.6.0 , ekstrak, lalu jalankan ini ( --disable-nftables
flag akan menghindari kesalahan) dari dir sumber 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
Sekarang, konfigurasi sebenarnya. Tentukan grup kontrol yang bernama novpn
. Proses dalam cgroup ini akan memiliki 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
Sekarang, kita anggap antarmuka yang ingin Anda gunakan untuk aplikasi tertentu adalah eth0
dengan IP gateway 10.0.0.1
. Ganti ini dengan apa yang Anda inginkan (dapatkan info dari ip route
). Jalankan diam sebagai 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
Terakhir, jalankan aplikasi Anda pada antarmuka spesifik:
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
Atau jika Anda ingin memindahkan proses yang sudah berjalan ke cgroup, well ... Anda tidak bisa! Itu tampaknya karena fungsi NAT (masquerade): iptables -nvL -t nat
tidak cocok ketika cgroup diaktifkan, tetapi iptables -nvL -t mangle
tidak cocok.
# 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
Kredit: Tidak ada jawaban yang berfungsi seperti yang diharapkan, tetapi campurannya memang: artikel chripell answer evolware Per proses routing mengambil 2: menggunakan cgroup, iptables dan kebijakan routing , Bagaimana cara membuat proses tertentu TIDAK melalui koneksi OpenVPN? , Bunuh sakelar untuk OpenVPN berdasarkan iptables
cgexec -g net_cls:novpn apache2
dan memberi saya seluruh daftar variabel tidak terdefinisi variabel!apache2
langsung dari terminal. Itu karenaapache2
biasanya diluncurkan sebagai layanan, dengansystemctl start apache2
. Namun, itu tidak akan berhasilcgexec
. Program yang dipanggil harus merupakan induk dari proses (apache2
) yang diinginkan untuk disebarluaskan oleh net_cls cgroup. Jadi, Anda perlu menemukan skrip peluncuran. Dalam hal ini, inisudo cgexec -g net_cls:novpn /usr/sbin/apache2ctl start
. Periksa dengan./novpn.sh --list
.eth0
dengan sesuatu sepertienp7s0
. Dapatkan info dariifconfig
perintah.Beberapa orang telah menulis shims yang menggunakan fitur LD_PRELOAD dari Linux untuk mencapai ini:
sumber
Menggabungkan jawaban yang sangat baik dari mariusmatutiae dan KrisWebDev Saya telah membuat versi modifikasi yang luar biasa dari
novpn.sh
script KrisWebDev . Sementara skrip KrisWebDev dirancang untuk menggaruk gatal yang lebih spesifik (proses berjalan dan bergerak di dalam / di luar VPN), versi saya memungkinkan Anda untuk menjalankan perintah apa pun di lingkungan jaringan yang Anda tentukan. Anda dapat menentukan antarmuka yang akan diikat, rute default, tentukan aturan iptables Anda sendiri, rute statis, tentukan "tes" untuk mengonfirmasi semuanya beroperasi sesuai keinginan sebelum menjalankan perintah ... dll). Ini memungkinkan Anda untuk menggunakan banyak file konfigurasi sehingga Anda dapat menentukan sejumlah lingkungan jaringan tertentu yang dapat Anda jalankan perintah / proses di dalamnya.Saya mempostingnya sebagai intisari di sini: https://gist.github.com/level323/54a921216f0baaa163127d960bfebbf0
Ia bahkan dapat membersihkan tabel cgroup / iptables / routing sesudahnya!
Umpan balik.
PS - Ini dirancang untuk Debian 8 (Jessie)
sumber
Tidak per aplikasi, tidak. Anda dapat melakukannya per port atau per ip-address dll, atau aplikasi itu sendiri dapat mengikat (dan menggunakan) kartu jaringan tertentu.
Anda tidak dapat membuat aturan untuk melakukannya.
sumber