วิธีการใช้อินเทอร์เฟซเครือข่ายต่าง ๆ สำหรับกระบวนการต่าง ๆ


59

ฉันมีเน็ตเวิร์กอินเตอร์เฟสสองตัวบน Linux PC และฉันต้องตั้งค่าอินเทอร์เฟซด้วยตนเองที่กระบวนการที่กำหนดจะใช้

โปรแกรม (Twinkle softphone) ไม่มีตัวเลือกที่คล้ายกันดังนั้นฉันเชื่อว่าต้องตั้งค่าภายนอก

ฉันจะทำมันได้อย่างไร

แก้ไข:ฉันไม่ได้พยายามทำให้กระบวนการของเซิร์ฟเวอร์เชื่อมโยงกับอินเทอร์เฟซเฉพาะ แต่เพื่อให้โปรแกรมไคลเอนต์ติดต่อเซิร์ฟเวอร์โดยใช้อินเทอร์เฟซเฉพาะ


ไคลเอนต์ใช้ bind / เชื่อมต่อเช่นกันดูที่เอกสาร bind.c.txt วิธีบังคับ ircII (เป็น irc-client programm) ไปยัง ip ที่กำหนด: 'ตัวอย่างใน bash ที่จะใช้ IP เสมือนของคุณเป็น sourceaddress ขาออกของคุณสำหรับ ircII: BIND_ADDR = "your-virt-ip" LD_PRELOAD =. / bind.so ircII '
akira

ฉันพบวิธีการที่แตกต่างกันที่นี่ฉันหวังว่าจะเป็นประโยชน์ (ฉันหวังว่าการกำหนดเส้นทางนโยบายเคอร์เนลที่อธิบายไว้จะเปิดใช้งานตามค่าเริ่มต้นในปัจจุบัน): kindlund.wordpress.com/2007/11/19/…
Savvas Radevic

คำตอบ:


48

คุณสามารถแทนที่รหัสที่รันไทม์ได้โดยใช้LD_PRELOAD (@windows คุณสามารถใช้เทคนิคที่คล้ายกันที่เรียกว่าdetoursค่อนข้างแฟนซี) สิ่งนี้จะทำอย่างไรเพื่อแจ้งให้ลิงเกอร์แบบไดนามิกทำการโหลด libs ทั้งหมดลงในกระบวนการที่คุณต้องการเรียกใช้ก่อนแล้วจึงเพิ่มส่วนบนของมัน ปกติคุณจะใช้สิ่งนี้:

% LD_PRELOAD=./mylib.so ls

และโดยที่คุณเปลี่ยนสิ่งที่lsทำ

สำหรับปัญหาของคุณฉันจะลองhttp://www.ryde.net/code/bind.c.txtซึ่งคุณสามารถใช้เช่น:

% BIND_ADDR="ip_of_ethX" LD_PRELOAD=./bind.so twinkle

นี่คือวิธีการสร้าง:

% wget http://www.ryde.net/code/bind.c.txt -O bind.c
% gcc -nostartfiles -fpic -shared bind.c -o bind.so -ldl -D_GNU_SOURCE

Howto อีกต่อไปคือhttp://daniel-lange.com/archives/53-Binding-applications-to-a-specific-IP.html

แฮ็คและเครื่องมือที่คล้ายกัน:


7
ว้าวห่าอะไรกัน +1
sinni800

1
สวัสดีนี่ดูเหมือนเป็นเคล็ดลับที่ดีจริงๆ แต่มันไม่ได้ผลสำหรับฉัน ฉันมีโมเด็ม 3G สองตัวที่เมื่อเชื่อมต่อให้เปิดสองอินเตอร์เฟส (ppp0 และ ppp1) ถ้าฉันพยายามบังคับหนึ่งในสอง IP ฉันมักจะออกไปข้างนอกด้วยอินเตอร์เฟซเดียวกัน (ฉันเห็นเพราะฉันมีสองอินสแตนซ์ของ wireshark หนึ่งสำหรับแต่ละอินเทอร์เฟซ) ฉันยังลบการแก้ไขข้อบกพร่องจาก bind.c และแน่นอนฉันเห็นว่ามีการโหลดไลบรารี "โอเวอร์โหลด" ดังนั้นฉันจึงไม่ทราบว่าทำไมจึงไม่ทำงาน
Andrea Spadaccini

