Podwójne połączenie sieciowe

9

Mam modem komórkowy USB i połączenie Home LAN na moim Ubuntu 10.10.

Oba działają niezależnie.

Chcę wiedzieć, jak połączyć oba urządzenia w tym samym czasie, i móc określić, która aplikacja używa, które urządzenie łączy się z Internetem.

Czy ktoś wie jak to zrobić?

Justin Alexander
źródło

Odpowiedzi:

11

Istnieje kilka możliwości, w zależności od tego, jak chcesz zdecydować, które pakiety trafią gdzie. Większość z nich wymaga pewnego zrozumienia, jak działa sieć TCP / IP w systemie Linux. Głównymi narzędziami, które musisz znać, aby wykonywać złożone czynności, są iptables(Ubuntu: iptables Zainstaluj iptables ) i iproute2 ( ippolecenie) (Ubuntu: iproute Zainstaluj iproute , iproute-doc Zainstaluj iproute-doc ).

Jeśli możesz w pełni rozróżnić według docelowego adresu IP, to proste: poprowadź adresy IP zgodnie z własnymi życzeniami. Na przykład następujące polecenia spowodują, że wszystkie pakiety w wersji 1.2.3. x i 1.2.4.2 do przejścia ppp0, a inne pakiety do przejścia eth0.

route add -net 1.2.3.4/24 ppp0
route add -host 1.2.4.2 ppp0
route add -net 0.0.0.0/0 eth0

W przypadku bardziej złożonych wymagań musisz zacząć używać iptablesi ip route. Na przykład następujące polecenia konfigurują specjalne tabele routingu, dzięki czemu wszystkie pakiety oznaczone 1 wychodzą przez, eth0a wszystkie pakiety oznaczone 2 wychodzą przez ppp0(z wyjątkiem pakietów przeznaczonych localhostdo połączenia z interfejsem pętli zwrotnej).

ip rule add fwmark 1 table 1
ip route add 127.0.0.0/0 table 1 dev lo
ip route add 0.0.0.0/0 table 1 dev eth0
ip rule add fwmark 2 table 2
ip route add 127.0.0.0/8 table 2 dev lo
ip route add 0.0.0.0/0 table 2 dev ppp0

Teraz możesz użyć iptablesdo „zmieszania” wychodzących pakietów, dodając znak, który zadecyduje, jaką trasę wybrać. Na przykład, oto jak wysłać cały wychodzący ruch SMTP (port 25), za pośrednictwem eth0, a cały ruch pochodzi od aplikacji działającej jako użytkownik proxypoprzez ppp0.

iptables -t mangle -A OUTPUT -p tcp --dport 25 -j MARK --set-mark 1
iptables -t mangle -A OUTPUT -m owner --uid-owner proxy -j MARK --set-mark 2

Zobacz także 2 interfejsy sieciowe podłączone do Internetu. Wybierz ten, którego chcesz użyć zgodnie z nazwą domeny i powiąż oprogramowanie z różnymi interfejsami sieciowymi .


Musisz ustawić, aby te polecenia były uruchamiane, gdy oba interfejsy są połączone. Zalecam napisanie skryptu o nazwie, /etc/network/if-up.d/0justin-routesktóry uruchamia żądane polecenia. Ten skrypt będzie wykonywany za każdym razem, gdy pojawi się interfejs sieciowy; ponieważ jego nazwa zaczyna się od 0, uruchomi się na początku tego procesu, przed konfiguracją specyficzną dla aplikacji, która może oczekiwać, że trasy będą na miejscu. Istnieje symetryczność /etc/network/if-down.d/na wypadek, gdybyś chciał również robić rzeczy, gdy jeden z interfejsów ulegnie awarii. (Wszystkie powiązane trasy zostaną automatycznie usunięte, co może spowodować, że niektóre pakiety będą pozostawione nierozłączone, jeśli chcesz, aby powróciły do ​​innego interfejsu).

Skrypty ifup są udokumentowane w interfaces(5) man page. Najważniejsze, aby wiedzieć, że nazwa interfejsu wywoływanego w górę lub w dół znajduje się w zmiennej środowiskowej IFACE. Możesz dowiedzieć się, czy drugi interfejs już działa if ifconfig | sed 's/ .*//' | grep -Fqx 'eth0'; then ….

Gilles „SO- przestań być zły”
źródło
@Justin: To nie jest coś, z czym mam duże doświadczenie, więc proszę o informację zwrotną o tym, co zadziałało, co nie zadziałało, czego nie rozumiesz itp.
SO Gillesa - przestań być zły ”
1
Mam do dodania dwa dodatki: Po pierwsze, wysyła ruch na ppp0 z adresem źródłowym z eth0. Możesz to zmienić za pomocą :, iptables -t nat -A POSTROUTING -o tun0 -j SNAT --to-source ppp_ipgdzie ppp_ipjest adres IP tego adaptera. Po drugie, musisz wyłączyć ściśle rp_filterna /proc/sys/net/ipv4/config/ppp0/rp_filter. Działa, gdy ustawiony jest tryb relaksacyjny, który wynosi 2.
Karalga