เมื่อใช้นามแฝง IP ระบบปฏิบัติการจะกำหนดที่อยู่ IP ใดที่จะใช้เป็นแหล่งที่มาสำหรับการเชื่อมต่อ TCP / IP ขาออก


15

ฉันมีเซิร์ฟเวอร์ที่ใช้งานเซิร์ฟเวอร์ Ubuntu ที่มีที่อยู่ IP สี่ชื่อแทนใน NIC เดียว

eth0       192.168.1.100
eth0:0     192.168.1.101
eth0:1     192.168.1.102
eth0:2     192.168.1.103

(การใช้ 192.168.xx เพื่อประโยชน์สมมติว่านี่เป็น NAT-ed ไปยังช่วงของที่อยู่ IP สาธารณะ)

ลูกค้ารายหนึ่งของเราเผยแพร่คลังโฆษณาผ่าน FTP ดังนั้นเราจึงลงชื่อเข้าใช้ทุกค่ำคืนเพื่อดาวน์โหลดไฟล์ขนาดใหญ่จากเซิร์ฟเวอร์ของพวกเขา ไฟร์วอลล์ของพวกเขาคาดว่าการเชื่อมต่อ FTP ของเราจะทำจาก 192.168.1.100

ระบุว่าเซิร์ฟเวอร์ของฉันมีที่อยู่ IP สี่อแด็ปเตอร์เดียวระบบปฏิบัติการจะกำหนดว่าที่อยู่ IP ใดที่จะใช้เป็นแหล่งที่มาสำหรับการเชื่อมต่อ TCP / IP ขาออก

สมมติว่าฉันใช้เซิร์ฟเวอร์ของฉันที่ 192.168.1.101 และเรียกใช้ FTP แบบโต้ตอบ การเชื่อมต่อ TCP / IP ขาออกจะใช้ 192.168.1.101 หรือไม่เพราะระบบปฏิบัติการรู้ว่าเป็นอินเตอร์เฟสที่เปลือกของฉันเชื่อมต่ออยู่หรือไม่

จะเกิดอะไรขึ้นถ้างาน FTP รันโดยไม่มีการโต้ตอบผ่านงาน cron ที่ไม่มีเชลล์?

อย่างที่คุณสามารถบอกได้ว่าสิ่งนี้ทำให้ฉันสับสนมากดังนั้นฉันจึงหวังว่าคำถามของฉันจะมีเหตุผลอย่างน้อย

แก้ไข

เพื่อชี้แจงเหตุผลที่ฉันถาม - ฉันไม่ได้ทำการเปลี่ยนแปลงใด ๆ กับตารางเส้นทางและจริง ๆ แล้วมันแสดงรายการ 'eth0' เป็น IFace สำหรับเส้นทาง 0.0.0.0 อย่างไรก็ตามสิ่งบ่งชี้ทั้งหมดนั้นจริง ๆ แล้วใช้ eth0: 0 เป็นแหล่งที่มา

Destination    Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.1.0    0.0.0.0         255.255.255.0   U     0      0        0 eth0
0.0.0.0        192.168.1.1     0.0.0.0         UG    100    0        0 eth0

ฉันสามารถเล่นกับตารางเส้นทางหรือลูกค้าของเราเปลี่ยนกฎไฟร์วอลล์ของพวกเขาเพื่อให้ได้พฤติกรรมที่ฉันต้องการ แต่ฉันพยายามที่จะเข้าใจอย่างถ่องแท้เกี่ยวกับวิธีการทำงานนี้เพื่อทราบว่ามีข้อผิดพลาดในระบบปฏิบัติการหรือเพียงแค่เข้าใจไร้เดียงสาของฉัน ของชิ้นส่วนทั้งหมดเข้าด้วยกันอย่างไร

ขอบคุณ

คำตอบ:


12

ตามค่าดีฟอลต์บน Linux หากอินเตอร์เฟสมีหลายแอดเดรสที่อยู่บนซับเน็ตต่างกันทราฟฟิกที่กำหนดไว้สำหรับซับเน็ตนั้นจะมี IP ต้นทางที่เหมาะสม นั่นคือถ้า eth0 มีสองที่อยู่ 192.168.1.1/24 และ 10.1.1.1/8 การรับส่งข้อมูลไปยังสิ่งใด ๆ บนซับเน็ต 10.0.0.0 จะมีแหล่งที่มา 10.1.1.1 และการรับส่งข้อมูลไปยังสิ่งใด ๆ บนซับเน็ต 192.168.1.0 จะมีแหล่งที่มา 192.168.1.1 คุณยังสามารถกำหนดที่อยู่แหล่งที่มาอย่างชัดเจนในกรณีนี้โดยใช้ตัวเลือก "src 1.2.3.4" ให้กับ "เส้นทาง IP"

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

หากคุณต้องการบังคับให้ใช้แหล่งที่อยู่เฉพาะสำหรับปลายทางที่ระบุคุณสามารถทำได้โดยใช้กฎ SNAT:

iptables -t nat -I POSTROUTING -o eth0 -d dest-IP-or-net/mask -s primary-IP-of-eth0 -j SNAT --to-source desired-source-IP

