ฉันกำลังพยายามเปลี่ยนเส้นทางการรับส่งข้อมูลเครือข่ายสำหรับบัญชีผู้ใช้เฉพาะ (vpnnet) ไปยังเซิร์ฟเวอร์ OpenVPN อุโมงค์ข้อมูลทำงานได้ดีเมื่อดึงเส้นทางเริ่มต้น แต่ฉันไม่ต้องการกำหนดเส้นทางการรับส่งข้อมูลทั้งหมดผ่าน VPN เฉพาะสำหรับกระบวนการที่ทำงานด้วย UID ที่กำหนด ดังนั้นฉันจึงปิดการใช้งานการดึงเส้นทางเริ่มต้นโดยอัตโนมัติและได้สิ่งต่อไปนี้:

iptables -t mangle -A OUTPUT -m owner --uid-owner vpnnet -j MARK --set-mark 42
ip route add default via 10.1.1.1 table 42
ip rule add fwmark 42 table 42
iptables -t nat -A POSTROUTING -o tun0 -m mark --mark 42 -j SNAT --to-source 10.1.1.100

ที่อยู่ท้องถิ่นเป็น10.1.1.100และ10.1.1.1เป็นเกตเวย์ระยะไกล

ifconfig
tun0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1500
        inet 10.1.1.100  netmask 255.255.255.0  destination 10.1.1.100
        inet6 ****::****::****::****::****  prefixlen 64  scopeid 0x20<link>
        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 100  (UNSPEC)
        RX packets 128  bytes 10032 (9.7 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 108  bytes 8832 (8.6 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
ip route show
default via 172.31.1.1 dev eth0 proto dhcp metric 100
10.1.1.0/24 dev tun0 proto kernel scope link src 10.1.1.100 metric 50
172.31.1.0/24 dev eth0 proto kernel scope link src 172.31.1.100 metric 100
172.31.1.1 dev eth0 proto static scope link metric 100
ip route show table 42
default via 10.1.1.1 dev tun0

เมื่อเริ่มต้นเชลล์ภายใต้ผู้ใช้vpnuserและ ping เซิร์ฟเวอร์ Google DNS 8.8.8.8นั้น ping จะสูญเสียแพ็กเก็ต 100% TcpDump แสดงว่าคำขอกำลังจะออกไปและการตอบกลับเข้ามาบนอินเทอร์เฟซที่ถูกต้อง:

tcpdump -nn -vv -i tun0
tcpdump: listening on tun0, link-type RAW (Raw IP), capture size 262144 bytes
20:33:28.938772 ip: (tos 0x0, ttl 64, id 7713, offset 0, flags [DF], proto ICMP (1), length 84)
    10.1.1.100 > 8.8.8.8: ICMP echo request, id 5078, seq 1, length 64
20:33:29.029533 ip: (tos 0x48, ttl 115, id 0, offset 0, flags [none], proto ICMP (1), length 84)
    8.8.8.8 > 10.1.1.100: ICMP echo reply, id 5078, seq 1, length 64
20:33:29.938962 ip: (tos 0x0, ttl 64, id 7790, offset 0, flags [DF], proto ICMP (1), length 84)
    10.1.1.100 > 8.8.8.8: ICMP echo request, id 5078, seq 2, length 64
20:33:30.029685 ip: (tos 0x48, ttl 115, id 0, offset 0, flags [none], proto ICMP (1), length 84)
    8.8.8.8 > 10.1.1.100: ICMP echo reply, id 5078, seq 2, length 64
20:33:30.938838 ip: (tos 0x0, ttl 64, id 8152, offset 0, flags [DF], proto ICMP (1), length 84)
    10.1.1.100 > 8.8.8.8: ICMP echo request, id 5078, seq 3, length 64
20:33:31.029179 ip: (tos 0x48, ttl 115, id 0, offset 0, flags [none], proto ICMP (1), length 84)
    8.8.8.8 > 10.1.1.100: ICMP echo reply, id 5078, seq 3, length 64
ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
^C
--- 8.8.8.8 ping statistics ---
12 packets transmitted, 0 received, 100% packet loss, time 11001ms

บันทึก iptables ไม่แสดงแพ็กเก็ตที่ดร็อป

ระบบปฏิบัติการคือ CentOS 7

ฉันจะขอบคุณมากถ้ามีคนชี้ให้ฉันไปในทิศทางที่ถูกต้อง

no answer