IP takma adı verildiğinde işletim sistemi, giden TCP / IP bağlantıları için hangi IP adresinin kaynak olarak kullanılacağını nasıl belirler?


15

Ubuntu Server çalıştıran ve tek bir NIC'ye takma dört IP adresi olan bir sunucum var.

eth0       192.168.1.100
eth0:0     192.168.1.101
eth0:1     192.168.1.102
eth0:2     192.168.1.103

(Örnek olarak 192.168.xx kullanarak, bunların bir dizi genel IP adresine NAT olarak düzenlendiğini varsayın)

Müşterilerimizden biri envanterlerini FTP aracılığıyla yayınlar, bu nedenle sunucularından büyük bir dosya indirmek için her gece giriş yaparız. Güvenlik duvarları (pasif) FTP bağlantımızın 192.168.1.100'den yapılmasını bekliyor.

Sunucumun tek bir bağdaştırıcı üzerinde mantıksal olarak dört IP adresi olduğu göz önüne alındığında, işletim sistemi giden TCP / IP bağlantıları için kaynak olarak hangi IP adresinin kullanılacağını nasıl belirler?

Diyelim ki 192.168.1.101 tarihinde sunucuma ssh veriyorum ve FTP'yi etkileşimli olarak çalıştırıyorum. İşletim sistemi kabuğumun bağlı olduğu arabirim olduğunu bildiğinden, giden TCP / IP bağlantısı 192.168.1.101 kullanacak mı?

FTP görevi kabuk olmayan bir cron işi aracılığıyla etkileşimli olarak yürütülmezse ne olur?

Muhtemelen anlayabileceğiniz gibi, bu beni oldukça karıştırdı, bu yüzden umarım sorularım en azından mantıklı.

Düzenle

Neden istediğimi açıklığa kavuşturmak için - Yönlendirme tablosunda herhangi bir değişiklik yapmadım ve aslında 'eth0' 0.0.0.0 yolları için IFace olarak listeleniyor. Ancak, tüm göstergeler aslında kaynak olarak eth0: 0 kullanıyor olmasıdır.

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

Yönlendirme tablosuyla uğraşabilir veya istemcimin ihtiyacım olan davranışı elde etmek için güvenlik duvarı kurallarını değiştirmesini sağlayabilirim, ancak işletim sisteminde bir hata olup olmadığını veya sadece naif anlayışımı bilmek için bunun nasıl çalıştığı hakkında biraz bilgi edinmeye çalışıyorum. tüm parçaların birbirine nasıl oturduğuna dair

Teşekkürler

Yanıtlar:


12

Varsayılan olarak, Linux'ta, bir arabirim farklı alt ağlarda birden çok adres içeriyorsa, ilgili alt ağlar için hedeflenen trafik uygun kaynak IP'sine sahip olacaktır. Yani, eth0'ın iki adresi 192.168.1.1/24 ve 10.1.1.1/8 varsa, 10.0.0.0 alt ağındaki herhangi bir şeye giden trafiğin kaynağı 10.1.1.1 ve 192.168.1.0 alt ağındaki herhangi bir şeye giden trafiğin kaynağı olacaktır 192.168.1.1. Bu durumda kaynak adreslerini "ip yolu" na "src 1.2.3.4" seçeneğini kullanarak açıkça atayabilirsiniz.

Ancak sizin durumunuzda, tüm adresleriniz aynı alt ağdadır, bu nedenle "birincil" adres ("ip addr list dev eth0" tarafından ortaya konulduğu gibi) bu arabirimden çıkan trafik için kaynak IP olarak kullanılır. Bu durumda sadece "ip yolu" kullanarak kaynak IP'leri kontrol etmek mümkün olduğunu düşünüyorum, ancak ilgi trafiği için kaynak adreslerini yeniden yazmak için iptables kullanmak daha kolay buldum.

Belirli bir kaynak adresini belirli hedefler için kullanılmaya zorlamak istiyorsanız, bunu bir SNAT kuralıyla yapabilirsiniz:

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

Dolayısıyla, "birincil" eth0 IP'niz 192.168.100.1 ise, ancak 1.2.1.4 trafiğinin 192.168.100.2 kaynağına sahip olmasını istiyorsanız, bunu yapın:

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

"-S 192.168.100.1" 'in önemli olduğunu unutmayın: iletilen trafiğin kaynak adreslerinin bu kural tarafından yeniden yazılmasını engeller .

Linux'ta karmaşık ağ yapılandırmaları uygulayacaksanız, http://lartc.org adresindeki Linux Gelişmiş Yönlendirme ve Trafik Kontrolü belgelerini okumalısınız.


Örnekte, belki "-d 1.2.3.4/0" yerine "-d 1.2.3.4/332" veya "-d 1.2.3.4"
Christian

5

Örneğinizde tüm ips'lerin aynı ağda olmayacak kadar yakın olduğunu görüyorum

aslında çoklu ana bilgisayar olduğundan ve sadece 4 IP takma adına sahip olmadığınızdan emin misiniz?

ikinci durum söz konusuysa, kaynak ipini buna benzer bir şeyle bir rotaya ayarlayabilirsiniz.

/ sbin / ip route show 192.168.222.0/24 dev eth0 proto çekirdek kapsam bağlantısı src 192.168.222.178 169.254.0.0/16 dev eth0 kapsam bağlantısı varsayılan olarak 192.168.222.1 dev eth0

sudo / sbin / ip yolu 192.168.222.1 src üzerinden varsayılan 192.168.222.178

