Ketika IP mengatakan bagaimana OS menentukan alamat IP mana yang akan digunakan sebagai sumber untuk koneksi TCP / IP keluar?

15

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

Joe Holloway
sumber

Jawaban:

12

Secara default, di Linux, jika sebuah antarmuka memiliki beberapa alamat yang berada di subnet yang berbeda, lalu lintas yang ditujukan untuk masing-masing subnet akan memiliki IP sumber yang tepat. Yaitu, jika eth0 memiliki dua alamat 192.168.1.1/24 dan 10.1.1.1/8, maka lalu lintas ke apa pun pada subnet 10.0.0.0 akan memiliki sumber 10.1.1.1, dan lalu lintas ke apa pun pada subnet 192.168.1.0 akan memiliki sumber 192.168.1.1. Anda juga dapat menetapkan alamat sumber secara eksplisit dalam hal ini dengan menggunakan opsi "src 1.2.3.4" untuk "ip route".

Namun, dalam kasus Anda, semua alamat Anda berada di subnet yang sama, sehingga alamat "primer" (seperti yang diungkapkan oleh "ip addr list dev eth0") digunakan sebagai IP sumber untuk lalu lintas yang keluar pada antarmuka itu. Saya pikir itu mungkin untuk mengontrol sumber IP dalam hal ini hanya menggunakan "ip route", tetapi saya telah menemukan lebih mudah untuk menggunakan iptables untuk menulis ulang alamat sumber untuk lalu lintas yang menarik.

Jika Anda ingin memaksa alamat sumber tertentu untuk digunakan untuk tujuan tertentu, Anda bisa melakukannya dengan aturan 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

Jadi jika "primer" eth0 IP Anda adalah 192.168.100.1, tetapi Anda ingin lalu lintas ke 1.2.3.4 memiliki sumber 192.168.100.2, maka lakukan ini:

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

Perhatikan bahwa "-s 192.168.100.1" penting: itu mencegah alamat sumber lalu lintas diteruskan yang ditulis ulang oleh aturan ini.

Jika Anda akan mengimplementasikan konfigurasi jaringan yang rumit di Linux, Anda harus membaca dokumentasi Linux Advanced Routing dan Traffic Control, http://lartc.org

pengguna14017
sumber
Dalam sampel, mungkin ganti "-d 1.2.3.4/0" dengan "-d 1.2.3.4/332" atau "-d 1.2.3.4"
Christian
5

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

/ sbin / ip rute tampilkan 192.168.222.0/24 dev eth0 proto kernel scope link src 192.168.222.178 169.254.0.0/16 dev eth0 lingkup tautan default melalui 192.168.222.1 dev eth0

sudo / sbin / ip route replace default melalui 192.168.222.1 src 192.168.222.178

/ sbin / ip rute tampilkan
192.168.222.0/24 dev eth0 proto kernel lingkup tautan src 192.168.222.178 169.254.0.0/16 dev eth0 lingkup tautan default melalui 192.168.222.1 dev eth0 src 192.168.222.178

lihat antarmuka manusia tentang cara membuatnya tetap di antara reboot

Aleksandar Ivanisevic
sumber
Anda benar. Mungkin saya menyalahgunakan istilah multi-homing. Pusat data kami memberi kami empat alamat IP semua pada subnet yang sama.
Joe Holloway
Anda tahu bahwa Anda dapat mengedit pertanyaan Anda, bukan?
hayalci
5

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.

Kyle Brandt
sumber
Tabel routing hanya default dan hanya ada satu subnet. Poster lain menunjukkan bahwa saya menyalahgunakan istilah multihoming. Namun, saya masih berharap untuk menggunakan eth0 alias. Saya menggunakan wget untuk mengunduh whatsmyip.net dan itu menunjukkan kepada saya bahwa saya entah bagaimana menggunakan eth0: 0 sebagai gantinya.
Joe Holloway
Itu tidak benar-benar masuk akal bagi saya, whatsmyip.net harus menunjukkan ip publik Anda ...
Kyle Brandt
Untuk lebih jelas, ini menunjukkan alamat IP publik yang NAT-ed ke IP pribadi yang terkait dengan eth0: 0, sedangkan saya berharap itu menunjukkan alamat IP publik yang NAT-ed ke IP pribadi yang terkait dengan eth0
Joe Holloway
1
Jawaban di sini terlalu banyak dipilih dan mengandung banyak pengeditan dan membingungkan banyak hal dan tidak membantu. Jawaban tbman dan jknapka sangat bagus dan sangat membantu saya.
Christian
4

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.

sysadmin1138
sumber
2
Ini adalah asumsi saya, tetapi semua tes saya menunjukkan bahwa itu menggunakan eth0: 0 sebagai sumber.
Joe Holloway
Maka mungkin rute default dikonfigurasi untuk menggunakan antarmuka eth0: 0. Saya memiliki instalasi yang menggunakan jembatan ethernet, dan dikonfigurasi untuk menggunakan antarmuka jembatan virtual untuk rute default.
sysadmin1138
Saya mengatur program sepele di komputer lain untuk mencetak IP dari mana ia menerima koneksi. Menghubungkannya dengan nc -s <ip of eth0:2>atau apa pun yang selalu menunjukkan alamat sumber sebenarnya adalah ip dari eth0: 0, meskipun netcat melakukan bind(2)sebelumnya connect(2). Jadi sepertinya alias tidak berfungsi untuk memberikan mesin kemampuan untuk membuat koneksi dari beberapa alamat sumber.
Peter Cordes
4

Anda bisa melihat alamat ip perangkat dan src mana yang akan digunakan oleh perintah ip route get seperti di bawah ini:

$ /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

Saya belum mencoba ini di lingkungan alias, tetapi berharap ini bisa membantu.

tomoe
sumber
1

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.

netstat -rn

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.

Murali Suriar
sumber