เหตุใดปริมาณการใช้เครือข่าย Linux จึงต้องผ่าน eth0 เท่านั้น


20

ฉันมี NIC สองตัวที่ฝั่งเซิร์ฟเวอร์นั่นคือ eth0 ใช่ไหม 192.168.8.140 และ eth1 192.168.8.142 ลูกค้าส่งข้อมูลไปที่ 192.168.8.142 และฉันคาดว่าiftopจะแสดงปริมาณการใช้งานสำหรับ eth1 แต่ไม่ได้ เครือข่ายทั้งหมดผ่าน eth0 ดังนั้นฉันจะทดสอบ NIC ทั้งสองได้อย่างไร

ทำไมปริมาณการใช้ข้อมูลทั้งหมดถึงผ่าน eth0 แทนที่จะเป็น eth1 ฉันคาดว่าฉันจะได้ 1 Gbit / s ต่ออินเตอร์เฟส เกิดอะไรขึ้นกับการตั้งค่าหรือการกำหนดค่าของฉัน

เซิร์ฟเวอร์

ifconfig

eth0    Link encap:Ethernet  HWaddr 00:00:00:19:26:B0
        inet addr:192.168.8.140  Bcast:0.0.0.0  Mask:255.255.252.0
        inet6 addr: 0000::0000:0000:fe19:26b0/64 Scope:Link
        UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
        RX packets:45287446 errors:0 dropped:123343 overruns:2989 frame:0
        TX packets:3907747 errors:0 dropped:0 overruns:0 carrier:0
        collisions:0 txqueuelen:1000
        RX bytes:66881007720 (62.2 GiB)  TX bytes:261053436 (248.9 MiB)
        Memory:f7e00000-f7efffff

eth1    Link encap:Ethernet  HWaddr 00:00:00:19:26:B1
        inet addr:192.168.8.142  Bcast:0.0.0.0  Mask:255.255.255.255
        inet6 addr: 0000::0000:0000:fe19:26b1/64 Scope:Link
        UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
        RX packets:19358 errors:0 dropped:511 overruns:0 frame:0
        TX packets:14 errors:0 dropped:0 overruns:0 carrier:0
        collisions:0 txqueuelen:1000
        RX bytes:1772275 (1.6 MiB)  TX bytes:1068 (1.0 KiB)
        Memory:f7c00000-f7cfffff

ฝั่งเซิร์ฟเวอร์

# Listen for incomming from 192.168.8.142
nc -v -v -n -k -l 192.168.8.142 8000 | pv > /dev/null
Listening on [192.168.8.142] (family 0, port 8000)
Connection from 192.168.8.135 58785 received!

ไคลเอนต์

