Reguła IPTables zezwalająca na przychodzące połączenia SSH

11

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
Steven
źródło

Odpowiedzi:

10

Łańcuch wyjściowy odpowiada za każdy wychodzący pakiet.

Twój skrypt pozwala tylko pakietom wychodzącym na tunelowanie interfejsu, hosta lokalnego i hosta zdalnego na 123.123.123.123.

Jeśli łączysz się z serwerem w sposób, który wymaga, aby demon SSH wysyłał pakiety do miejsca docelowego innego niż jeden z powyższych, ruch nie będzie dozwolony.

Aby zezwolić na pakiety wychodzące z demona SSH do klienta SSH, należy dodać następującą regułę:

iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT

Możesz również dodać docelowe kryteria IP do powyższej reguły, jeśli łączysz się tylko z jednej lokalizacji. Ta reguła musi znajdować się przed ostateczną regułą „DROP cokolwiek innego” dla łańcucha wyjściowego.

hellodanylo
źródło
+1 To zadziała i jest bardziej szczegółowe niż stosowanie ustalonej, pokrewnej reguły (czyniąc ją mniej lub bardziej przydatną w zależności od kontekstu).
goldilocks
Obie świetne odpowiedzi, wiele się nauczyłem! Przetestowałem odpowiedź @SkyDan i działa dobrze!
Steven
Nitpick: łańcuch wyjściowy nie odpowiada za przekazywane pakiety.
Björn Lindqvist
13

Twoja #SSHreguł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:

-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

Przed twoimi DROPreguł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 INPUTregułę, sprawia, że ​​tak jest.

Złotowłosa
źródło
1
To nie zadziała. Ustanowiony oznacza, że ​​pakiety dla obu połączeń TCP były widziane w obu kierunkach. Jeśli dodasz tylko tę regułę, pierwszy pakiet wychodzący nadal będzie blokowany.
hellodanylo,
2
@SkyDan Oto odniesienie do tego . Zauważ na schemacie, że kiedy serwer odsyła syn / ack z powrotem do klienta po otrzymaniu synchronizacji otwierającej, połączenie zostaje ustanowione, co oznacza, że ​​iptables pozwoli pakietowi odpowiedzi na: „Gdy zobaczy jeden pakiet (SYN), bierze pod uwagę połączenie jako NOWOŚĆ. Gdy zobaczy pakiet zwrotny (SYN / ACK), uznaje połączenie za UTWORZONE ”. -> ponownie: iptables widzi pakiet zwrotny, który serwer chce wysłać, ustawia połączenie jako nawiązane i przepuszcza odpowiedź.
goldilocks
1
Okej, rozumiem dlaczego to zadziała. Jest to trochę niejasne, ponieważ człowiek iptables mówi tylko o tym, że widzi pakiety w obu kierunkach, ani słowa o tym, że pakiety uzgadniania TCP są wyjątkiem. Dzięki za referencje!
hellodanylo
2
@SkyDan W rzeczywistości logika nie dotyczy tylko tcp - myliłem się, -p tcprobią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.
goldilocks
1
Masz rację. Ktoś powinien prawdopodobnie dołączyć tę informację do człowieka iptables.
hellodanylo,