[personal profile] chabapok
С машиной, ssh порт которой смотрит в публичный интернет, бывают неприятные особенности - туда ломятся и начинают подбирать пароли по словарю. Нестандартный порт спасает, ненадолго, у нас его за несколько лет нашли, например. В какой-то момент ломящихся становится много, каждую секунду идет 5..10 попыток ввода пароля. Банить ip-аддреса бесполезно, они очень быстро меняются. Я в итоге банил даже /8 подсети, таких подсетей забанил штук 50. Это улучшило ситуацию, но полностью не спасло.

И вот узнал я, что есть port knocking. Выглядит это так, что запускается демон knockd и если ему в течении сконфигурированного времени (10..30сек) на заданные порты придут пакеты, это воспринимается как стук в дверь, и он добавляет src-аддрес в iptables. После этого можно с этого ip-аддреса заходить по ssh. А всем остальным (кроме белого списка, разумеется) - бан.

Настроил, проверил - работает. Ну а как проверить? Через 4g сотового оператора. Через какое-то время думаю - дай ка еще раз проверю. Проверяю - не работает. Начинаю копать. Выясняется: киевстар каждое новое tcp-соединение начал делать с разных ip-аддресов. Пакеты на нужные порты приходят - адрес источника у них у всех разный. Так происходит у киевстара не всегда. Например, сегодня адрес источника меняется реже, но все равно меняется.

Ну то есть - раз так сделал киевстар, значит и любой другой говнопровайдер может так сделать. Таким образом, port knocking выглядит красиво, но работать будет не стабильно.

ИИ предлагает fwknop. Это другая технология, в ней 1 пакет с зашифрованной информацией открывает порт ssh во внешний мир на какое-то небольшое время.

Date: 2026-03-27 10:31 am (UTC)
ufm: (Default)
From: [personal profile] ufm
Отключить логирование у sshd. Не знаешь о проблеме - спишь спокойно. :)

Date: 2026-03-27 02:22 pm (UTC)
ufm: (Default)
From: [personal profile] ufm
а если серьёзно - ну пусть подбирают. У тебя-же, я надеюсь, вход по ключу а не по паролю?

Date: 2026-03-27 01:33 pm (UTC)
juan_gandhi: (Default)
From: [personal profile] juan_gandhi
Когда я хостил свою хрень на AWS, я там просто держал whitelist на один айпи. А у моего провайдера добивался (не всегда получалось), чтоб у меня был постоянный айпи. Иногда приходилось доплачивать.

Date: 2026-03-27 05:15 pm (UTC)
rampitec: (Default)
From: [personal profile] rampitec
fail2ban посмотри. Несколько неудачных попыток и бот отправляется в бан на какое-то время.

Date: 2026-03-27 08:00 pm (UTC)
rampitec: (Default)
From: [personal profile] rampitec
Я лично в какой-то момент забил и отключил логирование вот этого. У меня причем не только в sshd ломятся. А сам sshd пересадил не просто на альтернативный высокий порт, но на порт широко известного сервиса. Там пока не ищут. Ну и логин с паролем у меня выключен, так что я мало рискую.

Date: 2026-03-27 08:05 pm (UTC)
cybernatic_cat: (Default)
From: [personal profile] cybernatic_cat
Всего около 150 записей в iptables, из которых около 50 это /8 подсети.

Бгггг :).

$ cat iptables.conf | wc -l
62686

Тоже последствия попыток борьбы с целыми подсетями :). Правда, это, большей частью, баны отдельных стран целиком, по данным, которые берутся здесь. Тоже не сильно эффективно, как выяснилось - в нынешних условиях, когда существуют ублюдки под названием "public cloud providers". Особенно это касается клаудов в Гонконге, Китае и прочих shitholes.

Date: 2026-03-28 01:44 am (UTC)
rampitec: (Default)
From: [personal profile] rampitec
О! А меня бы устроило просто сделать всю Украину черным списком. Потому что больше попыток атак, чем оттуда, просто и нету.

Date: 2026-03-28 09:25 am (UTC)
rampitec: (Default)
From: [personal profile] rampitec
Ну вот у меня в 99% случаев whois показывает на Киев.

Date: 2026-03-28 03:02 am (UTC)
ufm: (Default)
From: [personal profile] ufm
бань всё кроме Украины.

Date: 2026-03-27 07:57 pm (UTC)
cybernatic_cat: (Default)
From: [personal profile] cybernatic_cat
Выясняется: киевстар каждое новое tcp-соединение начал делать с разных ip-аддресов.

Интересно, как они это делают. А главное - зачем. knockd в такой схеме работать не будет - это ещё пол-беды; но бывают ведь и более "серьёзные" сервисы, требующие stateful connections. Да и IP-адресов у них в пуле наверняка не сто охулиардов, если только это не IPv6...

Интересно, а udp они пуляют тоже с разных originating адресов? knockd умеет работать и по udp, не только по tcp.

