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 ) i iproute2 ( ip
polecenie) (Ubuntu: iproute , 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ć iptables
i ip route
. Na przykład następujące polecenia konfigurują specjalne tabele routingu, dzięki czemu wszystkie pakiety oznaczone 1 wychodzą przez, eth0
a wszystkie pakiety oznaczone 2 wychodzą przez ppp0
(z wyjątkiem pakietów przeznaczonych localhost
do 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ć iptables
do „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 proxy
poprzez 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-routes
któ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 …
.
iptables -t nat -A POSTROUTING -o tun0 -j SNAT --to-source ppp_ip
gdzieppp_ip
jest adres IP tego adaptera. Po drugie, musisz wyłączyć ściślerp_filter
na/proc/sys/net/ipv4/config/ppp0/rp_filter
. Działa, gdy ustawiony jest tryb relaksacyjny, który wynosi 2.