Tôi đang cố chuyển hướng lưu lượng truy cập mạng cho một tài khoản người dùng cụ thể (vpnnet) sang máy chủ OpenVPN. Đường hầm hoạt động tốt khi tuyến mặc định được kéo, nhưng tôi không muốn định tuyến tất cả lưu lượng truy cập qua VPN, chỉ cho các quy trình đang chạy với một UID nhất định. Vì vậy, tôi đã vô hiệu hóa tính năng tự động kéo tuyến đường mặc định và nghĩ ra cách sau:
iptables -t mangle -A OUTPUT -m owner --uid-owner vpnnet -j MARK --set-mark 42
tuyến ip thêm mặc định qua bảng 10.1.1.1 42
quy tắc ip thêm fwmark 42 bảng 42
iptables -t nat -A POSTROUTING -o tun0 -m mark --mark 42 -j SNAT --to-source 10.1.1.100
Địa chỉ cục bộ là 10.1.1.100
và 10.1.1.1
là cổng từ xa.
ifconfig
tun0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1500
inet 10.1.1.100 netmask 255.255.255.0 đích 10.1.1.100
inet6 ****::****::****::****::**** tiền tốlen 64 scopeid 0x20<link>
không xác định 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 100 (UNSPEC)
Gói RX 128 byte 10032 (9,7 KiB)
Lỗi RX 0 bị rớt 0 tràn 0 khung hình 0
Gói TX 108 byte 8832 (8,6 KiB)
Lỗi TX 0 bị rớt 0 tràn 0 sóng mang 0 va chạm 0
lộ trình ip
mặc định qua 172.31.1.1 dev eth0 proto dhcp metric 100
10.1.1.0/24 dev tun0 liên kết phạm vi kernel proto src 10.1.1.100 số liệu 50
172.31.1.0/24 dev eth0 liên kết phạm vi hạt nhân proto src 172.31.1.100 số liệu 100
172.31.1.1 dev eth0 số liệu liên kết phạm vi tĩnh proto 100
lộ trình ip bảng 42
mặc định qua 10.1.1.1 dev tun0
Khi bắt đầu Shell dưới người dùng vpnuser
và ping máy chủ Google DNS 8.8.8.8
ping bị mất gói 100%. TcpDump cho thấy rằng các yêu cầu đang được gửi đi và các câu trả lời đang đến trên đúng giao diện:
tcpdump -nn -vv -i tun0
tcpdump: lắng nghe trên tun0, RAW kiểu liên kết (IP thô), kích thước chụp 262144 byte
20:33:28.938772 ip: (tos 0x0, ttl 64, id 7713, offset 0, flags [DF], ICMP nguyên mẫu (1), chiều dài 84)
10.1.1.100 > 8.8.8.8: ICMP echo request, id 5078, seq 1, chiều dài 64
20:33:29.029533 ip: (tos 0x48, ttl 115, id 0, offset 0, flags [none], ICMP nguyên mẫu (1), chiều dài 84)
8.8.8.8 > 10.1.1.100: Trả lời tiếng vang ICMP, id 5078, seq 1, độ dài 64
20:33:29.938962 ip: (tos 0x0, ttl 64, id 7790, offset 0, flags [DF], ICMP nguyên mẫu (1), chiều dài 84)
10.1.1.100 > 8.8.8.8: ICMP echo request, id 5078, seq 2, chiều dài 64
20:33:30.029685 ip: (tos 0x48, ttl 115, id 0, offset 0, flags [none], ICMP nguyên mẫu (1), chiều dài 84)
8.8.8.8 > 10.1.1.100: ICMP echo reply, id 5078, seq 2, độ dài 64
20:33:30.938838 ip: (tos 0x0, ttl 64, id 8152, offset 0, flags [DF], ICMP nguyên mẫu (1), chiều dài 84)
10.1.1.100 > 8.8.8.8: ICMP echo request, id 5078, seq 3, chiều dài 64
20:33:31.029179 ip: (tos 0x48, ttl 115, id 0, offset 0, flags [none], ICMP nguyên mẫu (1), chiều dài 84)
8.8.8.8 > 10.1.1.100: Trả lời tiếng vang ICMP, id 5078, phần tiếp theo 3, độ dài 64
ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) byte dữ liệu.
^C
--- Thống kê ping 8.8.8.8 ---
Truyền 12 gói, 0 nhận, mất gói 100%, thời gian 11001ms
Nhật ký iptables không hiển thị bất kỳ gói bị rớt nào.
Hệ điều hành là CentOS 7.
Tôi sẽ rất biết ơn nếu ai đó có thể chỉ cho tôi đi đúng hướng.