Mengapa lalu lintas jaringan Linux hanya melalui eth0?

20

Saya mendapat dua NIC di sisi server, eth0? 192.168.8.140 dan eth1? 192.168.8.142. Klien mengirim data ke 192.168.8.142, dan saya berharap iftopuntuk menunjukkan lalu lintas untuk eth1, tetapi tidak. Semua jaringan melewati eth0, jadi bagaimana saya bisa menguji dua NIC?

Mengapa semua lalu lintas melewati eth0 bukan eth1? Saya berharap saya bisa mendapatkan 1 Gbit / s per antarmuka. Apa yang salah dengan pengaturan atau konfigurasi saya?

Server

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

Sisi server

# 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!

Klien

# 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!

Sisi server

$ 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
Wener
sumber
1
Kedengarannya seperti apa yang sebenarnya Anda cari adalah pengikatan antarmuka: wiki.linuxfoundation.org/networking/bonding
Flexo
@flexo sepenuhnya benar - tergantung pada tujuan akhir Anda, menyatukan dua antarmuka jaringan secara bersamaan dapat memberi Anda lebih banyak bandwidth secara keseluruhan, tetapi opsi ikatan bervariasi. Yang terbaik yang bisa Anda dapatkan adalah 2 aliran ~ 1 Gbit, dan bukan 1 aliran 2 Gbit. Plus, Anda memerlukan layanan sakelar ethernet terkelola. Demikian juga, bonding 4 dapat memberikan aliran 4x1 Gbit sekaligus.
Criggie

Jawaban:

32

Ada dua model desain yang mungkin untuk tumpukan jaringan TCP / IP: model host yang kuat dan model host yang lemah. Anda mengharapkan perilaku yang cocok dengan model host yang kuat. Linux dirancang untuk menggunakan model host yang lemah. Secara umum model host yang lemah lebih umum karena mengurangi kompleksitas kode routing dan dengan demikian mungkin menawarkan kinerja yang lebih baik. Kalau tidak, kedua model host hanyalah prinsip desain yang berbeda: tidak ada yang secara inheren lebih baik daripada yang lain.

Pada dasarnya, model host yang lemah berarti bahwa lalu lintas keluar akan dikirim keluar antarmuka pertama yang tercantum dalam tabel routing yang cocok dengan alamat IP tujuan (atau gateway yang dipilih, jika tujuan tidak dapat dicapai secara langsung), tanpa memperhatikan sumber IP alamat .

Ini pada dasarnya mengapa umumnya tidak disarankan untuk menggunakan dua antarmuka fisik yang terpisah jika Anda memerlukan dua alamat IP pada segmen jaringan yang sama. Alih-alih menetapkan dua alamat IP untuk satu antarmuka (alias IP: mis. Eth1 = 192.168.8.142 dan eth1: 0 = 192.168.8.140). Jika Anda membutuhkan bandwidth lebih dari yang dapat disediakan oleh satu antarmuka, buatlah ikatan (atau tim, jika ada) dua atau lebih antarmuka secara bersamaan, dan kemudian jalankan kedua IP pada ikatan / tim.

Dengan mengubah sejumlah pengaturan sysctl dan menggunakan fungsionalitas "perutean lanjutan" untuk mengatur tabel perutean independen untuk setiap NIC, dimungkinkan untuk membuat Linux berperilaku seperti sistem model tuan rumah yang kuat. Tetapi itu adalah konfigurasi yang sangat khusus, dan saya akan merekomendasikan berpikir dua kali sebelum mengimplementasikannya.

Lihat jawabannya di Linux Source Routing, Strong End System Model / Strong Host Model? jika Anda benar-benar membutuhkannya.

telcoM
sumber
Mode default juga merupakan kejutan buruk menunggu jika mencoba untuk membentuk lalu lintas dengan iptables :)
rackandboneman
ya, saya senang menerapkan model host yang kuat di masa lalu. Itu diperlukan untuk proyek itu, tetapi saya tidak akan repot-repot melewati sakit kepala itu untuk mesin pribadi.
Baldrickk
11

Poin tambahan yang perlu dipertimbangkan adalah bahwa antarmuka eth1 dikonfigurasi dengan subnet mask dari 255.255.255.255.

Ini berarti bahwa antarmuka eth1 dikonfigurasi untuk mengharapkan tidak ada perangkat lain (host) pada antarmuka jaringannya. Ini berarti bahwa itu tidak akan dapat berkomunikasi dengan klien 192.168.8.142 Anda.

M Bend
sumber
2

Setelah banyak pencarian, saya menemukan Mengapa netcat tidak menggunakan antarmuka yang tepat terkait dengan IP? , dan ini adalah masalah yang sama. Seperti yang dikatakan @telcoM, lalu lintas keluar akan dikirim ke antarmuka pertama, dan itulah masalahnya, jadi, cara termudah untuk menyelesaikan ini adalah:

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

Rute ini akan membuat ip route get 192.168.8.135 from 192.168.8.142pengembalian eth1 bukan eth0. Maka semuanya berjalan seperti yang diharapkan.

Wener
sumber
3
Jika Anda menghilangkan pengaturan sysctl ARP yang disebutkan dalam pertanyaan yang saya ajukan, dan sedang berurusan dengan switch dan router tingkat perusahaan, admin jaringan Anda akan sedikit tidak senang dengan Anda menyebabkan pesan "alamat IP mengepak" yang tidak perlu di router, karena sistem masih dapat menjawab permintaan ARP untuk kedua IP di kedua antarmuka. Atau jika Anda memiliki perlindungan pembajakan IP dalam jaringan, itu mungkin melibatkan dan menonaktifkan semua lalu lintas ke sistem Anda.
telcoM