Hóa ra, trong Linux, người ta có thể sử dụng ipset phù hợp để chọn bảng định tuyến. Thành phần bổ sung đang sử dụng quy tắc bộ lọc mạng sẽ khớp với các gói gửi đi và áp dụng một fwmark cho họ, mà sau đó có thể được sử dụng để chọn một bảng định tuyến chuyên dụng. Sau đó, bảng định tuyến chuyên dụng này sẽ chỉ chứa một tuyến đường mặc định duy nhất thông qua VPN.
Đây là ý tưởng chung dưới dạng kịch bản, cách thiết lập điều này.
# Mạng con để định tuyến qua TUN
DSTNETS=.../...../..
# Loại trừ các đích này khỏi định tuyến qua TUN
LOẠI TRỪ=... ...
# TUN thiết bị để sử dụng cho kết nối này và các tham số của nó. Những thiết bị này thường được cung cấp bởi daemon VPN
TUNDEV=...
TUNADDR=.../..
TUNPEER =...
# Tên cho ipset được sử dụng để khớp với đích. Dựa trên tên TUN
IPSET=${TUNDEV}ipset
# Chúng tôi cần một fwmark bộ lọc mạng và một bảng iproute2. fwmark và bảng là các giá trị 32 bit, giới hạn trong phạm vi số nguyên đã ký, tức là [0, 2³¹-1] fwmark có thể được sử dụng làm mặt nạ bit báo hiệu nhiều cờ, do đó, tùy thuộc vào nhu cầu của chúng tôi, hãy đặt một (hoặc một vài bit) cụ thể, hoặc một giá trị rất cụ thể mà sau đó được so sánh cho bình đẳng.
FWMARK=0x...
BẢNG=0x...
# Tạo ipset và điền vào đó các dải địa chỉ IP và mạng con để khớp và không khớp.
ipset tạo hàm băm $IPSET:net
cho d trong $DSTNETS ; làm ipset thêm $IPSET $d ; xong
cho x trong $EXCLUDE ; làm ipset thêm $IPSET $x nomatch ; xong
# Tạo một bảng quy tắc iproute2 mới sẽ được sử dụng để tra cứu tuyến đường cho tất cả các gói được đặt dấu lựa chọn của chúng tôi
quy tắc ip thêm bảng fwmark $FWMARK $TABLE
# Đây là nơi điều kỳ diệu xảy ra: Tạo một quy tắc bộ lọc mạng sẽ khớp các gói bắt nguồn từ máy chủ này, cho các đích khớp với ipset mà chúng ta vừa tạo và đánh dấu chúng bằng fwmark đã chọn. Do quy tắc mà chúng tôi vừa tạo trước đó, các gói đó sau đó sẽ được định tuyến bằng cách sử dụng bảng cụ thể đó, thay vì các bảng chung.
iptables -t mangle -A OUTPUT -m set --match-set $IPSET dst -j MARK --set-mark $FWMARK
# Ngoài ra, hãy thêm quy tắc bộ lọc mạng để ghi đè địa chỉ nguồn cho các gói này vì mạng đích có thể sẽ từ chối chúng nếu chúng không khớp với dải địa chỉ được sử dụng cho VPN
iptables -t nat -A POSTROUTING -m set --match-set $IPSET dst -j SNAT --to-source $INTERNAL_IP4_ADDRESS
# Bây giờ chúng ta có thể thiết lập thiết bị TUN thực tế.Nói một cách chính xác, các bước đó có thể đã được thực hiện trước đó, nhưng sau đó trong một thời gian ngắn giữa TUN xuất hiện và thiết lập các quy tắc định tuyến, một số gói có thể đã kết thúc trong tình trạng lấp lửng
thiết lập liên kết ip dev $TUNDEV lên
ip addr add $TUNADDR ngang hàng $TUNPEER dev $TUNDEV
# Cuối cùng, thiết lập một tuyến đường mặc định đi qua TUN trong bảng định tuyến chuyên dụng của chúng tôi, do quy tắc fwmark sẽ chỉ bị tấn công bởi các gói phù hợp với ipset của chúng tôi
tuyến ip thêm bảng dev mặc định $TUNDEV $TABLE
Để phá bỏ mọi thứ, chỉ cần làm theo kịch bản ngược lại, xóa nội dung; các ipset có thể hủy hoại
ed với một lệnh duy nhất.