/ sbin / ip route show
192.168.222.0/24 dev eth0 proto çekirdek kapsam bağlantısı src 192.168.222.178 169.254.0.0/16 dev eth0 kapsam bağlantısı varsayılan olarak 192.168.222.1 dev eth0 src 192.168.222.178

yeniden başlatmalar arasında nasıl kalıcı hale getirileceğine dair insan arayüzlerini görün


Haklısın. Belki de çoklu hedef arama terimini kötüye kullanıyorum. Veri merkezimiz bize aynı alt ağda dört IP adresi veriyor.
Joe Holloway

sorunuzu düzenleyebileceğinizi biliyorsunuz, değil mi?
hayalci

5

Yönlendirme tablosundaki varsayılan ağ geçidi, başka bir yol kullanmasını bildiren belirli bir yol olmadığı sürece kullanır: route -n

EDIT: Sorunuzu çok hızlı okudum gibi görünüyor ...

Pasif modu kullandığınız ve istemci her zaman bağlantıyı başlatacağından, IP başlığındaki src ip alanının her zaman istemcinin bağlandığı IP olarak görüneceğini düşünüyorum. Sunucunun bağlantıyı başlattığı aktif mod olsaydı, her zaman 'Birincil' IP olacağını düşünüyorum. Adresleriniz aynı alt ağdaysa, Linux eklediğiniz ilk adresi 'Birincil' ve diğerlerini ikincil yapar.

Ben tamamen emin değilim ama, ben tcpdump -n çalıştırmak ve src IP olarak gördüklerini görmek.

EDIT2: Tamam, yukarıdakileri sunucuyu çalıştırdığınız açısından yazdım, bu yüzden istemci olduğunuz ve bağlantıyı başlattığınız için, her zaman Birincil IP adresinden gelmiş gibi görüneceğini düşünüyorum, ancak tekrar deneyin ve görün tcpdump ile.


Yönlendirme tablosu yalnızca varsayılan ayardır ve yalnızca bir alt ağ vardır. Başka bir poster, çoklu ana bilgisayar terimini yanlış kullandığımı gösterdi. Ancak, yine de eth0 takma adını kullanmasını beklerdim. Whatsmyip.net'i indirmek için wget kullandım ve bunun yerine bir şekilde eth0: 0 kullandığımı gösteriyor.
Joe Holloway

Bu benim için gerçekten mantıklı değil, whatsmyip.net herkese açık ipinizi göstermelidir ...
Kyle Brandt

Daha açık olmak gerekirse, eth0: 0 ile ilişkili özel IP'de NAT olarak yayınlanan genel IP adresini gösterirken, eth0 ile ilişkili özel IP'de NAT olarak yayınlanan genel IP adresini göstermesini beklerim
Joe Holloway

1
Bu cevap çok fazla onaylandı ve birçok düzenlemeyi içeriyor ve birçok şeyi karıştırıyor ve yardımcı olmuyor. TBman ve Jknapka'nın cevapları mükemmel ve bana çok yardımcı oldu.
Christian

4

FTP işinizde bağlantılar için kullanılacak arabirimi belirtmenin bir yolu yoksa, varsayılan olarak ilgili alt ağdaki ilk fiziksel arabirime (bu durumda eth0) varsayılan olduğuna inanıyorum. Farklı alt ağlarda iki NIC bulunan bir sunucunuz varsa, yönlendirme tablosuna göre hangi arabirimin kullanılacağını bulur.

Sistemde yalnızca tek bir fiziksel arabirim (eth0) ve aynı alt ağda dört sanal / takma ad (eth0: 0 - eth0: 2) olduğundan, uygulama yeterince akıllı olmadıkça giden trafik et0 IP adresini kaynak olarak kullanır giden arabirimi bildirmek için.


2
Bu benim varsayımımdı, ancak tüm testlerim kaynak olarak eth0: 0 kullandığını gösteriyor.
Joe Holloway

Sonra belki de varsayılan yol eth0: 0 arayüzünü kullanacak şekilde yapılandırılmıştır. Bir ethernet köprüsü kullanan bir yükleme var ve varsayılan rota için sanal köprü arabirimini kullanmak üzere yapılandırıldı.
sysadmin1138

Bağlantı aldığı IP'yi yazdırmak için başka bir makineye önemsiz bir program kurdum. nc -s <ip of eth0:2>Netcat bir daha bind(2)önce yapmış olsa bile, ona veya her zaman kaynak adresini gösteren bağlantı yapmak eth0: 0'ın ipidir connect(2). Öyle görünüyor ki takma adlar bir makineye birden fazla kaynak adresinden bağlantı yapma yeteneği vermek için çalışmıyor.
Peter Cordes

4

Aşağıdaki gibi ip yolu get komutu tarafından hangi cihaz ve src ip adresinin kullanılacağını görebilirsiniz:

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

Bunu takma bir ortamda denemedim, ama umarım bu yardımcı olur.


1

Giden bağlantı kurarken, sunucunuz dört arabiriminden hangisini kullanacağını belirlemek için yönlendirme tablosuna bakar; TCP bağlantılarınız çıkış arayüzünüzün kaynak IP'sine sahip olacaktır.

netstat -rn

Yönlendirme tablonuzun çıktısını verecektir; bağlanmaya çalıştığınız istemci IP'siyle eşleşen belirli girişleri arayın. Hiçbiri yoksa, varsayılan bir rota (0.0.0.0, maske 0.0.0.0) kullanacaksınız. Birden fazla varsayılan rotanız varsa, en düşük maliyetli rota kullanılan rota olacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.