Saya memiliki server yang menjalankan Ubuntu Server dengan empat alamat IP alias pada NIC tunggal.
eth0 192.168.1.100
eth0:0 192.168.1.101
eth0:1 192.168.1.102
eth0:2 192.168.1.103
(Menggunakan 192.168.xx misalnya, anggap ini adalah NAT-ed ke berbagai alamat IP publik)
Salah satu klien kami menerbitkan inventaris mereka melalui FTP, jadi kami masuk setiap malam untuk mengunduh file besar dari server mereka. Firewall mereka mengharapkan koneksi FTP (pasif) kami dibuat dari 192.168.1.100.
Mengingat server saya secara logis memiliki empat alamat IP pada satu adaptor, bagaimana sistem operasi menentukan alamat IP mana yang digunakan sebagai sumber untuk koneksi TCP / IP keluar?
Katakanlah saya ssh ke server saya pada 192.168.1.101 dan menjalankan FTP secara interaktif. Akankah koneksi TCP / IP keluar menggunakan 192.168.1.101 karena OS tahu itu adalah antarmuka di mana shell saya terhubung?
Bagaimana jika tugas FTP dijalankan secara non-interaktif melalui tugas cron di mana tidak ada shell?
Seperti yang mungkin bisa Anda katakan, ini membuat saya agak bingung, jadi saya harap pertanyaan saya setidaknya masuk akal.
Edit
Untuk mengklarifikasi mengapa saya bertanya - saya belum membuat perubahan apa pun pada tabel routing dan itu sebenarnya mencantumkan 'eth0' sebagai IFace untuk rute 0.0.0.0. Namun, semua indikasi adalah bahwa sebenarnya menggunakan eth0: 0 sebagai sumber.
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
Saya bisa mengutak-atik tabel routing atau meminta klien kami mengubah aturan firewall mereka untuk mendapatkan perilaku yang saya butuhkan, tapi saya mencoba untuk mendapatkan sedikit wawasan tentang bagaimana ini bekerja untuk mengetahui apakah ada bug di OS atau hanya pemahaman naif saya bagaimana semua bagian saling cocok.
Terima kasih
Saya melihat dalam contoh Anda bahwa semua ips terlalu dekat untuk tidak berada di jaringan yang sama
apakah Anda yakin benar-benar multihoming dan tidak hanya memiliki 4 alias IP?
jika yang terakhir terjadi maka Anda dapat mengatur sumber ip pada rute dengan sesuatu yang mirip dengan ini
lihat antarmuka manusia tentang cara membuatnya tetap di antara reboot
sumber
Ini menggunakan apa pun default gateway di tabel routing, kecuali ada rute tertentu yang memerintahkannya untuk menggunakan yang lain:
route -n
EDIT: Saya membaca pertanyaan Anda terlalu cepat ...
Karena Anda menggunakan mode pasif dan klien akan selalu memulai koneksi, saya pikir bidang src ip di header IP akan selalu muncul sebagai IP apa pun yang terhubung dengan klien. Jika itu adalah mode aktif server memulai koneksi, saya pikir itu akan selalu menjadi IP 'Primer'. Jika alamat Anda berada di subnet yang sama, Linux akan membuat alamat pertama yang Anda tambahkan 'Primer' dan yang lainnya sekunder.
Saya tidak sepenuhnya yakin, saya akan menjalankan tcpdump -n dan melihat apa yang dilihatnya sebagai IP src.
EDIT2: Oke, saya menulis di atas dari sudut pandang bahwa Anda menjalankan server, jadi karena Anda adalah klien dan memulai koneksi, saya pikir itu akan selalu tampak berasal dari alamat IP Primer, tetapi sekali lagi, coba dan lihat dengan tcpdump.
sumber
Kecuali jika pekerjaan FTP Anda memiliki cara untuk menentukan antarmuka yang akan digunakan untuk koneksi, saya yakin itu default ke antarmuka fisik pertama pada subnet yang relevan (eth0 dalam kasus ini). Jika Anda memiliki server dengan dua NIC pada subnet yang berbeda, ia akan mencari tahu antarmuka mana yang digunakan berdasarkan tabel routing.
Karena hanya ada satu antarmuka fisik tunggal pada sistem (eth0) dan empat virtual / alias (eth0: 0 hingga eth0: 2) pada subnet yang sama, lalu lintas keluar akan menggunakan alamat IP eth0 sebagai sumber kecuali jika aplikasi cukup pintar untuk mendeklarasikan antarmuka keluar.
sumber
nc -s <ip of eth0:2>
atau apa pun yang selalu menunjukkan alamat sumber sebenarnya adalah ip dari eth0: 0, meskipun netcat melakukanbind(2)
sebelumnyaconnect(2)
. Jadi sepertinya alias tidak berfungsi untuk memberikan mesin kemampuan untuk membuat koneksi dari beberapa alamat sumber.Anda bisa melihat alamat ip perangkat dan src mana yang akan digunakan oleh perintah ip route get seperti di bawah ini:
Saya belum mencoba ini di lingkungan alias, tetapi berharap ini bisa membantu.
sumber
Saat membuat koneksi keluar, server Anda akan melihat dalam tabel peruteannya untuk menentukan yang mana dari empat antarmuka Anda untuk digunakan; koneksi TCP Anda akan memiliki sumber IP dari antarmuka keluar Anda.
Akan memberi Anda output dari tabel routing Anda; cari entri tertentu yang cocok dengan IP klien yang Anda coba sambungkan. Jika tidak ada, maka Anda akan menggunakan rute default (0.0.0.0, mask 0.0.0.0). Jika Anda memiliki beberapa rute default, rute dengan biaya terendah akan menjadi yang digunakan.
sumber