Mam serwer z systemem Ubuntu Server z czterema adresami IP przypisanymi do jednej karty sieciowej.
eth0 192.168.1.100
eth0:0 192.168.1.101
eth0:1 192.168.1.102
eth0:2 192.168.1.103
(Używając 192.168.xx dla przykładu, załóżmy, że są one NAT -owane dla szeregu publicznych adresów IP)
Jeden z naszych klientów publikuje swoje zapasy za pośrednictwem FTP, więc logujemy się co noc, aby pobrać duży plik z ich serwera. Zapora ogniowa oczekuje, że nasze (pasywne) połączenie FTP zostanie nawiązane z 192.168.1.100.
Biorąc pod uwagę, że mój serwer ma logicznie cztery adresy IP na jednym adapterze, w jaki sposób system operacyjny określa, który adres IP jest używany jako źródło dla wychodzących połączeń TCP / IP?
Powiedzmy, że ssh na mój serwer 192.168.1.101 i uruchamiam FTP interaktywnie. Czy wychodzące połączenie TCP / IP będzie używać 192.168.1.101, ponieważ system operacyjny wie, że jest to interfejs, przez który jest połączona moja powłoka?
Co się stanie, jeśli zadanie FTP jest uruchamiane nieinteraktywnie za pośrednictwem zadania cron, w którym nie ma powłoki?
Jak zapewne możesz powiedzieć, to mnie bardzo zagubiło, więc mam nadzieję, że moje pytania przynajmniej miały sens.
Edytować
Aby wyjaśnić, dlaczego pytam - nie wprowadziłem żadnych zmian w tabeli routingu i faktycznie wyświetla ona „eth0” jako IFace dla tras 0.0.0.0. Jednak wszystko wskazuje na to, że faktycznie używa on eth0: 0 jako źródła.
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
Mogę majstrować przy tablicy routingu lub zlecić naszemu klientowi zmianę reguł zapory, aby uzyskać potrzebne zachowanie, ale staram się uzyskać trochę wglądu, jak to działa, aby wiedzieć, czy w systemie operacyjnym jest błąd, czy po prostu naiwne zrozumienie jak wszystkie elementy pasują do siebie.
Dzięki
Widzę w twoim przykładzie, że wszystkie IP są zbyt blisko, aby nie być w tej samej sieci
czy jesteś pewien, że faktycznie korzystasz z wielu usług i nie masz po prostu 4 aliasów IP?
jeśli to drugie, to możesz ustawić źródłowy ip na trasie z czymś podobnym do tego
zobacz interfejsy man, jak sprawić, by było trwałe między restartami
źródło
Używa wszystkiego, co domyślna brama znajduje się w tabeli routingu, chyba że istnieje konkretna trasa, która nakazuje jej użycie innej:
route -n
EDYCJA: Zbyt szybko przeczytałem twoje pytanie ...
Ponieważ używasz trybu pasywnego, a klient zawsze będzie inicjował połączenie, myślę, że pole src ip w nagłówku IP będzie zawsze wyświetlane jako dowolne IP, z którym klient się podłączył. Gdyby to był tryb aktywny, serwer inicjowałby połączenie, myślę, że zawsze byłby to „podstawowy” adres IP. Jeśli twoje adresy znajdują się w tej samej podsieci, Linux sprawi, że pierwszy adres, który dodałeś, będzie „Podstawowy”, a pozostałe dodatkowe.
Nie jestem jednak do końca pewien, uruchomiłbym tcpdump -n i zobaczyłby to, co widzi jako adres IP src.
EDIT2: OK, napisałem powyższe z punktu widzenia, że działałeś na serwerze, więc ponieważ jesteś klientem i inicjujesz połączenie, myślę, że zawsze będzie pochodzić z podstawowego adresu IP, ale ponownie spróbuj i zobacz z tcpdump.
źródło
Chyba że twoje zadanie FTP ma sposób na określenie interfejsu używanego do połączeń, uważam, że domyślnie jest to pierwszy fizyczny interfejs w odpowiedniej podsieci (w tym przypadku eth0). Jeśli masz serwer z dwiema kartami sieciowymi w różnych podsieciach, na podstawie tabeli routingu dowiesz się, którego interfejsu użyć.
Ponieważ w systemie jest tylko jeden interfejs fizyczny (eth0) i cztery wirtualne / aliasy (od eth0: 0 do eth0: 2) w tej samej podsieci, ruch wychodzący użyje adresu IP eth0 jako źródła, chyba że aplikacja jest wystarczająco inteligentna zadeklarować interfejs wychodzący.
źródło
nc -s <ip of eth0:2>
cokolwiek lub zawsze pokazuje, że adres źródłowy jest w rzeczywistości ip et0: 0, nawet jeśli netcat robił tobind(2)
wcześniejconnect(2)
. Wygląda więc na to, że aliasy nie działają w celu umożliwienia maszynie nawiązywania połączeń z wielu adresów źródłowych.Możesz zobaczyć, które urządzenie i adres IP src będą używane przez polecenie ip route get, tak jak poniżej:
Nie próbowałem tego w środowisku aliasu, ale mam nadzieję, że to pomoże.
źródło
Podczas ustanawiania połączenia wychodzącego serwer zajrzy do swojej tabeli routingu, aby określić, którego z czterech interfejsów użyć; połączenia TCP będą miały źródłowy adres IP interfejsu wyjściowego.
Otrzymasz dane wyjściowe z tabeli routingu; poszukaj konkretnych wpisów pasujących do adresu IP klienta, z którym próbujesz się połączyć. Jeśli nie istnieje, użyjesz domyślnej trasy (0.0.0.0, maska 0.0.0.0). Jeśli masz wiele tras domyślnych, wybrana zostanie ta o najniższym koszcie.
źródło