Aby rozwiązać ten problem, musisz skonfigurować zarówno iptables, jak i reguły routingu. Szczególnym problemem, jaki napotykasz, jest to, że wychodzące pakiety SSH są kierowane przez anonimowy interfejs tunelowy VPN zamiast interfejsu Ethernet. Dzieje się tak, ponieważ oprogramowanie VPN skonfigurowało regułę routingu, aby wysyłać cały nieobsługiwany ruch przez interfejs tunelu. Dobry do anonimizacji ruchu sieciowego; zły dla nawiązywania połączeń SSH z komputerem.
Istnieje kilka sposobów rozwiązania tego problemu, ale podzielę się z Wami tym, który pracował dla mnie w identycznej sytuacji. Oto, co musimy zrobić:
- Utwórz nową tabelę reguł IP do obsługi ruchu innego niż VPN
- Dodaj regułę IP, aby wyszukać naszą tabelę bez VPN dla pakietów oznaczonych określoną maską netfilter
- Dodaj trasę IP, która kieruje cały ruch w naszej tabeli bez VPN, aby używać interfejsu Ethernet zamiast tunelu
- Dodaj regułę iptables, aby oznaczyć cały ruch SSH za pomocą naszej wyznaczonej maski netfilter
Uwaga: Pracowałem z Raspbian, wykonując następujące czynności, więc może być konieczne dostosowanie poleceń w celu dopasowania do dystrybucji.
Tworzenie nowej tabeli reguł IP
Rozpocznij od sprawdzenia pliku definicji tabeli iproute2. Chcemy mieć pewność, że nie używamy nazwy ani numeru żadnej istniejącej tabeli reguł.
cat /etc/iproute2/rt_tables
Prawdopodobnie zobaczysz coś według tych zasad:
# reserved values
255 local
254 main
253 default
0 unspec
#
# local
#
#1 inr.ruhep
Wybierz dowolny numer i nazwę dla nowej tabeli reguł - wszystko, czego nie użyjesz powyżej. W novpn
pozostałej części tej odpowiedzi użyję numeru 201 i imienia .
Dodaj definicję bezpośrednio do pliku definicji lub edytuj ją w wybranym edytorze tekstowym:
echo "201 novpn" >> /etc/iproute2/rt_tables
Dodaj nową regułę IP, aby wyszukać tabelę bez VPN
Sprawdź wszelkie istniejące reguły IP dotyczące masek netfilter:
ip rule show | grep fwmark
Jeśli grep niczego nie wykryje, to wszystko jest jasne. Jeśli drukuje niektóre wiersze, zwróć uwagę na liczbę szesnastkową po prawej stronie słowa fwmark
w każdym wierszu. Musisz wybrać numer, który nie jest aktualnie używany. Ponieważ nie miałem żadnych reguł fwmark, wybrałem numer 65.
ip rule add fwmark 65 table novpn
Powoduje to, że wszystkie pakiety z maską netfilter 65 sprawdzają naszą nową novpn
tabelę pod kątem instrukcji, jak kierować pakiety.
Skieruj cały ruch w naszej nowej tabeli, aby korzystać z interfejsu Ethernet
ip route add default via YOUR.GATEWAY.IP.HERE dev eth0 table novpn
Należy tutaj zwrócić uwagę dev eth0
. Zmusza to cały ruch przechodzący przez novpn
tabelę do korzystania wyłącznie ze sprzętowego interfejsu Ethernet zamiast wirtualnego interfejsu tunelu, który tworzy twoja sieć VPN.
Byłby to dobry moment na opróżnienie pamięci podręcznej iproute, aby mieć pewność, że nowe zasady i trasy odniosą natychmiastowy skutek:
ip route flush cache
Poinstruuj regułę zapory, aby oznaczyć cały ruch SSH za pomocą wyznaczonej maski netfilter
iptables -t mangle -A OUTPUT -p tcp --sport 22 -j MARK --set-mark 65
Jest tu zbyt wiele opcji, bym mógł je szczegółowo wyjaśnić. Gorąco zachęcam do przeczytania strony podręcznika dla iptables, aby dowiedzieć się, co się tutaj dzieje:
man iptables
W skrócie: dodajemy regułę wyjściową do tabeli zarządzającej zapory ogniowej (w celu specjalistycznej obsługi pakietów), która instruuje ją, aby oznaczała wszystkie pakiety TCP pochodzące z portu źródłowego 22 za pomocą naszej wyznaczonej maski 65 filtra sieci.
Co następne?
W tym momencie powinieneś być gotowy do przetestowania SSH. Jeśli wszystko pójdzie dobrze, powinieneś zobaczyć szczęśliwy komunikat „Zaloguj się jako”.
Ze względów bezpieczeństwa zalecam poinstruowanie zapory ogniowej, aby porzuciła wszelkie przychodzące żądania SSH z interfejsu tunelu:
iptables -A INPUT -i tun0 -p tcp -m tcp --dport 22 -j DROP
Zauważ, że wszystkie powyższe instrukcje są przejściowe (z wyjątkiem tworzenia identyfikatora tabeli reguł) - zostaną wyczyszczone przy następnym uruchomieniu komputera. Uczynienie ich trwałymi to ćwiczenie, które pozostawiam tobie.