# Send to 192.168.8.142
time yes | pv |nc -s 192.168.8.135 -4 -v -v -n 192.168.8.142 8000 >/dev/null
Connection to 192.168.8.142 8000 port [tcp/*] succeeded!

ฝั่งเซิร์ฟเวอร์

$ iftop -i eth0
interface: eth0
IP address is: 192.168.8.140

TX:             cumm:  6.34MB   peak: 2.31Mb   rates: 2.15Mb  2.18Mb  2.11Mb
RX:                    2.55GB          955Mb           874Mb   892Mb   872Mb
TOTAL:                 2.56GB          958Mb           877Mb   895Mb   874Mb

$ iftop -i eth1
interface: eth1
IP address is: 192.168.8.142

TX:             cumm:      0B   peak:     0b   rates:     0b      0b      0b
RX:                    4.51KB         3.49Kb          3.49Kb  2.93Kb  2.25Kb
TOTAL:                 4.51KB         3.49Kb          3.49Kb  2.93Kb  2.25Kb

$ ip link show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether 00:00:00:19:26:b0 brd ff:ff:ff:ff:ff:ff
$ ip link show eth1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether 00:00:00:19:26:b1 brd ff:ff:ff:ff:ff:ff

1
ดูเหมือนสิ่งที่คุณกำลังมองหาคือการเชื่อมต่อกับอินเทอร์เฟซ: wiki.linuxfoundation.org/networking/bonding
เฟล็กโซ

@flexo ถูกต้องทั้งหมด - ขึ้นอยู่กับเป้าหมายสูงสุดของคุณการเชื่อมต่อเครือข่ายทั้งสองเข้าด้วยกันสามารถให้แบนด์วิดธ์โดยรวมมากขึ้น แต่ตัวเลือกการเชื่อมจะแตกต่างกันไป ดีที่สุดที่คุณจะได้รับคือ 2 สตรีมของ ~ 1 Gbit และไม่ใช่ 1 สตรีมจาก 2 Gbit รวมทั้งคุณต้องการบริการของสวิตช์อีเธอร์เน็ตที่มีการจัดการ เช่นเดียวกันการเชื่อม 4 สามารถให้ 4x 1 Gbit ไหลในครั้งเดียว
Criggie

คำตอบ:


32

มีสองรูปแบบการออกแบบที่เป็นไปได้สำหรับสแต็กเครือข่าย TCP / IP: โฮสต์รุ่นที่แข็งแกร่งและโฮสต์รุ่นที่อ่อนแอ คุณคาดหวังว่าพฤติกรรมที่จะตรงกับรูปแบบโฮสต์ที่แข็งแกร่ง Linux ได้รับการออกแบบให้ใช้โมเดลโฮสต์ที่อ่อนแอ โดยทั่วไปโมเดลโฮสต์ที่อ่อนแอนั้นเป็นเรื่องธรรมดามากขึ้นเนื่องจากจะช่วยลดความซับซ้อนของรหัสเส้นทางและอาจทำให้มีประสิทธิภาพที่ดีขึ้น ไม่เช่นนั้นโมเดลโฮสต์ทั้งสองจะเป็นเพียงหลักการออกแบบที่แตกต่าง: ทั้งสองแบบนั้นดีกว่ากัน

โดยทั่วไปโมเดลโฮสต์อ่อนหมายความว่าทราฟฟิกขาออกจะถูกส่งออกจากอินเตอร์เฟสแรกที่แสดงในตารางเส้นทางที่ตรงกับที่อยู่ IP ของปลายทาง (หรือเกตเวย์ที่เลือกหากปลายทางไม่สามารถเข้าถึงได้โดยตรง) โดยไม่คำนึงถึง IP ต้นทาง ที่อยู่

นี่เป็นเหตุผลที่โดยทั่วไปแล้วไม่สามารถใช้สองอินเทอร์เฟซแยกได้หากคุณต้องการที่อยู่ IP สองรายการในส่วนเครือข่ายเดียวกัน แทนที่จะกำหนดสองที่อยู่ IP สำหรับหนึ่งอินเทอร์เฟซ (นามแฝง IP: เช่น eth1 = 192.168.8.142 และ eth1: 0 = 192.168.8.140) หากคุณต้องการแบนด์วิดท์มากกว่าอินเทอร์เฟซเดียวสามารถจัดให้มีบอนด์ (หรือทีมถ้ามี) อินเทอร์เฟซสองตัวหรือมากกว่าเข้าด้วยกันแล้วเรียกใช้ IP ทั้งสองบนบอนด์ / ทีม

ด้วยการปรับแต่งการตั้งค่า sysctl จำนวนหนึ่งและการใช้ฟังก์ชั่น "การกำหนดเส้นทางขั้นสูง" เพื่อตั้งค่าตารางการเราต์ที่เป็นอิสระสำหรับแต่ละ NIC มันเป็นไปได้ที่จะทำให้ Linux ทำตัวเหมือนระบบโฮสต์ที่แข็งแกร่ง แต่นั่นเป็นการกำหนดค่าที่พิเศษมากและฉันขอแนะนำให้คิดสองครั้งก่อนที่จะนำไปใช้

ดูคำตอบได้ที่การกำหนดเส้นทางแหล่ง Linux, รูปแบบระบบปลายทางที่แข็งแกร่ง / รูปแบบโฮสต์ที่แข็งแกร่ง? ถ้าคุณต้องการมันจริงๆ


โหมดเริ่มต้นก็เป็นเรื่องที่น่าประหลาดใจเช่นกันหากพยายามที่จะกำหนดทราฟฟิกด้วย iptables :)
rackandboneman

ใช่ฉันสนุกกับการใช้โมเดลโฮสต์ที่แข็งแกร่งในอดีต มันเป็นสิ่งจำเป็นสำหรับโครงการนั้น แต่ฉันก็ไม่ต้องกังวลว่าจะปวดหัวกับเครื่องส่วนตัว
Baldrickk

11

จุดเพิ่มเติมที่ต้องพิจารณาคืออินเตอร์เฟส eth1 ถูกกำหนดค่าด้วย subnet mask จำนวน 255.255.255.255

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


2

หลังจากการค้นหาจำนวนมากฉันพบว่าทำไม netcat ไม่ใช้อินเทอร์เฟซที่เหมาะสมที่เกี่ยวข้องกับ IP และนี่คือปัญหาเดียวกัน ดังที่ @telcoM กล่าวว่าทราฟฟิกขาออกจะถูกส่งไปยังอินเทอร์เฟซแรกและนั่นคือปัญหาดังนั้นวิธีที่ง่ายที่สุดในการแก้ไขปัญหานี้คือ:

ip route add default via 192.168.8.142 dev eth1 table 142
ip rule add from 192.168.8.142 table 142

เส้นทางนี้จะip route get 192.168.8.135 from 192.168.8.142ส่งคืน eth1 แทน eth0 จากนั้นทุกอย่างทำงานตามที่คาดไว้


3
หากคุณไม่ใช้การตั้งค่า ARP sysctl ที่กล่าวถึงในคำถามที่ฉันอ้างถึงและกำลังติดต่อกับสวิตช์ระดับและเราเตอร์ระดับองค์กรผู้ดูแลระบบเครือข่ายของคุณจะไม่พึงพอใจเล็กน้อยกับคุณซึ่งทำให้ข้อความ "IP address flapping" ไม่จำเป็น ระบบอาจยังตอบรับการร้องขอ ARP สำหรับ IP ทั้งสองบนทั้งสองอินเตอร์เฟส หรือถ้าคุณมีการป้องกันการจี้ IP ในเครือข่ายอาจมีส่วนร่วมและปิดใช้งานการรับส่งข้อมูลทั้งหมดไปยังระบบของคุณ
telcoM
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.