Возможное решение проблемы: правила в iptables, которые безусловно форвардят все пакеты с портами knockd с внешнего интерфейса на localhost, маскируя при этом source ip:

iptables -t nat -A PREROUTING -d -p tcp -m multiport --dports port1,port2,port3... -j DNAT --to-destination 127.0.0.1

iptables -t nat -A POSTROUTING -p tcp -m multiport --dports port1,port2,port3... -d 127.0.0.1 -j MASQUERADE

knockd при этом, разумеется, должен слушать на 127.0.0.1.

У меня самого, кстати, knockd юзается в домашней лабе, именно для доступа с мобильных устройств снаружи - только я им не ssh открываю, он закрыт наглухо, а разрешаю доступ к домашнему vpn-гейту. Ни разу не видел, чтобы штатовские мобильные провайдеры устраивали какой-нить карнавал с коннектами.

Date: 2026-03-27 08:02 pm (UTC)
rampitec: (Default)
From: [personal profile] rampitec
Самый цимес это когда тебе надо срочно домой достучаться, а ты в другой стране. И если это, скажем, Бразилия, то там карнавалы любят и ценят.

Date: 2026-03-27 08:08 pm (UTC)
cybernatic_cat: (Default)
From: [personal profile] cybernatic_cat
Слава великому Ктулху, у меня таких раскладов не бывает. И надеюсь, что и не будет впредь :).
На самый крайняк - в соседнем нейборхуде живёт хороший приятель и коллега. Remote hands, тысызыть :).

Date: 2026-03-27 10:00 pm (UTC)
rampitec: (Default)
From: [personal profile] rampitec
Сам бы я может и не поехал, а может и поехал, чёрт меня знает, но меня туда запихали в командировку. Так что случаи всякие бывают.

Date: 2026-03-27 09:35 pm (UTC)
cybernatic_cat: (Default)
From: [personal profile] cybernatic_cat
Сорян, в первое правило всралась опечатка. Точнее, движок DW похерил обязательный параметр, который я сдуру поставил в угловые скобки (из-за чего получился неизвестный тэг :).

Правильно будет вот так:

iptables -t nat -A PREROUTING -d public_ip -p tcp -m multiport --dports port1,port2,port3... -j DNAT --to-destination 127.0.0.1

Date: 2026-03-28 01:53 am (UTC)
cybernatic_cat: (Default)
From: [personal profile] cybernatic_cat
Я в iptables не очень, так что буду, по крайней мере, знать, что как-то так можно. Хотя навскидку мне кажется, что --to-destination будет подменять dst поле, а "плавающее" у пакетов - поле src.

А за подмену src отвечает второе правило, маскарадинг.

Насколько понимаю, knockd по таким правилам откроет порты для замаскированного ip-аддреса, что это не имеет смысла. Поэтому настроить так можно - но в такой схеме порты придется открывать всем.

Да, разумеется. Я забыл об этом упомянуть. В knockd.conf должно быть не дефолтное

command = /sbin/iptables -A INPUT -s %IP% -p tcp -m tcp --dport special_ssh_port -j ACCEPT

а

command = /sbin/iptables -A INPUT -d public_ip -p tcp -m tcp --dport special_ssh_port -j ACCEPT

Это, конечно, откроет ssh всему белому свету - но риск не особо велик, особенно если ssh аутентифицируется исключительно по RSA. А чтобы не забывать закрыть - можно в качестве command сунуть не голое правило iptables, а простенький скриптик, который сначала внесёт правило в файрволл, потом подождёт какое-то разумное время и отработает iptables -D INPUT [...], закрывая доступ. А если в файрволле предусмотрительно проставлены ACCEPT на коннекты с состояниями RELATED, ESTABLISHED - то iptables -D ещё и установленную сессию не должен порвать, по идее.

Кстате клиентская аппа knockd для андроида - совершенно прекрасна. Да ещё и довольно активно совершенствуется.

P.S. Ну и ещё одна подсказочка, которая теоретически может быть полезной в плане борьбы с брутфорсами ssh: PerSourcePenalties, интродактнуто в openssh 9.8. Но лично я с этим плотно не разбирался, честно говоря.

Date: 2026-03-28 03:14 am (UTC)
ufm: (Default)
From: [personal profile] ufm
Еще, кстати, вариант - использовать yggdrasil и перевесить ssh на его адреса. Но так как не все такие извращенцы как я - более человеческий вариант:
Поднять внутрь сети любой вариант тунеля, какой больше нравится, и сделать ssh доступным только из него. Логи на попытки взломать тунель - отключить, что-бы не раздажали. Как только в логах ssh появляются сообщения о том, что его опять пытаются отбрутфорсить - сменить пароль на тунеле.

October 2026

S M T W T F S
    123
456 78910
11121314151617
18192021222324
252627282930 31

Style Credit

Expand Cut Tags

No cut tags