Ben sooo ile mücadele ettik bu yüzden İşte bir TAMAM çözüm. Ubuntu 15 ve 16'da test edilmiştir. Özellikle VPN tünel arayüzü dışındaki belirli uygulamaları yönlendirmek için OpenVPN ile kullanabilirsiniz.
Eksiksiz "grup" çözümü
Bu nasıl çalışır?
- Linux çekirdeği uygulamayı bir kontrol grubuna koyacaktır . Bu gruptaki uygulamalardan gelen ağ trafiği, ağ denetleyicisi düzeyindeki sınıf kimlikleriyle tanımlanır.
- iptables bu trafiği işaretler ve doğru IP ile çıkmaya zorlar
- ip yolu, işaretli trafiği farklı bir yönlendirme tablosunda, istediğiniz ağ geçidi IP'sine varsayılan bir yolla işler.
Otomatik komut dosyası
Yükleme ve çalıştırma bağımlılıklarını otomatikleştirmek için bir novpn.sh betiği yaptım . Ubuntu üzerinde test edildi.
Önce VPN'nizi başlatın.
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
Manuel Nasıl Yapılır
İlk olarak, grup desteği ve araçlarını yükleyin:
sudo apt-get install cgroup-lite cgmanager cgroup-tools
Yeniden başlat (gerekli olmayabilir).
Iptables 1.6 .0+ gerekir . İptables 1.6.0 yayın kaynağını alın , ayıklayın, ardından --disable-nftables
iptables kaynak dizininden bu ( bayrak hataları önleyecektir) çalıştırın :
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
Şimdi, gerçek yapılandırma. Adlı bir kontrol grubu tanımlayın novpn
. Bu gruptaki işlemlerin sınıfı 0x00110011
(11:11) olacaktır.
sudo su
mkdir /sys/fs/cgroup/net_cls/novpn
cd /sys/fs/cgroup/net_cls/novpn
echo 0x00110011 > net_cls.classid
Şimdi, belirli bir uygulama için kullanmak istediğiniz arayüzün eth0
bir ağ geçidi IP'si olduğunu varsayalım 10.0.0.1
. Bunları gerçekten istediğiniz şeyle değiştirin (bilgileri alın ip route
). Hala root olarak çalıştır:
# 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
Son olarak, uygulamanızı belirli bir arayüzde çalıştırın:
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
Veya zaten çalışan bir işlemi gruba taşımak istiyorsanız, yapamazsınız! Bu NAT (maskeli balo) işlevinden kaynaklanıyor gibi görünüyor: iptables -nvL -t nat
grup değiştirildiğinde eşleşmiyor, ancak eşleşiyor 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
Kredi: Hiçbir yanıt beklendiği gibi çalışmıyordu, ancak bunların bir karışımı yaptı: chripell cevap evolware makalesi İşlem yönlendirmesi başına 2 alır: cgroups, iptables ve politika yönlendirmesini kullanma , Belirli bir işlemi nasıl OpenVPN bağlantısı üzerinden yapmam? , İptables temelinde OpenVPN için Kill switch
cgexec -g net_cls:novpn apache2
ve değişken tanımsız hataların tüm listesini verdi!