Tôi đã phải vật lộn với điều này vì vậy đây là một giải pháp HOÀN THÀNH. Nó đã được thử nghiệm trên Ubuntu 15 & 16. Bạn có thể đặc biệt sử dụng nó với OpenVPN để định tuyến các ứng dụng nhất định bên ngoài giao diện đường hầm VPN.
Giải pháp "cgroup" hoàn chỉnh
Làm thế nào mà hoạt động?
- Nhân Linux sẽ đưa ứng dụng vào nhóm kiểm soát . Lưu lượng truy cập mạng từ các ứng dụng trong nhóm này sẽ được xác định bởi ID lớp của chúng ở cấp điều khiển mạng.
- iptables sẽ đánh dấu lưu lượng này và buộc nó phải thoát với đúng IP
- tuyến ip sẽ xử lý lưu lượng được đánh dấu trong một bảng định tuyến khác, với tuyến mặc định tới bất kỳ IP cổng nào bạn muốn.
Kịch bản tự động
Tôi đã tạo một tập lệnh novpn.sh để tự động cài đặt và chạy phụ thuộc. Đã thử nghiệm trên Ubuntu.
Bắt đầu VPN của bạn trước.
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
Hướng dẫn cách làm
Đầu tiên, cài đặt các công cụ và hỗ trợ cgroup:
sudo apt-get install cgroup-lite cgmanager cgroup-tools
Khởi động lại (có thể không cần thiết).
Bạn cần iptables 1.6 .0+. Nhận nguồn phát hành iptables 1.6.0 , giải nén nó, sau đó chạy này ( --disable-nftables
cờ sẽ tránh lỗi) từ thư mục nguồn 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
Bây giờ, cấu hình thực sự. Xác định một nhóm kiểm soát có tên novpn
. Các quy trình trong nhóm này sẽ có một lớp 0x00110011
(11:11).
sudo su
mkdir /sys/fs/cgroup/net_cls/novpn
cd /sys/fs/cgroup/net_cls/novpn
echo 0x00110011 > net_cls.classid
Bây giờ, chúng tôi sẽ giả sử giao diện bạn muốn sử dụng cho ứng dụng cụ thể eth0
có IP cổng 10.0.0.1
. Thay thế những thứ này bằng những gì bạn thực sự muốn (lấy thông tin từ ip route
). Chạy vẫn như 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
Cuối cùng, chạy ứng dụng của bạn trên giao diện cụ thể:
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
Hoặc nếu bạn muốn chuyển một quy trình đã chạy sang nhóm, thì ... bạn không thể! Điều đó dường như là do chức năng NAT (giả trang): iptables -nvL -t nat
không khớp khi cgroup được chuyển đổi, nhưng iptables -nvL -t mangle
không khớp.
# 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
Tín dụng: Không có câu trả lời nào hoạt động như mong đợi, nhưng một hỗn hợp của chúng đã làm: chripell answer evolware article Mỗi quá trình định tuyến mất 2: sử dụng cgroups, iptables và định tuyến chính sách , Làm cách nào để tạo một quy trình cụ thể KHÔNG đi qua kết nối OpenVPN? , Kill switch cho OpenVPN trên cơ sở iptables
cgexec -g net_cls:novpn apache2
và đưa cho tôi toàn bộ danh sách các biến số không xác định!