ฉันกำลังพยายามเปลี่ยนเส้นทางการรับส่งข้อมูลเครือข่ายสำหรับบัญชีผู้ใช้เฉพาะ (vpnnet) ไปยังเซิร์ฟเวอร์ OpenVPN อุโมงค์ทำงานได้ดีเมื่อดึงเส้นทางเริ่มต้น แต่ฉันไม่ต้องการกำหนดเส้นทางการรับส่งข้อมูลทั้งหมดผ่าน VPN สำหรับกระบวนการที่ทำงานด้วย UID ที่กำหนดเท่านั้น ดังนั้นฉันจึงปิดใช้งานการดึงเส้นทางเริ่มต้นโดยอัตโนมัติและได้สิ่งต่อไปนี้:
iptables -t mangle -A OUTPUT -m เจ้าของ --uid-owner vpnnet -j MARK --set-mark 42
เส้นทาง ip เพิ่มค่าเริ่มต้นผ่าน 10.1.1.1 ตาราง 42
กฎ ip เพิ่ม fwmark 42 ตาราง 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 ปลายทาง 10.1.1.100
inet6 ****::****::****::****::**** คำนำหน้า 64 scopeid 0x20<link>
ไม่ระบุ 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 100 (UNSPEC)
แพ็คเก็ต RX 128 ไบต์ 10032 (9.7 KiB)
ข้อผิดพลาด RX 0 หลุด 0 โอเวอร์รัน 0 เฟรม 0
แพ็กเก็ต TX 108 ไบต์ 8832 (8.6 KiB)
ข้อผิดพลาด TX 0 หลุด 0 โอเวอร์รัน 0 พาหะ 0 ชนกัน 0
แสดงเส้นทาง ip
ค่าเริ่มต้นผ่าน 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 เมตริก 50
172.31.1.0/24 dev eth0 ลิงก์ขอบเขตเคอร์เนลโปรโต src 172.31.1.100 เมตริก 100
172.31.1.1 dev eth0 proto static scope link เมตริก 100
ตารางแสดงเส้นทาง ip 42
ค่าเริ่มต้นผ่าน 10.1.1.1 dev tun0
เมื่อเริ่มต้นเชลล์ภายใต้ผู้ใช้ vpnuser
และ ping เซิร์ฟเวอร์ Google DNS 8.8.8.8
ping มีการสูญเสียแพ็คเก็ต 100% TcpDump แสดงให้เห็นว่ามีการร้องขอและมีการตอบกลับเข้ามาในอินเทอร์เฟซที่ถูกต้อง:
tcpdump -nn -vv -i tun0
tcpdump: กำลังฟัง tun0, RAW ประเภทลิงก์ (Raw IP), ขนาดการจับภาพ 262144 ไบต์
20:33:28.938772 ip: (tos 0x0, ttl 64, id 7713, offset 0, flag [DF], proto ICMP (1), ความยาว 84)
10.1.1.100 > 8.8.8.8: คำขอเสียงสะท้อน ICMP, id 5078, seq 1, ความยาว 64
20:33:29.029533 ip: (tos 0x48, ttl 115, id 0, offset 0, flag [none], proto ICMP (1), ความยาว 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, flag [DF], proto ICMP (1), ความยาว 84)
10.1.1.100 > 8.8.8.8: คำขอเสียงสะท้อน ICMP, id 5078, seq 2, ความยาว 64
20:33:30.029685 ip: (tos 0x48, ttl 115, id 0, offset 0, flag [none], proto ICMP (1), ความยาว 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, flag [DF], proto ICMP (1), ความยาว 84)
10.1.1.100 > 8.8.8.8: คำขอเสียงสะท้อน ICMP, id 5078, seq 3, ความยาว 64
20:33:31.029179 ip: (tos 0x48, ttl 115, id 0, offset 0, flag [none], proto ICMP (1), ความยาว 84)
8.8.8.8 > 10.1.1.100: ICMP echo reply, id 5078, seq 3, length 64
ปิง 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) ไบต์ของข้อมูล
^ซี
--- สถิติ ping 8.8.8.8 ---
ส่ง 12 แพ็กเก็ต ได้รับ 0 แพ็กเก็ต สูญเสียแพ็กเก็ต 100% เวลา 11001 มิลลิวินาที
บันทึก iptables ไม่แสดงแพ็กเก็ตที่ถูกทิ้ง
ระบบปฏิบัติการคือ CentOS 7
ฉันจะขอบคุณมากถ้ามีใครสามารถชี้ทิศทางที่ถูกต้องให้ฉันได้