Linux: Czy istnieje wygodny sposób na wykonanie programu wiążącego go z wybranym adresem IP?


11

W FreeBSD 4.9 było to bardzo łatwe do wykonania za pomocą jednego polecenia takiego jak

jail [-u username]  path hostname ip-number command

jeśli ścieżka była /uruchomiona tak samo jak zwykle, ale cała komunikacja sieciowa była ograniczona do używania tylko podanego adresu IP jako źródła. Czasami jest to bardzo przydatne.

Teraz w Linuksie jest LXC, który wygląda bardzo podobnie do jailstref FreeBSD (lub stref Solaris) - czy możesz pomyśleć o podobnym sposobie wykonania programu?


W jakim programie próbujesz to zrobić? Wiele programów jest na tyle konfigurowalnych, że można im powiedzieć, z którym adresem IP się połączyć.
Warren Young,

@WarrenYoung, Dzięki KO, ale „many”! = „All”
poige

Dobrym przykładem użycia „więzienia” pliku wykonywalnego w celu użycia określonego adresu IP jest uruchomienie wielu serwerów gier na jednym komputerze w sieci LAN. Np. Gry Valve nadają tylko na portach 27015-27020, więc na adres IP można mieć tylko 6 serwerów. Więc dodajesz wirtualne adresy IP do karty sieciowej, ale musisz podać „+ ip <adres>” w wierszu poleceń serwera gry, który przestaje rozgłaszać swoją obecność klientom => brak serwerów widocznych w przeglądarce LAN. Więc „+ ip” nie będzie działać. Dlatego musimy uwięzić każdy serwer w środowisku, w którym może znaleźć tylko 1 adres IP. Wynik: brak limitu w # serwerach + klientach widzi wszystkie serwery.
Timmos

Odpowiedzi:


12

Rozpoczęcie procesu w sieciowej przestrzeni nazw, która może zobaczyć tylko żądany adres IP, może osiągnąć coś podobnego. Na przykład, przypuszczalnie chciałem, aby localhost był dostępny tylko dla określonego programu.

Najpierw tworzę przestrzeń nazw sieci:

ip netns add limitednet

Przestrzenie nazw mają domyślnie interfejs sprzężenia zwrotnego, więc teraz muszę go tylko wywołać:

sudo ip netns exec limitednet ip link set lo up

Teraz mogę uruchomić program za pomocą ip netns exec limitedneti będzie on mógł zobaczyć tylko interfejs pętli zwrotnej:

sudo ip netns exec limitednet ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever

Gdybym chciał ograniczyć go do adresu innego niż localhost, mógłbym dodać inne interfejsy do przestrzeni nazw, używając:

ip link set DEVICE_NAME netns NAMESPACE

Musiałbym trochę więcej eksperymentować, aby dowiedzieć się, jak dodać pojedynczy adres IP do przestrzeni nazw w przypadku, gdy interfejs może mieć więcej niż jeden adres IP

Artykuł LWN na przestrzeni nazw jest również pomocne.


Warto jednak wspomnieć, że wymagałoby to znacznie więcej przygotowań, ponieważ przestrzeń nazw sieci ma swoją własną tabelę routingu i tak dalej. Jeśli ktoś przyjmie prostszy sposób naśladowania jail, skorzystam z niego. ;)
poige
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.