ฉันพยายามอย่างหนักกับเรื่องนี้ดังนั้นนี่คือทางออกที่สมบูรณ์ ผ่านการทดสอบบน Ubuntu 15 & amp; 16. คุณสามารถใช้กับ OpenVPN โดยเฉพาะเพื่อกำหนดเส้นทางแอปบางอย่างนอกช่องสัญญาณ VPN
โซลูชัน "cgroup" ที่สมบูรณ์
มันทำงานอย่างไร
- เคอร์เนล Linux จะนำแอปไปไว้ใน กลุ่มควบคุม . การรับส่งข้อมูลเครือข่ายจากแอปในกลุ่มนี้จะถูกระบุด้วยรหัสระดับของพวกเขาที่ระดับตัวควบคุมเครือข่าย
- iptables จะทำเครื่องหมายการรับส่งข้อมูลนี้และบังคับให้ออกด้วย IP ที่ถูกต้อง
- เส้นทาง ip จะประมวลผลปริมาณข้อมูลที่ทำเครื่องหมายไว้ในตารางเส้นทางที่แตกต่างกันโดยมีเส้นทางเริ่มต้นไปยังเกตเวย์ IP ที่คุณต้องการ
สคริปต์อัตโนมัติ
ฉันทำ novpn.sh สคริปต์เพื่อติดตั้งการอ้างอิงอัตโนมัติ & amp; วิ่ง. ทดสอบบน 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 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
. กระบวนการใน cgroup นี้จะมี 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
ตอนนี้เราจะสมมติว่าอินเทอร์เฟซที่คุณต้องการใช้สำหรับแอพเฉพาะคือ 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
หรือถ้าคุณต้องการย้ายกระบวนการที่กำลังทำงานอยู่ไปยัง cgroup ก็ดี ... คุณทำไม่ได้! ดูเหมือนว่าจะเกิดจากฟังก์ชัน NAT (masquerade): iptables -nvL -t nat
ไม่ตรงกับเมื่อเปลี่ยนกลุ่ม cgroup แต่ 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 บทความวิวัฒนาการ การกำหนดเส้นทางตามกระบวนการใช้เวลา 2: ใช้ cgroups, iptables และการกำหนดเส้นทางนโยบาย , ฉันจะทำให้กระบวนการเฉพาะไม่ผ่านการเชื่อมต่อ OpenVPN ได้อย่างไร , Kill switch สำหรับ OpenVPN บนพื้นฐานของ iptables
cgexec -g net_cls:novpn apache2
และให้ฉันรายการทั้งหมดของข้อผิดพลาดตัวแปรไม่ได้กำหนด!