ดังนั้นหาก IP "eth0" หลักของคุณคือ 192.168.100.1 แต่คุณต้องการทราฟฟิกเป็น 1.2.3.4 เพื่อให้มีแหล่งที่มาของ 192.168.100.2 ให้ทำดังนี้

iptables -t nat -I POSTROUTING -o eth0 -d 1.2.3.4/0 -s 192.168.100.1 -j SNAT --to-source 192.168.100.2

โปรดทราบว่า "-s 192.168.100.1" เป็นสิ่งสำคัญ: จะป้องกันไม่ให้ที่อยู่แหล่งที่มาของการส่งต่อถูกเขียนใหม่โดยกฎนี้

หากคุณจะใช้การกำหนดค่าเครือข่ายที่ซับซ้อนบน Linux คุณควรอ่านเอกสารขั้นสูงของ Linux Routing and Traffic Control, http://lartc.org


ในตัวอย่างอาจแทนที่ "-d 1.2.3.4/0" ด้วย "-d 1.2.3.4/332" หรือ "-d 1.2.3.4"
คริสเตียน

5

ฉันเห็นในตัวอย่างของคุณว่า ips ทั้งหมดใกล้เกินไปที่จะไม่อยู่ในเครือข่ายเดียวกัน

คุณแน่ใจหรือไม่ว่าคุณกำลังเล่นหลายคนและไม่ได้ใช้ชื่อแทน 4 รายการเพียงอย่างเดียว

หากหลังเป็นกรณีคุณสามารถตั้งค่า IP ต้นทางบนเส้นทางที่มีบางอย่างที่คล้ายกัน

/ sbin / ip แสดงเส้นทาง 192.168.222.0/24 dev eth0 การเชื่อมโยงเคอร์เนลขอบเขต src 192.168.222.178 169.254.0.0/16 dev eth0 ขอบเขตการเชื่อมโยงเริ่มต้นผ่าน 192.168.222.1 dev eth0

sudo / sbin / ip เปลี่ยนเส้นทางเริ่มต้นผ่าน 192.168.222.1 src 192.168.222.178

/ sbin / ip แสดงเส้นทาง
192.168.222.0/24 dev eth0 โปรโตคอร์ขอบเขตการเชื่อมโยง src 192.168.222.178 169.254.0.0/16 dev eth0 ขอบเขตการเชื่อมโยงเริ่มต้นผ่าน 192.168.222.1 dev eth0 src 192.168.222.178

ดูที่อินเตอร์เฟสของมนุษย์เกี่ยวกับวิธีทำให้คงอยู่ระหว่างการรีบูต


คุณถูก. บางทีฉันอาจใช้คำว่าหลายบ้านในทางที่ผิด ศูนย์ข้อมูลของเราให้ที่อยู่ IP ทั้งหมดสี่รายการในซับเน็ตเดียวกัน
Joe Holloway

คุณรู้หรือไม่ว่าคุณสามารถแก้ไขคำถามได้
hayalci

5

มันใช้สิ่งที่เกตเวย์เริ่มต้นอยู่ในตารางเส้นทางเว้นแต่มีเส้นทางเฉพาะบอกให้ใช้อีก: route -n

แก้ไข: ฉันอ่านคำถามของคุณเร็วเกินไปดูเหมือนว่า ...

เนื่องจากคุณใช้โหมดพาสซีฟและไคลเอนต์จะเริ่มการเชื่อมต่อเสมอฉันคิดว่าฟิลด์ src ip ในส่วนหัว IP จะปรากฏเป็น IP ที่ไคลเอ็นต์เชื่อมต่ออยู่เสมอ หากเป็นโหมดที่ใช้งานเซิร์ฟเวอร์กำลังเริ่มการเชื่อมต่อฉันคิดว่ามันจะเป็น IP 'หลัก' เสมอ หากที่อยู่ของคุณอยู่ในซับเน็ตเดียวกัน Linux จะสร้างที่อยู่แรกที่คุณเพิ่ม 'หลัก' และที่อยู่รองอื่น ๆ

ฉันไม่แน่ใจว่าทั้งหมดฉันจะรัน tcpdump -n และดูว่ามันเห็นอะไรใน src IP

แก้ไข 2: โอเคฉันเขียนข้างต้นจากมุมมองที่คุณใช้เซิร์ฟเวอร์ดังนั้นเนื่องจากคุณเป็นลูกค้าและเริ่มการเชื่อมต่อฉันคิดว่ามันจะปรากฏขึ้นมาจากที่อยู่ IP หลักเสมอ แต่ลองอีกครั้งและดู ด้วย tcpdump


ตารางเส้นทางเป็นเพียงค่าเริ่มต้นและมีเครือข่ายย่อยเดียวเท่านั้น โปสเตอร์อื่นระบุว่าฉันใช้คำว่า multihoming ในทางที่ผิด อย่างไรก็ตามฉันยังคาดหวังว่าจะใช้นามแฝงของ eth0 ฉันใช้ wget เพื่อดาวน์โหลดwhatsmyip.netและแสดงให้ฉันเห็นว่าฉันใช้ eth0: 0 แทน
Joe Holloway

