การเชื่อมต่อเครือข่ายคู่


9

ฉันมีโมเด็มมือถือ usb และการเชื่อมต่อ Home LAN บนกล่อง Ubuntu 10.10 ของฉัน

ทั้งทำงานอย่างอิสระ

ฉันต้องการทราบวิธีการเชื่อมต่อทั้งสองในเวลาเดียวกันและสามารถระบุแอปพลิเคชันที่ใช้อุปกรณ์ใดในการเชื่อมต่ออินเทอร์เน็ต

ไม่มีใครรู้วิธีการทำเช่นนี้?

คำตอบ:


11

มีความเป็นไปได้หลายอย่างขึ้นอยู่กับวิธีที่คุณต้องการตัดสินใจว่าแพ็กเก็ตไปที่ใด ส่วนใหญ่จะต้องมีความเข้าใจในการทำงานของเครือข่าย TCP / IP ใน Linux เครื่องมือหลักที่คุณต้องรู้ในการทำสิ่งที่ซับซ้อนคือiptables(Ubuntu: iptables ติดตั้ง iptables ) และiproute2 ( ipคำสั่ง) (Ubuntu: iproute ติดตั้ง iproute , iproute-doc ติดตั้ง iproute-doc )

หากคุณสามารถจำแนกได้อย่างสมบูรณ์ตามที่อยู่ IP เป้าหมายมันง่าย: กำหนดเส้นทางที่อยู่ IP ตามความต้องการของคุณ ตัวอย่างเช่นคำสั่งต่อไปนี้จะทำให้แพ็กเก็ตทั้งหมดเป็น 1.2.3 xและ 1.2.4.2 ไปผ่านppp0และแพ็คเก็ตอื่น ๆ eth0ที่จะไปผ่าน

route add -net 1.2.3.4/24 ppp0
route add -host 1.2.4.2 ppp0
route add -net 0.0.0.0/0 eth0

สำหรับความต้องการที่ซับซ้อนมากขึ้นคุณจะต้องเริ่มใช้และiptables ip routeตัวอย่างเช่นคำสั่งต่อไปนี้ตั้งค่าตารางการเราต์พิเศษเพื่อให้แพ็คเก็ตทั้งหมดที่ทำเครื่องหมาย 1 ออกไปeth0และแพ็คเก็ตทั้งหมดที่ทำเครื่องหมาย 2 ออกไปทางppp0(ยกเว้นแพ็คเก็ตนั้นมีไว้สำหรับlocalhostติดกับอินเตอร์เฟซย้อนกลับ)

ip rule add fwmark 1 table 1
ip route add 127.0.0.0/0 table 1 dev lo
ip route add 0.0.0.0/0 table 1 dev eth0
ip rule add fwmark 2 table 2
ip route add 127.0.0.0/8 table 2 dev lo
ip route add 0.0.0.0/0 table 2 dev ppp0

ตอนนี้คุณสามารถใช้iptablesเพื่อ "ตัด" แพ็กเก็ตขาออกเพิ่มเครื่องหมายที่จะตัดสินใจเส้นทางที่พวกเขาใช้ ยกตัวอย่างเช่นที่นี่เป็นวิธีที่จะส่งการจราจรขาออก SMTP (พอร์ต 25) ผ่านทางeth0และการจราจรทั้งหมดเกิดขึ้นโดยโปรแกรมประยุกต์ที่ทำงานเป็นผู้ใช้ผ่านทางproxyppp0

iptables -t mangle -A OUTPUT -p tcp --dport 25 -j MARK --set-mark 1
iptables -t mangle -A OUTPUT -m owner --uid-owner proxy -j MARK --set-mark 2

ดูเพิ่มเติม2 อินเตอร์เฟสเครือข่ายที่เชื่อมต่อกับอินเทอร์เน็ต เลือกหนึ่งที่จะใช้ตามชื่อโดเมนและซอฟต์แวร์ที่ผูกไว้กับการเชื่อมต่อเครือข่ายที่แตกต่างกัน


คุณจะต้องจัดการให้คำสั่งเหล่านี้ทำงานเมื่อเชื่อมต่อทั้งสองอินเตอร์เฟส ฉันแนะนำให้คุณเขียนสคริปต์ที่เรียก/etc/network/if-up.d/0justin-routesใช้คำสั่งที่คุณต้องการ สคริปต์นี้จะถูกเรียกใช้งานเมื่อใดก็ตามที่มีการเชื่อมต่อเครือข่าย เมื่อชื่อเริ่มต้นด้วยชื่อ0จะรัน แต่เนิ่นๆในกระบวนการนั้นก่อนการตั้งค่าเฉพาะแอปพลิเคชันที่อาจคาดว่าเส้นทางจะเข้าที่ มีความสมมาตร/etc/network/if-down.d/ในกรณีที่คุณต้องการทำสิ่งต่าง ๆ เมื่ออินเทอร์เฟซตัวใดตัวหนึ่งลงมา (เส้นทางที่เกี่ยวข้องทั้งหมดจะถูกลบโดยอัตโนมัติซึ่งอาจทำให้บางแพ็กเก็ตติดค้างเมื่อคุณต้องการที่จะถอยกลับไปที่อินเทอร์เฟซอื่น ๆ )

สคริปต์ ifup interfaces(5) man pageจะถูกบันทึกไว้ใน IFACEสิ่งสำคัญที่ต้องรู้คือว่าชื่อของอินเตอร์เฟซจะถูกนำขึ้นหรือลงในตัวแปร environement คุณจะพบว่าไม่ว่าจะเป็นอินเตอร์เฟซที่อื่น ๆ if ifconfig | sed 's/ .*//' | grep -Fqx 'eth0'; then …ที่มีอยู่แล้วขึ้นมาด้วย


@ จัสติน: นี่ไม่ใช่สิ่งที่ฉันมีประสบการณ์มากด้วยดังนั้นโปรดให้ข้อเสนอแนะเกี่ยวกับสิ่งที่ทำงานอะไรที่ไม่ทำงานสิ่งที่คุณไม่เข้าใจ ฯลฯ
Gilles 'ดังนั้น - หยุดความชั่วร้าย'

1
ฉันมีสองส่วนเพิ่มเติมที่ต้องทำ: อันดับแรกสิ่งนี้จะส่งทราฟฟิกใน ppp0 พร้อมที่อยู่แหล่งที่มาจาก eth0 คุณสามารถเปลี่ยนแปลงสิ่งนี้ได้โดยใช้: iptables -t nat -A POSTROUTING -o tun0 -j SNAT --to-source ppp_ip, ที่ppp_ipอยู่ IP ของอะแดปเตอร์นั้นอยู่ที่ไหน ประการที่สองคุณจะต้องปิดที่เข้มงวดที่rp_filter /proc/sys/net/ipv4/config/ppp0/rp_filterมันจะทำงานเมื่อตั้งโหมดผ่อนคลายซึ่งเป็น 2
Karalga
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.