Celem tego skryptu jest zezwolenie tylko na ruch przez VPN, z wyjątkiem localhost <-> localhost i przychodzącego ruchu SSH. Ale kiedy uruchamiam skrypt przez SSH, jestem rozłączony i zmuszony do ponownego uruchomienia vm. Co jest nie tak z moim skryptem?
#!/bin/bash
iptables -F
#Allow over VPN
iptables -A INPUT -i tun+ -j ACCEPT
iptables -A OUTPUT -o tun+ -j ACCEPT
#Localhost
iptables -A INPUT -s 127.0.0.1/8 -j ACCEPT
iptables -A OUTPUT -d 127.0.0.1/8 -j ACCEPT
#VPN
iptables -A INPUT -s 123.123.123.123 -j ACCEPT
iptables -A OUTPUT -d 123.123.123.123 -j ACCEPT
#SSH
iptables -A INPUT -p tcp --dport ssh -j ACCEPT
#Default Deny
iptables -A INPUT -j DROP
iptables -A OUTPUT -j DROP
Twoja
#SSH
reguła sugeruje, że ssh jest jednokierunkową formą komunikacji, ale tak nie jest. Dane są przesyłane tam iz powrotem.Normalnym sposobem radzenia sobie z tym problemem, ponieważ nie można z góry znać numeru portu po stronie klienta, jest zezwolenie na połączenia, które są uważane za „ustanowione” lub „powiązane” z ustanowionym połączeniem. Aby to zrobić, potrzebujesz:
Przed twoimi
DROP
regułami (najlepiej na górze, ponieważ reguły są przetwarzane w kolejności i te dwa będą miały zastosowanie do większości pakietów).Tam jest wyjaśnienie, w jaki sposób połączenie TCP zostaje USTANOWIONA tutaj ; zasadniczo fakt, że serwer odpowiada na pakiet dozwolony przez
#SSH
INPUT
regułę, sprawia, że tak jest.źródło
-p tcp
robiąc jakąkolwiek różnicę w tym sensie, i spójrz na kolejne wyjaśnienie UDP na tej stronie (to samo). Chodzi o to, że serwer odpowiada, nie wiedząc, czy iptables pozwoli na to, czy nie, a kiedy iptables otrzyma tę odpowiedź z serwera w systemie lokalnym , teraz widział ruch w obu kierunkach (nawet jeśli klient jeszcze tego nie zrobił), uważa połączenie ustanowione i pozwala odpowiedzieć. „Techniczność” opiera się tutaj na zaporze ogniowej znajdującej się pośrodku obu stron.