beberapa antarmuka fisik dengan IP pada subnet yang sama

13

Saya memiliki kotak linux dengan 9 NIC di atasnya, dan saya ingin delapan dari mereka memiliki alamat unik pada subnet yang sama, misalnya:

ifconfig eth1 192.168.123.1 netmask 255.255.0.0
ifconfig eth2 192.168.123.2 netmask 255.255.0.0
ifconfig eth3 192.168.123.3 netmask 255.255.0.0
...
ifconfig eth8 192.168.123.8 netmask 255.255.0.0

Perilaku ARP default sangat kontraproduktif dalam kasus ini, karena menghasilkan semua lalu lintas untuk semua IP yang melewati secara eksklusif eth1, yang merupakan kebalikan dari apa yang saya inginkan.

Jadi saya mencari-cari dan akhirnya membuat beberapa perubahan pada sysctl seperti ini:

net.ipv4.conf.all.arp_filter=1
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2

Itu memang mencegah eth1dari meniru semua yang lain, tapi aku masih tidak bisa melakukan ping selain eth1alamat. (mis. dari komputer kedua pada sakelar yang sama, hanya 192.168.123.1merespons ping)

Saya menduga bahwa saya perlu melakukan sesuatu dengan arptables atau iproute atau SESUATU, tetapi saya tersesat di bidang ini.

Poin Bonus: Solusi harus kompatibel dengan Linux 2.6.27.27. (Lebih khusus, Slax 6.1.2)

frustrated_tester
sumber
Bisakah Anda memposting tabel routing?
ponsfonze
2
Apa tujuan Anda membuat konfigurasi ini? Apa yang ingin Anda capai?
David Schwartz
kegilaan cara ini terletak.
Sirex
jika Anda ingin mengikat antarmuka ini, Anda harus mengikatnya.
resmon6
1
@ Davidvidchwartz Tidak, mesin tidak seharusnya bertindak seperti saklar (atau router). Anggap saja lebih seperti menjalankan 8 mesin virtual dengan NIC fisik khusus untuk setiap VM ( Catatan: Saya tidak menjalankan VM, ini hanya analogi ). Dari sudut pandang kotak lain di jaringan yang sama, PC tunggal saya harus benar-benar tidak dapat dibedakan dari delapan PC terpisah.
frustrated_tester

Jawaban:

17

Anda memerlukan model sistem akhir yang kuat . Linux pada dasarnya dibangun di sekitar model sistem pengiriman yang lemah, jadi itu benar-benar bukan pilihan OS yang baik untuk aplikasi ini.

Anda harus memalsukan setiap bagian dari perilaku yang Anda butuhkan, dari ARP ke perutean kebijakan ke pemilihan alamat sumber. Anda juga akan memerlukan filter untuk mencegah paket diterima jika mereka tiba di antarmuka yang salah.

Langkah-langkah yang pasti diperlukan adalah:

  1. Konfigurasikan arp_filter = 1 dan arp_ignore = 2 pada semua antarmuka.

  2. Tambahkan per-antarmuka, perutean berbasis sumber untuk lalu lintas keluar. (Antarmuka tujuan harus dipilih berdasarkan alamat sumber.)

  3. Tambahkan pemfilteran masuk antarmuka per-antarmuka untuk secara diam-diam menjatuhkan paket yang diterima pada antarmuka yang salah. (Paket dengan alamat tujuan yang ditetapkan untuk antarmuka lain.)

Sayangnya, tidak ada konsensus tentang apakah ketiga langkah ini adalah yang diperlukan. Model sistem ujung lemah dibangun ke dalam seluruh Linux TCP / IP stack, dan tidak jelas apa yang salah dengan masalah halus seperti multicast.

Tidak jelas bagaimana Anda akan memilih antarmuka output untuk siaran, misalnya. Haruskah itu keluar dari mereka semua? Mungkin. Apa perilaku yang benar jika stack mendapat siaran keluar dengan alamat sumber yang tidak ditugaskan ke salah satu antarmuka?

Sekali lagi, Anda telah memilih alat yang salah untuk pekerjaan itu.