3
LD_PRELOAD จะถูกละเว้นหาก UID ที่มีประสิทธิภาพของคุณไม่เหมือนกับ UID จริงของคุณ
matthias krull

force_bindโครงการโดย Catalin เมตร Boie สนับสนุน IPv6
BurnsBA

ใช้งานได้ดี แต่ต้องเพิ่ม #include <arpa / inet.h> เพื่อให้การคอมไพล์สำเร็จ
anno

31

ip netns สามารถทำได้

TL; DR: สร้างเนมสเปซเครือข่ายเชื่อมโยงอินเทอร์เฟซกับพวกเขาแล้วเรียกใช้ "ip netns exec NAME cmd ... "

เพียงแค่ตรวจสอบว่า distro ของคุณรองรับ IP netns ... (Backtrack 5r3 ไม่ในขณะที่ Kali ทำ;))

รายละเอียดเพิ่มเติม:

#create netns
ip netns add myNamespace
#link iface to netns
ip link set eth0 netns myNamespace
#set ip address in namespace
ip netns exec myNamespace ifconfig eth0 192.168.0.10/24 up
#set loopback (may be needed by process run in this namespace)
ip netns exec myNamespace ifconfig lo 127.0.0.1/8 up
#set route in namespace
ip netns exec myNamespace route add default gw 192.168.0.1
#force firefox to run inside namespace (using eth0 as outgoing interface and the route)
ip netns exec myNamespace firefox

ทำไมสิ่งนี้จึงดีกว่าการผูก IP ผ่าน LD_PRELOAD เนื่องจาก LD_PRELOAD ไม่ได้ควบคุมเส้นทางที่กระบวนการใช้ มันจะใช้เส้นทางแรก

และเนื่องจากมันใช้เส้นทางเดียวกันเสมอมันจะใช้ค่าเริ่มต้นเป็นอินเตอร์เฟสที่ลงทะเบียนกับเส้นทาง (ซึ่งไม่ใช่สิ่งที่เราต้องการ)


2
โปรดลองเพิ่มรายละเอียดเพิ่มเติมในคำตอบของคุณ
Renju Chandran chingath

4
ไม่ทำเช่นนี้บนเซิร์ฟเวอร์ระยะไกลถ้า eth0 คือการติดต่อกับเครือข่ายสาธารณะ ..
ygrek

1
บรรทัดสุดท้ายควรเป็นip netns exec myNamespace firefox
meuh

1
ใช้ "sudo ip netns del <namespace-name>" เพื่อลบ namespace เมื่อต้องการ!
Eduardo Lucio

1
@EduardoLucio มันควรจะเป็นไปได้ที่จะดำเนินการเช่น: sudo ip netns exec myNamespace su -u someUser -c firefox
olivervbk

2

ฉันไม่คิดว่าเป็นไปได้ที่จะบังคับให้กระบวนการใช้อินเทอร์เฟซบางอย่าง

อย่างไรก็ตามฉันคิดว่าคุณอาจเล่นกับ ipchain / iptables และบังคับให้พอร์ตที่กระบวนการของคุณกำลังรับฟังอยู่นั้นจะได้รับแพ็กเก็ตผ่านทางอินเทอร์เฟซเฉพาะเท่านั้น

HOWTO ที่มีประโยชน์: http://tldp.org/HOWTO/IPCHAINS-HOWTO.html


2
โพสต์ที่ได้รับคะแนนสูงกว่าสองโพสต์พิสูจน์เป็นอย่างอื่น
พอลเกียร์

2

จากคำตอบ @olivervbk ด้านล่างนี้เป็นของฉัน!

เรียกใช้คำสั่งทั้งหมดเป็น "root"

ใช้คำสั่ง ...

ip a

... เพื่อค้นหาชื่อของอินเทอร์เฟซเครือข่ายที่คุณต้องการใช้

เรียกใช้คำสั่งด้านล่างเป็นเทมเพลต ...

