เซิร์ฟเวอร์ภายในบ้านของฉันมีสองอินเตอร์เฟสหลักeth1
(การเชื่อมต่ออินเทอร์เน็ตมาตรฐาน) และtun0
(อุโมงค์ OpenVPN) ฉันต้องการที่จะใช้iptables
เพื่อบังคับให้แพ็คเก็ตทั้งหมดที่สร้างโดยกระบวนการในท้องถิ่นเป็นเจ้าของโดย UID 1002 เพื่อออกผ่านtun0
และแพ็คเก็ตอื่น ๆ eth1
ทั้งหมดเพื่อออกผ่าน
ฉันสามารถทำเครื่องหมายแพ็คเก็ตที่ตรงกันได้อย่างง่ายดาย:
iptables -A OUTPUT -m owner --uid-owner 1002 -j MARK --set-mark 11
ตอนนี้ผมต้องการที่จะนำกฎบางอย่างในห่วงโซ่ POSTROUTING (ที่อาจจะฉีกของตาราง) เพื่อให้ตรงกับแพ็คเก็ตที่มีเครื่องหมายที่ 11 และส่งพวกเขาไปตามกฎที่ตรงกับแพ็กเก็ตทั้งหมดและส่งพวกเขาไปtun0
eth1
ฉันพบเป้าหมายของ ROUTE แต่ดูเหมือนว่าจะเขียนอินเทอร์เฟซต้นฉบับใหม่เท่านั้น (เว้นแต่ฉันจะอ่านผิด)
iptables สามารถทำสิ่งนี้ได้หรือไม่? ฉันต้องยุ่งกับตารางเส้นทาง (ผ่านip route
หรือเพียงแค่route
คำสั่งดั้งเดิม) แทน?
แก้ไข: ฉันคิดว่าบางทีฉันควรให้ข้อมูลเพิ่มเติม ฉันไม่มีกฎ iptables อื่น ๆ ในปัจจุบัน (แม้ว่าฉันอาจสร้างกฎบางอย่างเพื่อทำงานที่ไม่เกี่ยวข้องในอนาคต) นอกจากนี้ผลลัพธ์ของip route
คือ:
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
ฉันไม่ได้แตะตารางเส้นทาง - นี่เป็นเพียงวิธีปัจจุบัน (แม้ว่ามันจะดูค่อนข้างสกปรก) ฉันขอโทษ แต่ฉันไม่ได้route
ติดตั้งคำสั่งดั้งเดิมบนเครื่องนี้
และผลลัพธ์ของip addr
(แน่นอน, eth0 และ eth2 สามารถถูกเพิกเฉยได้ - มันเป็นนิคส์ที่ไม่ได้ใช้ในปัจจุบัน):
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
แก้ไข: ฉันได้รับบางสิ่งบางอย่างที่ทำงานเรียงกัน แต่มันไม่ได้ส่งต่อแพ็คเก็ตที่ทำเครื่องหมายเพื่อ tun0 โดยทั่วไปฉันเพิ่มตาราง (11) และใช้:
ip route add table 11 via 10.32.0.49 dev tun0
ip rule add priority 10000 fwmark 11 table 11
เมื่อฉันเพิ่งsudo -u user1000 wget -qO- whatismyip.org
ฉันจะได้รับที่อยู่ IP ภายนอกของบ้านของฉัน แต่ถ้าฉันทำsudo -u user1002 wget -qO- whatismyip.org
ฉันก็จะได้รับที่อยู่ IP ของบ้านของฉันด้วย (แต่ฉันควรจะได้รับ IP ที่ปลายอีกด้านหนึ่งของอุโมงค์ OpenVPN)
การรันiptables -vL
ยืนยันว่าแพ็กเก็ตได้รับการจับคู่โดยกฎการทำเครื่องหมาย แต่ดูเหมือนว่าจะไม่เป็นไปตามกฎการกำหนดเส้นทาง
แก้ไข: ฉันใช้เวลานานในการนี้และแม้ว่ามันยังไม่ทำงานฉันคิดว่าฉันใกล้
กฎ iptables จะต้องอยู่ในmangle
ห่วงโซ่เอาท์พุทของตาราง ฉันคิดว่าฉันยังต้องการกฎ MASQUERADE ในnat
โซ่ POSTROUTING ของตารางเพื่อตั้งค่าที่อยู่ต้นทาง อย่างไรก็ตามการกำหนดเส้นทางใหม่ที่เกิดขึ้นหลังจาก mangle ของ OUTPUT ไม่ทำงานอย่างถูกต้อง
ฉันใช้เวลา 5 ชั่วโมงในตอนนี้ดังนั้นฉันจึงหยุดพักและอาจจะกลับมาอีกในคืนนี้หรือพรุ่งนี้