Mam dwa interfejsy sieciowe na komputerze z systemem Linux i muszę ręcznie ustawić interfejs, z którego będzie korzystał dany proces.
Program (Twinkle softphone) nie ma podobnej opcji, więc uważam, że należy go ustawić zewnętrznie.
Jak mogę to zrobić?
Edycja: Nie próbuję powiązać procesu serwera z określonym interfejsem, ale raczej skłonić program klienta do skontaktowania się z serwerem za pomocą określonego interfejsu.
linux
networking
Andrea Spadaccini
źródło
źródło
Odpowiedzi:
możesz zastąpić kod w czasie wykonywania za pomocą LD_PRELOAD (@windows możesz użyć podobnej techniki zwanej objazdami , dość fantazyjnie). polega to na poinformowaniu dynamicznego konsolidatora, aby najpierw załadował wszystkie biblioteki lib do procesu, który chcesz uruchomić, a następnie dodał więcej na nim. zwykle używasz go w ten sposób:
i przez to zmieniacie to, co
ls
robi.dla twojego problemu spróbowałbym http://www.ryde.net/code/bind.c.txt , którego możesz użyć w następujący sposób:
oto jak to zbudujesz:
dłuższe howto to http://daniel-lange.com/archives/53-Binding-applications-to-a-specific-IP.html
podobne hacki i narzędzia:
źródło
force_bind
Projekt Catalin M. Boie obsługuje IPv6ip netns może to zrobić.
TL; DR: Utwórz sieciowe przestrzenie nazw, powiąż z nimi interfejsy, a następnie uruchom „ip netns exec NAME cmd ...”
Tylko sprawdź, czy twoja dystrybucja obsługuje ip netns ... (Backtrack 5r3 nie, podczas gdy Kali;))
WIĘCEJ SZCZEGÓŁÓW:
Dlaczego jest to lepsze niż wiązanie adresu IP za pomocą LD_PRELOAD? Ponieważ LD_PRELOAD nie kontroluje trasy używanej przez procesy. Użyje pierwszej trasy.
A ponieważ zawsze korzysta z tej samej trasy, domyślnie będzie to interfejs zarejestrowany dla trasy (co nie jest tym, czego chcemy)
źródło
ip netns exec myNamespace firefox
sudo ip netns exec myNamespace su -u someUser -c firefox
Nie sądzę, że można zmusić proces do korzystania z określonego interfejsu.
Myślę jednak, że możesz grać w ipchain / iptables i wymusić, że określony port, na którym nasłuchuje proces, będzie otrzymywać pakiety tylko przez określony interfejs.
Przydatne HOWTO: http://tldp.org/HOWTO/IPCHAINS-HOWTO.html
źródło
Na podstawie @olivervbk odpowiedź poniżej jest moja!
Uruchom wszystkie polecenia jako „root”.
Użyj polecenia ...
... aby znaleźć nazwę interfejsu sieciowego, którego chcesz użyć.
Uruchom poniższe polecenia jako szablon ...
UWAGA I: Flagi „-b -u” w poleceniu „sudo” pozwalają aplikacji na uruchomienie się przy użyciu użytkownika (nie „root”) i zwolnienia terminala w tle.
2> /dev/null 1> /dev/null &
Fragment jest zapobieganie wyjść z „[APP_NAME]”, która jest drukowana na terminalu.UWAGA II: Wartości ip „10.1.1.10” i „10.1.1.1” są dowolne.
UWAGA III: Aby pracować dla mnie, musiałem uruchomić
dhcpcd [INTERFACE_NAME]
polecenie.Aby usunąć przestrzeń nazw, użyj ...
... lub ...
... aby usunąć wszystko, co istnieje.
źródło
Zwykle jeśli program nie ma opcji ustawiania interfejsu nasłuchiwania, nasłuchuje na WSZYSTKICH interfejsach. (Możesz to zweryfikować za pomocą
lsof -i
).Tworzenie reguł zapory iptables, które upuszczają przychodzący ruch skierowany w stronę portów na interfejsach, na których nie chcesz, aby były widoczne, jest najłatwiejszą rzeczą do zrobienia.
źródło
Alternatywa I:
Użycie ld_preload do wymuszenia bramy interfejsu https://github.com/Intika-Linux-Network/App-Route-Jail
Zmusza aplikację do korzystania z określonego interfejsu sieciowego
Musimy znaleźć bramę, z której korzysta interfejs sieciowy, a następnie wymusić tę bramę do naszej uwięzionej aplikacji, a tym samym zmusić aplikację do powiązania z określonym interfejsem sieciowym
Brama aplikacji
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 starcie systemu, na przykład, jeśli chcesz korzystaj z tego rozwiązania codziennieAlternatywa II:
Firejail https://firejail.wordpress.com/ może zmusić aplikację do korzystania z określonej sieci, ale kompatybilność jest ograniczona.
źródło
Dlaczego chcesz, aby program używał interfejsu innego niż interfejs podłączony do serwera, aby komunikować się z tym serwerem? A jeśli system nie używa interfejsu podłączonego do serwera do komunikowania się z tym serwerem, jest to problem na poziomie systemu (tablica routingu) i nie ma on nic wspólnego z tym, który proces chce rozmawiać z tym serwerem.
Różne serwery w sieciach IP mają różne adresy IP. Jądro powinno wiedzieć, którego interfejsu należy użyć, aby uzyskać dostęp do określonego adresu IP na podstawie tabeli routingu. Jeśli próbujesz rozmawiać z dwoma różnymi serwerami, które mają ten sam adres IP, system się pomyli (ponieważ między innymi indeksuje połączenia tylko wewnętrznie według adresu docelowego). Możesz sprawić, by to zadziałało, ale jest to poprawka na poziomie systemu polegająca na umieszczeniu jednego serwera w osobnej sieci logicznej, która jest podłączona do komputera tylko za pośrednictwem oprogramowania NAT.
Więc jeśli mają różne adresy IP, użyj tras, aby wybrać odpowiedni interfejs. Jeśli mają ten sam adres IP, musisz użyć NAT, aby wyglądały na różne adresy IP w systemie.
źródło