ip netns add [INTERFACE_NAME]_ns
ip link set dev [INTERFACE_NAME] netns [INTERFACE_NAME]_ns
ip netns exec [INTERFACE_NAME]_ns ifconfig [INTERFACE_NAME] 10.1.1.10/24 up
ip netns exec [INTERFACE_NAME]_ns ifconfig lo 127.0.0.1/8 up
ip netns exec [INTERFACE_NAME]_ns route add default gw 10.1.1.1
ip netns exec [INTERFACE_NAME]_ns dhcpcd [INTERFACE_NAME]
ip netns exec [INTERFACE_NAME]_ns sudo -b -u [YOUR_USER] [APP_NAME] 2> /dev/null 1> /dev/null &
  • [INTERFACE_NAME] - แทนที่ด้วยชื่อของอินเทอร์เฟซเครือข่ายที่เลือก
  • [YOUR_USER] - แทนที่ด้วยชื่อผู้ใช้ของคุณ
  • [APP_NAME] - ชื่อแอปพลิเคชันที่จะดำเนินการในเนมสเปซ "[INTERFACE_NAME] _ns" เช่น: "firefox"

หมายเหตุ I:แฟล็ก "-b -u" ในคำสั่ง "sudo" อนุญาตให้แอปพลิเคชันรันโดยใช้ผู้ใช้ของคุณ (ไม่ใช่ "root") และในพื้นหลังที่ปล่อยเทอร์มินัล 2> /dev/null 1> /dev/null &ข้อมูลโค้ดเพื่อป้องกันไม่ให้เอาท์พุทจาก "[APP_NAME]" ถูกพิมพ์ที่สถานี
หมายเหตุ II:ค่าของ ip "10.1.1.10" และ "10.1.1.1" นั้นเป็นกฎเกณฑ์
หมายเหตุ III:การทำงานสำหรับฉันฉันต้องเรียกใช้dhcpcd [INTERFACE_NAME]คำสั่ง

ในการลบเนมสเปซให้ใช้ ...

ip netns del [INTERFACE_NAME]_ns

... หรือ...

ip -all netns delete

... เพื่อลบสิ่งที่มีอยู่


1

โดยปกติแล้วหากโปรแกรมไม่มีตัวเลือกสำหรับการตั้งค่าส่วนต่อประสานการฟัง แต่จะเป็นการฟังบนส่วนต่อประสานทั้งหมด (คุณสามารถยืนยันสิ่งนี้ได้ด้วยlsof -i)

การสร้างกฎไฟร์วอลล์ iptables ที่ลดทราฟฟิกขาเข้าชี้ไปที่พอร์ตบนอินเตอร์เฟสที่คุณไม่ต้องการให้ปรากฏบนหน้าจอเป็นสิ่งที่ง่ายที่สุดที่จะทำ


1

ทางเลือก I:

ใช้ ld_preload เพื่อบังคับเกตเวย์ส่วนต่อประสานhttps://github.com/Intika-Linux-Network/App-Route-Jail

บังคับให้แอปพลิเคชันใช้เครือข่ายเฉพาะ

เราจำเป็นต้องค้นหาเกตเวย์ที่อินเตอร์เฟสเครือข่ายใช้อยู่แล้วบังคับให้เกตเวย์นั้นเข้าสู่แอปพลิเคชันที่ถูกจำคุกของเรา

  • วิธีค้นหาอินเตอร์เฟสเกตเวย์ (มีวิธีแก้ปัญหามากมายในการค้นหาเกตเวย์นี่คือคำสั่งบางอย่างที่อนุญาตให้ค้นหาเกตเวย์ที่ใช้)
$ route
$ route -n
$ ip rule list
$ ip route show
$ netstat -rn
$ cat /etc/network/interfaces
$ cat /etc/sysconfig/network-scripts/ifcfg-eth0
$ traceroute www.google.com
$ ip route show 0.0.0.0/0 dev eth0

ต่อแอพพลิเคชันเกตเวย์

  • สร้าง App-Route-Jail