David Schwartz
sumber
6

Anda lebih mungkin ingin membuat jembatan dengan antarmuka 8/9 dan kemudian menetapkan alamat IP ke jembatan itu (paket bridge-utils, perintah 'brctl add').

Dengan cara ini bridge akan bertindak seperti saklar dan dapat memiliki alamat IP ke dalam subnet Anda.

Be2eB
sumber
AFAIK, ini seharusnya menjadi jawaban yang benar untuk Linux. Linux mengatasi banyak masalah yang disebutkan dalam jawaban David dengan menggunakan perangkat jembatan (alias menghindari masalah L3 dengan membangun jaringan logis L2 yang lebih baik).
Dave
4

Saya akan merekomendasikan ikatan antarmuka fisik kemudian konfigurasikan semua alamat pada antarmuka terikat tunggal.

Anda juga perlu dukungan pada sakelar.

Berikut ini adalah tutorial mini yang dapat Anda gunakan untuk memulai.

bahamat
sumber
4

Tampaknya Anda menginginkan lingkungan pengujian yang setara dengan 9 mesin yang terpisah, dan percaya bahwa 9 antarmuka pada satu mesin dapat meniru itu. Di Linux tidak bisa melakukan ini melalui tumpukan tunggal untuk alasan yang dijelaskan David Schwartz. BTDT dan memiliki bekas luka. Itu cukup buruk dengan 2 antarmuka.

Solusi yang lebih baik mungkin dengan menjalankan 8 atau 9 mesin virtual diskrit di satu host Anda, dan menjembatani 8 atau 9 antarmuka ke mesin virtual ini.

Skaperen
sumber
Sumber bacaan: Pemrograman Jaringan Unix: The Sockets Networking API, oleh Stevens, Fenner, dan Rudoff. Lihat juga RFC1122 dan RFC4907.
Skaperen
0

Ya itu mungkin mengikuti saran David Schwartz:

echo -ne 0 > /proc/sys/net/ipv4/conf/all/rp_filter
echo -ne 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter
echo -ne 0 > /proc/sys/net/ipv4/conf/eth3/rp_filter

// Untuk fungsionalitas yang tepat yaitu ARP membalas dari eth1 untuk dihasilkan ketika kedua eth0 dan eth1 berada di subnet yang sama

echo -ne 0 > /proc/sys/net/ipv4/conf/all/arp_filter
echo -ne 2 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo -ne 0 > /proc/sys/net/ipv4/conf/eth0/arp_filter
echo -ne 2 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
echo -ne 0 > /proc/sys/net/ipv4/conf/eth1/arp_filter
echo -ne 2 > /proc/sys/net/ipv4/conf/eth1/arp_ignore

//Create a table called "new_rt_table" and create a routing rule that says any packet with a mark equal to '1' gets routed according to the "new_rt_table"(can name it whatever you want) table. The file /etc/iproute2/rt_tables is the only source of table names on the system. Internally, routing tables have integer identifiers.

echo 1 new_rt_table >> /etc/iproute2/rt_tables
ip rule add from all fwmark 1 table new_rt_table

// atur tabel "new_rt_table" untuk merutekan paket melalui eth1

ip route add default dev eth1 table new_rt_table
ip route show table new_rt_table

// tandai paket sehingga 'ip route' dapat merutekannya melalui eth1

iptables -F -t mangle
iptables -t mangle -I OUTPUT -s <ip addr of eth1> -o eth0 -j MARK --set-mark 1

// aktifkan dukungan untuk beberapa tabel routing dalam konfigurasi kernel.

Konfigurasi Kernel

→ Dukungan jaringan → Pilihan jaringan

[*] IP: router tingkat lanjut

[*] IP: perutean kebijakan

CONFIG_IP_ADVANCED_ROUTER

CONFIG_IP_MULTIPLE_TABLES

// langkah-langkah di atas mengarahkan ulang paket yang dimaksudkan untuk menjadi output dari eth0 untuk keluar dengan benar dari eth1.

Mohon sarankan metode lain jika ada yang berhasil.

noel av
sumber