Dla tych, którzy chcą zapewnić sobie dostęp do swoich serwerów z dowolnego miejsca na świecie przez SSH/RDP/inne — krótki przewodnik.
Musimy obejść się bez VPN i innych udziwnień, z dowolnego urządzenia pod ręką.
I tak, aby nie trzeba było zbytnio ćwiczyć z serwerem.
Wszystko, co jest potrzebne to — , zdolne ręce i 5 minut pracy.
W Internecie wszystko znajdziesz, oczywiście (nawet na ), ale gdy przychodzi do konkretnej realizacji — wtedy zaczynają się problemy...
Będziemy ćwiczyć na przykładzie Fedora/CentOS, ale to nie ma znaczenia.
Przewodnik nadaje się zarówno dla nowicjuszy, jak i dla weteranów, więc będą komentarze, ale krótkie.
1. Serwer
instalujemy knock-server:
yum/dnf install knock-serverkonfigurujemy go (na przykład na ssh) — /etc/knockd.conf:
[options] UseSyslog interface = enp1s0f0 [SSHopen] sequence = 33333,22222,11111 seq_timeout = 5 tcpflags = syn start_command = iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT cmd_timeout = 3600 stop_command = iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT [SSHclose] sequence = 11111,22222,33333 seq_timeout = 5 tcpflags = syn command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT„Otwierająca” część jest skonfigurowana do automatycznego zamknięcia po 1 godzinie. Na wszelki wypadek...
/etc/sysconfig/iptables:
... -A INPUT -p tcp -m state --state NEW -m tcp --dport 11111 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 22222 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 33333 -j ACCEPT ...jedziemy dalej:
service iptables restart service knockd startmożna dodać RDP do działającego wewnątrz wirtualnego serwera Windows (/etc/knockd.conf; nazwa interfejsu według uznania):
[RDPopen] sequence = 44444,33333,22222 seq_timeout = 5 tcpflags = syn start_command = iptables -t nat -A PREROUTING -s %IP% -i enp1s0f0 -p tcp -m tcp --dport 3389 -j DNAT --to-destination 192.168.0.2 cmd_timeout = 3600 stop_command = iptables -t nat -D PREROUTING -s %IP% -i enp1s0f0 -p tcp -m tcp --dport 3389 -j DNAT --to-destination 192.168.0.2 [RDPclose] sequence = 22222,33333,44444 seq_timeout = 5 tcpflags = syn command = iptables -t nat -D PREROUTING -s %IP% -i enp1s0f0 -p tcp -m tcp --dport 3389 -j DNAT --to-destination 192.168.0.2Wszystkie nasze pingi od klienta śledzimy na serwerze komendą
iptables -S.
2. Przewodnik po pułapkach
knockd.conf:
W dokumentacji też wszystko jest (ale to niepewne), jednak knockd to dość oszczędny w komunikatach towarzysz, więc trzeba być bardzo uważnym.
- wersja
W repozytoriach Fedora/CentOS najnowszy knockd to dzisiaj — 0.63. Kto chce UDP — niech szuka pakietów 0.70. - interfejs
W domyślnej konfiguracji Fedora/CentOS ten wiersz nie istnieje. Dodaj ręcznie, inaczej nie będzie działało. - timeout
Tutaj dobierz według uznania. Należy zadbać, aby klient miał wystarczająco czasu na wszystkie pingi — a bot-skanner portów się nie zesłania (a będą skanować na 146%). - start/stop/command.
Jeśli jest jeden zespół — to command, jeśli dwa — to start_command+stop_command.
Jeśli się pomylisz — knockd nie zareaguje, ale nie będzie działać. - proto
Teoretycznie można używać UDP. W praktyce pomieszałem tcp i udp, a klient z plaży na Bali mógł otworzyć sobie furtkę dopiero za piątym razem. Bo TCP dotarło wtedy, kiedy miało, a UDP — to niepewne. Ale to kwestia gustu, znowu. - sequence
Niekiedy można natknąć się na problem, że sekwencje nie powinny się pokrywać… jak to ująć…
Na przykład coś takiego:
open: 11111,22222,33333
close: 22222,11111,33333Na pstryknięcie 11111 open będzie czekać na następne pstryknięcie na 22222. Jednak na tym (22222) pstryknięciu zacznie działać zamknąć i wszystko się zepsuje. Zależy to także od opóźnienia klienta. Takie sprawy ©.
iptables
Jeśli w /etc/sysconfig/iptables znajduje się to:
*nat
:PREROUTING ACCEPT [0:0]nie przeszkadza nam za bardzo, to to:
*filter
:INPUT ACCEPT [0:0]
...
-A INPUT -j REJECT --reject-with icmp-host-prohibitedprzeszkadza.
Ponieważ knockd dodaje reguły na końcu łańcucha INPUT, otrzymujemy reject.
A wyłączenie tego reject — to otworzenie maszyny na wszystkie wiatry.
Aby nie komplikować sprawy w iptables, co gdzie wstawić (jak to proponują), zróbmy to prościej:
- domyślne w CentOS/Fedora pierwszą regułę („co nie jest zabronione — jest dozwolone”) zastąpimy odwrotnością,
- a ostatnią regułę usuwamy.
W rezultacie powinno wyjść:
*filter
:INPUT DROP [0:0]
...
#-A INPUT -j REJECT --reject-with icmp-host-prohibitedMożna, co prawda, zamiast DROP ustawić REJECT, ale z DROP botom będzie łatwiej.
3. Klient
W tym miejscu jest najciekawiej (z mojego punktu widzenia), ponieważ trzeba działać nie tylko z każdego plaży, ale i z każdego urządzenia.
Zasadniczo kilka klientów wymienionych jest na projekcie, ale to w tej samej serii „wszystko jest w internecie”. Dlatego wymienię to, co aktualnie działa u mnie.
Przy wyborze klienta należy upewnić się, że wspiera opcję delay między pakietami. Tak, plaża plaży nierówna, a 100 megabitów wcale nie gwarantuje dotarcia pakietów we właściwej kolejności w odpowiednim czasie z tego miejsca.
I tak — przy konfiguracji klienta delay trzeba dobrać samodzielnie. Dużo timeout — boty zaatakują, mało — klient nie zdąży. Dużo delay — klient nie zdąży lub nastąpi konflikt stuknięć (patrz „pułapki”), mało — pakiety zagubią się w internecie.
Przy timeout=5s dość efektywną opcją jest delay=100..500ms.
Windows
Jak to dziwnie nie brzmi, ale znalezienie sensownego knock-klienta na tę platformę jest dość trudne. Takiego, który miałby CLI, wspierałby delay, TCP — i bez zbędnych ozdób.
Można spróbować . Wygląda na to, że mój Google nie jest najlepszy.
Linuxa
Tutaj wszystko jest proste:
dnf install knock -y
knock -d 11111 22222 33333MacOS
Najłatwiej zainstalować port z homebrew:
brew install knock
i stworzyć potrzebne skrypty w stylu:
#!bin/sh
knock -d <delay> <dst_ip> 11111 22222 33333iOS
Działająca wersja — KnockOnD (darmowy, z marketu).
Android
„Knock on Ports”. Nie jest to reklama, po prostu działa. A deweloperzy są dość responsywni.
P.S. markdown na Habra, oczywiście, oby żył długo…
UPD1: dzięki znalazł się na Windows.
UPD2: jeszcze jeden przypomniał, że dodawanie nowych reguł na końcu iptables nie zawsze jest korzystne. Ale — to zależy.
Źródło: habr.com
