Pytanie: Jak uruchomić program, upewniając się, że jego dostęp do sieci jest ograniczony przez określony interfejs sieciowy?
Przypadek: Chcę uzyskać dostęp do dwóch różnych komputerów o tym samym adresie IP (192.168.1.1), ale dostępnych za pośrednictwem dwóch różnych interfejsów sieciowych (eth1 i eth2).
Przykład:
net-bind -D eth1 -exec {Program 192.168.1.1}
net-bind -D eth2 -exec {Program 192.168.1.1}
Powyższe jest przybliżeniem tego, co chciałbym, zainspirowane wiązaniem sprzętowym wykonanym za pomocą primusrun i optirun .
Wyzwanie: Jak sugerowano w powiązanym wątku , używane interfejsy nie są wybierane przez program, lecz przez jądro (stąd powyższa składnia wstępnego wiązania).
Znalazłem kilka powiązanych rozwiązań, które są niezadowalające. Opierają się na powiązaniu interfejsów sieciowych za pośrednictwem czarnej listy sieci specyficznej dla użytkownika; tj. uruchomienie procesu jako użytkownik, który może uzyskać dostęp tylko do jednego określonego interfejsu sieciowego.
źródło
Odpowiedzi:
W przypadku systemu Linux odpowiedź ta została już udzielona w Superuser - jak używać różnych interfejsów sieciowych dla różnych procesów? .
Najpopularniejsza odpowiedź wykorzystuje
LD_PRELOAD
sztuczkę, aby zmienić powiązanie sieciowe dla programu, ale współczesne jądra obsługują znacznie bardziej elastyczną funkcję zwaną „sieciowymi przestrzeniami nazw”, która jest ujawniana przezip
program. Ta odpowiedź pokazuje, jak tego użyć. Z moich własnych eksperymentów zrobiłem następujące (jako root):Możliwe jest również do pewnego stopnia zarządzanie sieciowymi przestrzeniami nazw za pomocą poleceń
unshare
insenter
. Pozwala to również tworzyć osobne przestrzenie dla PID, użytkowników i punktów montowania. Aby uzyskać więcej informacji, zobacz:źródło
wvdial
na przykład w ogóle go nie konfiguruje ... więc należy go zdefiniować w samej przestrzeni nazwip netns remove test_ns
wrócić do normy? A może musisz zrobić coś specjalnego?Przyjmuję odpowiedź Graeme; jest to po prostu kontynuacja wyjaśniająca zmiany, które wprowadziłem w jego sugestii rozwiązania mojego problemu.
Zamiast wiązania fizycznego interfejsu w przestrzeni nazw, stworzyłem parę wirtualnych interfejsów sieciowych, z jednym końcem w przestrzeni nazw sieci i jednym w katalogu głównym. Paczki są następnie kierowane przez tę sieć wirtualną z przestrzeni nazw, do głównej przestrzeni nazw, a następnie do interfejsu fizycznego. - Jako taki jestem w stanie uruchomić wszystkie moje zwykłe transfery danych, a ponadto uruchomić procesy, które mają dostęp tylko do określonego interfejsu.
Po skonfigurowaniu interfejsów dla eth0 i eth1, z ich odpowiednimi przestrzeniami nazw eth0_ns i eth1_ns, programy mogą być uruchamiane na określonym interfejsie poprzez;
źródło
dhclient <bridge>
za tutaj .Rozwiązanie I: Wstępne ładowanie określonej biblioteki
App-Route-Jail : użyj ld_preload, aby wymusić bramę interfejsu (świetny pomysł, ale wymaga możliwości rootowania lub zaznaczania). Szczegółowe informacje na ten temat znajdują się poniżej.
Proxybound : użyj ld_preload, aby wymusić proxy dla określonej aplikacji (używa proxy zamiast interfejsu)
Force-Bind : ma wiele funkcji, ale wiązanie przecieka (nie jest wiarygodne)
Bind-Interface-IP : zbyt proste i nieszczelne połączenia (nie są niezawodne)
Bind-IP : zbyt proste i nieszczelne połączenia (nie są niezawodne)
Rozwiązanie II: Przestrzeń użytkownika systemu Linux
Klasyczna przestrzeń użytkownika Linux -a ip-netns : świetne rozwiązanie, ale wymaga rootowania, a interfejs może istnieć tylko na jednej przestrzeni użytkownika
Firejail : Firejail może zmusić aplikację do korzystania z określonej sieci, ale kompatybilność jest ograniczona (na przykład nie jest kompatybilna z interfejsami tun). Firejail nie wymaga rootowania
firejail --dns=8.8.8.8 --noprofile --net=eth0 --ip=192.168.1.1 app-command
Firejail z netns : Firejail może zmusić aplikację do korzystania z określonej przestrzeni użytkownika, która została utworzona osobno, pozwala to nazwać przestrzenie bez katalogu głównego
firejail --dns=8.8.8.8 --noprofile --netns=nameOfyourNS app-command
Firejail z maskaradą i mostem : Firejail może zmusić aplikację do używania określonego interfejsu z maskaradą iptables , jest to świetne i nie wymaga rootowania, ale wymaga ip_forward i może sugerować wpływ na bezpieczeństwo
firejail --net=br0 firefox
Rozwiązanie III: Linux iptables
Do tego celu można użyć Iptables, ale wymaga to ip_forward i może implikować wpływ na bezpieczeństwo, jeśli nie jest poprawnie skonfigurowany, przykład 1 , przykład 2 , przykład 3 , przykład 4
Uwagi dotyczące rozwiązań (I, II i III):
Wireguard
Jeśli korzystasz z VPN (zwłaszcza Wireguard) i chcesz zastosować to rozwiązanie do interfejsu Wireguard ( Wireguard z przestrzenią użytkownika ), możesz postępować zgodnie z instrukcjami, aby utworzyć przestrzeń użytkownika zawierającą interfejs wg (a zatem ograniczony do interfejsu VPN ) można to również połączyć z
firejail --netns=container
możliwością korzystania z przestrzeni użytkownika bez uprawnień użytkownika root.Jak znaleźć bramę interfejsu
Istnieje wiele rozwiązań, aby znaleźć bramę tutaj są niektóre polecenia, które pozwalają znaleźć używaną bramę
Jak korzystać z App-Route-Jail
192.168.1.1
jest używana jako brama wymuszona, ta reguła trasy nie wpłynie na inne aplikacje, ta manipulacja musi być wykonana tylko raz przy rozruchu systemu, na przykład jeśli chcesz używaj tego rozwiązania codziennieźródło