- PVSM.RU - https://www.pvsm.ru -
Тем, кому надо обеспечить себе, любимому, доступ к своим серверам из любой точки мира по SSH/RDP/иное — небольшое RTFM/шпора.
Нам нужно обойтись без VPN и других наворотов, с любого устройства под руками.
И так, чтобы с сервером не слишком упражняться.
Всё, что для этого нужно — knockd [1], прямые руки и 5 минут работы.
"В интернете всё есть", конечно (даже на Хабре [2]), но когда дело доходит до конкретной реализации — тут и начинается...
Будем упражняться на примере Fedora/CentOS, но это неважно.
Шпора подойдет как новичкам, так и зубрам этого дела, поэтому будут комментарии, но покороче.
ставим knock-server:
yum/dnf install knock-server
настраиваем его (например на 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
"Открывающая" часть настроена на автозакрытие через 1 час. Мало ли...
/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
...
вперед:
service iptables restart
service knockd start
можно добавить RDP на крутящийся внутри виртуальный Windows Server (/etc/knockd.conf; название интерфейса подставить по вкусу):
[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.2
Все наши пинки от клиента отслеживаем на сервере командой iptables -S.
В манах тоже всё есть (но это неточно), однако knockd — товарищ довольно скупой на сообщения, поэтому надо быть очень внимательным.
Например, такое:
open: 11111,22222,33333
close: 22222,11111,33333
По пинку 11111 open будет ждать следующего пинка на 22222. Однако по этому (22222) пинку начнет работать close и всё поломается. Такие дела ©.
Если в /etc/sysconfig/iptables вот это вот:
*nat
:PREROUTING ACCEPT [0:0]
нам особо не мешает, то вот это вот:
*filter
:INPUT ACCEPT [0:0]
...
-A INPUT -j REJECT --reject-with icmp-host-prohibited
Таки мешает.
Так как knockd добавляет правила в конец цепочки INPUT, то мы получим reject.
А отключить этот reject — это открыть машину всем ветрам.
Дабы не изгаляться в iptables что куда перед чем вставлять (как вот люди [2] предлагают) сделаем проще:
В итоге должно получиться:
*filter
:INPUT DROP [0:0]
...
#-A INPUT -j REJECT --reject-with icmp-host-prohibited
Можно, конечно, вместо DROP сделать REJECT, но с DROP ботам будет жить веселее.
В этом месте самое интересное (с моей точки зрения), так как надо работать не только с любого пляжа, но и с любого устройства.
В принципе ряд клиентов перечислены на сайте [1] проекта, но это из той же серии "в интернете всё есть". Поэтому перечислю то, что здесь и сейчас работает у меня под руками.
При выборе клиента необходимо проследить, чтобы он поддерживал опцию delay между пакетами. Да, пляж пляжу рознь и 100 мегабит ни разу не гарантируют долетание пакетов в нужном порядке в нужное время из данного места.
И да — при настройке клиента delay надо подбирать самостоятельно. Много timeout — боты нападут, мало — клиент не успеет. Много delay — клиент не успеет, мало — пакеты перезаблудятся в интернетах.
При timeout=5s вполне рабочий вариант delay=300..500ms
Как это ни смешно звучит, но нагуглить внятный knock-клиент под эту платформу довольно нетривиально. Такой, чтобы CLI, поддерживал delay, TCP — и без бантиков.
Как вариант можно попробовать это вот [3]. Видимо у меня гугль не торт.
Здесь всё просто:
dnf install knock -y
knock -d <dstip> 11111 22222 33333
Проще всего поставить порт из homebrew:
brew install knock
и нарисовать себе нужные батники командники вида:
#!bin/sh
knock -d 300 <dstip> 11111 22222 33333
Рабочий вариант — KnockOnD (бесплатный, из магазина).
"Knock on Ports". Не реклама, а просто он работает. И разработчики достаточно отзывчивые.
P.S. markdown на Хабре, конечно, дай бог ему здоровья когда-нибудь...
Автор: justhabrauser
Источник [4]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/linux/332031
Ссылки в тексте:
[1] knockd: https://zeroflux.org/projects/knock/
[2] Хабре: https://habr.com/ru/post/194412/
[3] это вот: http://gregsowell.com/?p=2020
[4] Источник: https://habr.com/ru/post/470001/?utm_campaign=470001&utm_source=habrahabr&utm_medium=rss
Нажмите здесь для печати.