แต่นั่นไม่ได้ทำให้รู้สึกจริงๆกับผม whatsmyip.net ควรจะแสดง IP สาธารณะของคุณ ...
ไคล์ Brandt

เพื่อให้ชัดเจนยิ่งขึ้นจะแสดงที่อยู่ IP สาธารณะที่เป็น NAT-ed ต่อ IP ส่วนตัวที่เกี่ยวข้องกับ eth0: 0 ในขณะที่ฉันคาดหวังว่ามันจะแสดงที่อยู่ IP สาธารณะที่เป็น NAT-ed ต่อ IP ส่วนตัวที่เกี่ยวข้องกับ eth0
โจฮอลโลเวย์

1
คำตอบนี้ถูกยกขึ้นมากเกินไปและมีการแก้ไขและสร้างความสับสนหลายอย่างและไม่ช่วยอะไร คำตอบของ tbman และ jknapka นั้นยอดเยี่ยมและช่วยฉันอย่างมาก
คริสเตียน

4

นอกเสียจากงาน FTP ของคุณมีวิธีระบุอินเทอร์เฟซที่จะใช้สำหรับการเชื่อมต่อฉันเชื่อว่ามันจะเป็นค่าเริ่มต้นไปยังอินเทอร์เฟซแรกบนเครือข่ายย่อยที่เกี่ยวข้อง (eth0 ในกรณีนี้) หากคุณมีเซิร์ฟเวอร์ที่มี NIC สองตัวบนเครือข่ายย่อยที่แตกต่างกันมันจะหาว่าอินเทอร์เฟซใดที่จะใช้ตามตารางเส้นทาง

เนื่องจากมีเพียงฟิสิคัลอินเตอร์เฟสเดียวบนระบบ (eth0) และสี่ virtuals / aliases (eth0: 0 ถึง eth0: 2) บนซับเน็ตเดียวกันการรับส่งข้อมูลขาออกจะใช้ที่อยู่ IP ของ eth0 เป็นแหล่งที่มาเว้นแต่ว่าแอปพลิเคชันนั้นฉลาดพอ เพื่อประกาศอินเตอร์เฟสขาออก


2
นี่คือสมมติฐานของฉัน แต่การทดสอบทั้งหมดของฉันระบุว่ามันใช้ eth0: 0 เป็นแหล่งข้อมูล
Joe Holloway

จากนั้นอาจกำหนดเส้นทางเริ่มต้นให้ใช้อินเตอร์เฟส eth0: 0 ฉันมีการติดตั้งที่ใช้อีเธอร์เน็ตบริดจ์และได้รับการกำหนดค่าให้ใช้อินเตอร์เฟสบริดจ์เสมือนสำหรับเส้นทางเริ่มต้น
sysadmin1138

ฉันตั้งค่าโปรแกรมเบ็ดเตล็ดบนเครื่องอื่นเพื่อพิมพ์ IP ที่ได้รับการเชื่อมต่อจาก การเชื่อมต่อกับมันด้วยnc -s <ip of eth0:2>หรือสิ่งที่มักจะแสดงให้เห็นถึงแหล่งที่อยู่ที่เป็นจริง IP ของ eth0 นี้: 0 แม้ว่า netcat ได้ก่อนbind(2) connect(2)ดังนั้นดูเหมือนว่าชื่อแทนจะไม่ทำงานเพื่อให้เครื่องมีความสามารถในการเชื่อมต่อจากแหล่งที่อยู่หลายแห่ง
Peter Cordes

4

คุณสามารถดูว่าอุปกรณ์ใดและที่อยู่ IP ของ src จะถูกใช้โดย ip route get command ดังด้านล่าง:

$ /sbin/ip route get 1.1.1.1
1.1.1.1 via 2.2.2.2 dev eth0  src 2.2.2.2 
    cache  mtu 1500 advmss 1460 hoplimit 64

ฉันไม่ได้ลองสิ่งนี้ในสภาพแวดล้อมที่เป็นนามแฝง แต่หวังว่าจะช่วยได้


1

เมื่อสร้างการเชื่อมต่อขาออกเซิร์ฟเวอร์ของคุณจะดูในตารางการกำหนดเส้นทางเพื่อกำหนดว่าจะใช้อินเตอร์เฟสใดในสี่อินเตอร์เฟส การเชื่อมต่อ TCP ของคุณจะมี IP ต้นทางของอินเตอร์เฟสการออก

netstat -rn

จะให้ผลลัพธ์ของตารางเส้นทางของคุณ ค้นหารายการเฉพาะที่ตรงกับ IP ไคลเอ็นต์ที่คุณพยายามเชื่อมต่อ หากไม่มีอยู่คุณจะใช้เส้นทางเริ่มต้น (0.0.0.0, mask 0.0.0.0) หากคุณมีเส้นทางเริ่มต้นหลายเส้นทางเส้นทางที่มีต้นทุนต่ำที่สุดจะเป็นเส้นทางที่ใช้

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