Máy chủ gia đình của tôi có hai giao diện chính, eth1
(kết nối internet tiêu chuẩn) và tun0
(đường hầm OpenVPN). Tôi muốn sử dụng iptables
để buộc tất cả các gói được tạo bởi một quy trình cục bộ thuộc sở hữu của UID 1002 để thoát qua tun0
và tất cả các gói khác để thoát qua eth1
.
Tôi có thể dễ dàng đánh dấu các gói phù hợp:
iptables -A OUTPUT -m owner --uid-owner 1002 -j MARK --set-mark 11
Bây giờ, tôi muốn đặt một số quy tắc trong chuỗi POSTROUTING (có thể là bảng mangle) để khớp các gói được đánh dấu bằng 11 và gửi chúng đến tun0
, theo sau là một quy tắc khớp với tất cả các gói và gửi chúng đến eth1
.
Tôi đã tìm thấy mục tiêu ROUTE, nhưng dường như chỉ viết lại giao diện nguồn (trừ khi tôi đọc không chính xác).
Là iptables có khả năng này? Thay vào đó, tôi có phải loay hoay với bảng định tuyến (thông qua ip route
hoặc chỉ các route
lệnh kế thừa ) không?
Chỉnh sửa: Tôi nghĩ rằng có lẽ tôi nên cung cấp thêm thông tin. Hiện tại tôi không có quy tắc iptables nào khác (mặc dù tôi có thể tạo một số quy tắc để thực hiện các nhiệm vụ không liên quan trong tương lai). Ngoài ra, đầu ra của ip route
là:
default via 192.168.1.254 dev eth1 metric 203
10.32.0.49 dev tun0 proto kernel scope link src 10.32.0.50
85.17.27.71 via 192.168.1.254 dev eth1
192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.73 metric 203
Tôi chưa chạm vào bảng định tuyến - đây chỉ là cách nó hiện tại (mặc dù nó trông khá bẩn). Tôi xin lỗi, nhưng tôi không route
cài đặt lệnh kế thừa trên máy này.
Và đầu ra của ip addr
(tất nhiên, eth0 và eth2 có thể bị bỏ qua - chúng là các NIC hiện không được sử dụng):
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
link/ether 1c:6f:65:2a:73:3f brd ff:ff:ff:ff:ff:ff
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:1b:21:9d:4e:bb brd ff:ff:ff:ff:ff:ff
inet 192.168.1.73/24 brd 192.168.1.255 scope global eth1
inet6 fe80::21b:21ff:fe9d:4ebb/64 scope link
valid_lft forever preferred_lft forever
4: eth2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
link/ether 00:1b:21:6a:c0:4b brd ff:ff:ff:ff:ff:ff
5: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN qlen 100
link/none
inet 10.32.0.50 peer 10.32.0.49/32 scope global tun0
Chỉnh sửa: Tôi đã nhận được một cái gì đó sắp xếp hoạt động, nhưng nó không chuyển tiếp các gói được đánh dấu đến tun0. Về cơ bản, tôi đã thêm một bảng (11) và được sử dụng:
ip route add table 11 via 10.32.0.49 dev tun0
ip rule add priority 10000 fwmark 11 table 11
Khi tôi chỉ sudo -u user1000 wget -qO- whatismyip.org
, tôi nhận được địa chỉ IP bên ngoài của nhà tôi, nhưng nếu có sudo -u user1002 wget -qO- whatismyip.org
, tôi cũng nhận được địa chỉ IP của nhà tôi (nhưng tôi sẽ nhận được IP ở đầu kia của đường hầm OpenVPN).
Chạy iptables -vL
xác nhận rằng các gói đang được khớp với quy tắc đánh dấu, nhưng chúng dường như không tuân theo quy tắc định tuyến.
EDIT: Tôi đã dành một thời gian dài cho việc này, và mặc dù nó vẫn không hoạt động, tôi nghĩ rằng tôi gần hơn một chút.
Quy tắc iptables phải nằm trong mangle
chuỗi OUTPUT của bảng. Tôi nghĩ rằng tôi cũng cần một quy tắc MASQUERADE trong nat
chuỗi POSTROUTING của bảng để đặt địa chỉ nguồn. Tuy nhiên, việc định tuyến lại xảy ra sau khi mangle của OUTPUT không hoạt động chính xác.
Tôi đã dành 5 giờ cho việc này bây giờ, vì vậy tôi đang nghỉ ngơi và có thể sẽ quay lại vào tối nay hoặc đôi khi vào ngày mai.