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!