git clone https://github.com/Intika-Linux-Network/App-Route-Jail.git
cd Approute-Utils
chown 755 make.sh
./make.sh
  • เพิ่มเส้นทางสำหรับแพ็คเก็ตที่ถูกทำเครื่องหมายในอนาคต (สำหรับแอปพลิเคชันที่ถูกจำคุก) ในตัวอย่าง192.168.1.1นี้ใช้เป็นเกตเวย์บังคับ, กฎเส้นทางนี้จะไม่ส่งผลกระทบต่อแอปพลิเคชันอื่น ๆ การจัดการนี้จะต้องทำเพียงครั้งเดียว ใช้วิธีนี้ทุกวัน
ip rule add fwmark 10 table 100
ip route add default via 192.168.1.1 table 100
  • เริ่มแอปพลิเคชันที่คุณต้องการติดคุก
MARK=10 LD_PRELOAD=./mark.so firefox
  • ทดสอบที่อยู่ IP wan
MARK=10 LD_PRELOAD=./mark.so wget -qO- ifconfig.me

ทางเลือกที่สอง:

Firejail https://firejail.wordpress.com/สามารถบังคับให้แอปพลิเคชันใช้เครือข่ายเฉพาะ แต่ความเข้ากันได้นั้นมี จำกัด

firejail --dns=8.8.8.8 --net=eth0 --ip=192.168.1.1

โปรดทราบว่าเครื่องหมายเป็นไปไม่ได้สำหรับผู้ใช้ปกติคุณต้องเรียกใช้ในฐานะรูท
jornane

-2

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

เซิร์ฟเวอร์ต่าง ๆ ในเครือข่าย IP มีที่อยู่ IP ต่างกัน เคอร์เนลควรทราบว่าอินเทอร์เฟซใดที่จะใช้ในการเข้าถึงที่อยู่ IP ที่เฉพาะเจาะจงตามตารางเส้นทาง หากคุณพยายามพูดคุยกับเซิร์ฟเวอร์สองเครื่องที่มีที่อยู่ IP เดียวกันระบบจะสับสน (เพราะอย่างอื่นมันจะทำดัชนีเฉพาะการเชื่อมต่อภายในด้วยที่อยู่ปลายทาง) คุณสามารถทำงานได้ แต่เป็นการแก้ไขในระดับระบบที่เกี่ยวข้องกับการวางเซิร์ฟเวอร์หนึ่งเครื่องในเครือข่ายแบบโลจิคัลแยกต่างหากซึ่งเชื่อมต่อกับเครื่องผ่านซอฟต์แวร์ NAT เท่านั้น

ดังนั้นหากพวกเขามีที่อยู่ IP ที่แตกต่างกันให้ใช้เส้นทางเพื่อเลือกอินเตอร์เฟซที่ถูกต้อง หากพวกเขามีที่อยู่ IP เดียวกันคุณต้องใช้ NAT เพื่อให้ปรากฏว่ามีที่อยู่ IP ที่แตกต่างกันไปยังระบบ


3
ประการแรกอาจมีเส้นทางที่ถูกต้องหลายเส้นทางระหว่างไคลเอนต์และเซิร์ฟเวอร์ แต่มีลักษณะที่แตกต่างกันซึ่งเหมาะสำหรับประเภทการรับส่งข้อมูลที่แตกต่างกัน เช่น UMTS (ข้อมูลเซลลูลาร์) อาจมีค่าใช้จ่าย แต่มีช่วงที่มากกว่า WiFi แต่ทั้งคู่ช้ากว่าการเชื่อมต่อไฟเบอร์ หากผู้ให้บริการอัปสตรีมทำการกรองแหล่งที่มา (หรือ NAT) คุณไม่มีทางเลือกนอกจากส่งอินเทอร์เฟซ 'ถูกต้อง' ประการที่สองการกำหนดเส้นทางที่มีอิทธิพลไม่ใช่เหตุผลเดียวในการเลือกที่อยู่ต้นทาง แม้ว่าที่อยู่ทั้งสองจะอยู่บนอินเทอร์เฟซเดียวกันมันก็มีประโยชน์ในการควบคุมซึ่งถูกผูกไว้เมื่อเริ่มต้นการเชื่อมต่อเช่นเดียวกับเซิร์ฟเวอร์

กรณีหนึ่งคือถ้าคุณมี IP สาธารณะที่แตกต่างกันและคุณต้องการเริ่มกระบวนการใหม่ในแต่ละการเชื่อมต่อขาออก
Rfraile
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.