Comments 63
спасибо, актуально.
еще бы про настройку фаирвола и как убрать ответы на пинг.
sysctl net.ipv4.icmp_echo_ignore_all=1
сервер перестает отвечать на пинги
Корректная настройка игнора пинга:iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT && iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT && iptables -A INPUT -p icmp --icmp-type parameter-problem -j ACCEPT && iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
Прямо с языка снято, делал все то же самое для ssh тоннеля, я записать памятку не догадался.
Я бы добавил, что стоит порт SSH делать не 22 и не 2222, а любой другой. В эти два порта ботов иногда столько ломится, что даже просто игнорить их в йух отнимает заметный процент CPU на дешёвой VPSке.
И ещё вот: сервер icanhazip.com вернёт вам плейнтекстом только IP с которого он вас видит. Например так
➜ curl --proxy http://192.168.0.1:8888 icanhazip.com
123.45.67.89
Полезно посмотреть, а то результат иногда изумляет.
Если вам нужен TCP forwarding и вы используете ufw, то forwarding включать надо именно средствами ufw. Иначе, он может обратно выключить. И не сейчас, а когда вы спать ляжете.
Если собрались что-то писать в crontab, проверьте, что реализация cron стоит и работает. Файл /etc/crontab в системе может и быть, а вот исполнять его из коробки уже не факт, что кто-то будет на всяких минимальных системах. И да, пользуйтесь systemD. Понимаю, что два файла вместо одной строчки писать лень - самому лень. Их LLM отлично генерирует.
curl eth0.me
Я вот тоже несколько лет пользовался нестандартным портом для ssh, vps на М9 хостера с самым высоким рейтингом на Хабре. Но тут на днях попытался зайти, а не могу, тайм-аут. Написал в поддержку. Отвечают: мы не ограничиваем доступ. Подумал, что дело в ТСПУ, пробую подключиться с машины с российским IP - получается. Пришлось менять порт на стандартный, чтобы подключаться из других стран. И такая история не только с 22-м портом.
Я бы добавил, что нет вообще никакого смысла менять порт ssh, так как это только немного поможет от школьников со скачанными ботами, а остальные уже давно сканят порты и слушают ответ и ломятся туда, а не на дефолт. Скан занимает секунды и происходит домтаточно регуоярно, так что объем это не снизит.
Да и нагрузки пробивы ботов особой не дают, так что куда важнее, что бы юзер был не root, а доступ был не парольный, а по ключу. Ну и не супер стандартное имя пользователя даст куда больше профита, чем смена порта.
Всё, остальное очень успешно рубится и режется в наше время. Подобрать связку имени и 4096 ключика почти нереально, а уж тем более связку имени и ключика на элептической кривой.
Остальное можно вернуть обратно в 2010 год, все эти смены портов и отключения эхо - абсолютно бесполезная паранойа
ак как это только немного поможет от школьников со скачанными ботами,
Так их же большинство. Сменой одной циферки отключаем большую часть мусорной нагрузки, в чём проблема-то? Я своими глазами видел как сервер SSH в топе по жору ресурсов висит.
Хотя кажется там всё таки был вход по паролю.
Их меньшинство. Большинство это разного рода ботнеты. Вы вообще примерно никак не повлияетете на нагрузку
Я тоже видел. Притом в локальной сети, где Китайские камеры долбились. И таки что? Порт роли давно не играет, это бессмысленный совет.
Как большой хостер виртуалок: ой как не соглашусь :)
Количество брутфорса на рдп, мсскули и прочее на ВМках с внешним ИП иожет вполне убивать тот же РДС до уровня "клиент не может подключиться".
Большинству начхать на таргетированную атаку. Никто не будет опрашивать 65535 портов от скуки, если ему нужно пробрутить 30 паролей. 65535 портов - это время. На каждый нужен таймаут около секунды-двух. Даже в 200-500 потоков - занимает время.
Даже когда сам брутфорсил ВМки в далекие времена, никогда не занимался поиском нестандартных портов. Толку +- ноль, времени отнимало вагон. Количество сбрученного крайне сокращалось.
Вы правы, я не везде меняю порты. Это избыточно. Иногда я делаю доступ к ssh только по белым спискам.
sudo ufw allow from 1.2.3.4 to any port 22 proto tcp
Я бы очень хотел делать так везде, но иногда приходится подключаться через динамические IP. Вот если бы ufw резолвил доменные имена, тогда можно было бы использовать ddns домашнего роутера, например.
PS
И ещё не стоит забывать про поисковики типа SHODAN. После некоторого времени ваш сервер попадёт в выдачу по фильтру default ssh port.
Секунды? 65к портов с без явного дропа на fw?
Скрипт в студию
Секунды. Да, 65к портов. Может с дропом, может нет, хз, как у вас fw настроен. Если к вам придут с сотни адресов одной подсети, каждый со своим диапазоном, он справится? А если это будет тысяча дройд-мобильников из Филипин, которые будут генерить 100-200к запросов в секунду?
Nmap называется, знаете такой? Даже им вполне себе можно агрессивно просканить, типа nmap -p- -T4 --min-rate 3000 --open -sV --version-light
А ведь это самый простой и примитивный способ. Может придти masscan или rustscan или zmap с naabu.
А потом придёт shodun у которого вообще свой кастом и вы даже не узнаеет, что он приходил
Это уже целенаправленная атака, а не портскан. Никто на ваш впс не будет так охотиться. Портсканы с одного ip замедляются после 50 запросов любым, даже самым тупым ддосом, который есть у любого хостера ( и не только хостера). Сомневаюсь что ваш нмап скрипт работает "секунды", вечером чекну на своем vps.
Все это выглядит как паранойя или реклама для продажи "секьюрити" решений. Корпоративному сектору есть чего бояться, там есть атаки целевые, даж у нас было, хотя мы крайне мелкий банк. Но обычным людям с впской достаточно поменять порт на высокий, и открывать только когда нужен, если у хостера есть fw. Ну или серт, как тут

Не, смысл есть - как минимум логи sshd не будут спамить отброшеными соединениями
Ломятся боты? То есть авторизацию по логину/паролю в ssh лучше вовсе отключить, оставив только сертификат?
curl ifconfig.me
ifconfig.me
ifconfig.ca
Олдам привычнее будет =)
curl ifconfig.me
А из браузера даёт ещё кучу инфы
На сервере (под новым пользователем):
nano ~/.ssh/authorized_keys # Вставьте ключДля удобной и безопасной передачи публичного ssh ключа еще предусмотрена специальная утилита. На рабочей машине:
ssh-copy-id -i ~/.ssh/id_rsa.pub user@server
Чтобы работать с Docker без sudo, добавьте пользователя в группу (делается после создания пользователя):
А потом так, из-под этого пользователя:
docker run -ti -v /etc:/etc debian rm -rf /etc
Ой. Кто-то только что всё поломал...
И с автообновлениями поосторожнее.
Во-первых, в новой версии пакетов может поломаться совместимость, особенно с тем что вы собирали сами, а не ставили тоже из пакетов. 99% все будет ОК, но 1% запомнится вам надолго.
Во-вторых, иногда обновление пакета тянет за собой пересборку initrd или замену актуального ядра, с последующими сюрпризами после перезагрузки. Хотите рисковать - велкам.
Лучше, раз уж поставили докер - делать обновление сначала в докере, ПРОВЕРЯТЬ что всё работает - а потом в хост-системе.
Хотя зачем я это говорю, всё равно никто же не послушает, пока сам на грабли не наступит )
Человек, ставящий сервер, глядя на инструкцию с Хабра - поднимает в лучшем случае свой почтовый сервер и Nextcloud. Если это раз в 2 года упадёт, это куда меньшая проблема, чем если ему через известную уязвимость закинут следилку и всё просканируют. Поэтому пусть лучше ставит автообновления в лоб, чем не ставит никаких.
А заниматься вот этими вот предварительными проврками не админ не будет.
Возможно я "альтернативный" ретроград... Но повторю опять:
1. Зачем тащить iptables, ufw, net-tools в ситему 2025 года?
2. Зачем портить sshd.config, если есть целая директория sshd_config.d для кастомизации?
3. Почему используете
PasswordAuthentication no
PermitRootLogin no
но не добавляетеKbdInteractiveAuthentication no
4. Зачем неконтролируемый автоапдейт на удаленном сервере? Можно нежданно получить или автозамену конфигов, или обновленные сервисы, которым не понравятся старые конфиги. Тривиально, какие-то опции ушли в deprecated, или отменены.
А можете подробнее про первый пункт рассказать? Как это должно выглядеть в 2025?
nftables, iproute2
Вот была статья: https://habr.com/ru/articles/320278/
Ей уже почти 9 лет! Но мы продолжаем тащить legacy из системы в систему.
Вот еще статья: https://habr.com/ru/companies/ruvds/articles/580648/
Ей уже 4 года!
А что, Docker уже научился обходиться без
iptables-legacy?Текст статьи сильно похож на ответ LLM, так наиболее вероятная причина таких советов - наследие интернета не первой свежести)
Вы правы, участие LLM в этом есть. Но только в той части, где я попросил её сделать форматирование и проверить достоверность.
Данная "шпаргалка" лежала у меня несколько лет в notion, обрастала новыми командами и прочим мусором.
По этим алгоритмам я настроил не один десяток VPS под разные нужды.
После "причёсывания" LLM-кой я ещё раз прошёлся и отредактировал текст.
В целом текст похож на ответ LLM, потому что я постарался высушить его до базового минимума.
1_Вот вы серьёзно предлагаете человеку, которому 2 контейнера запустить надо, разбирать nftables вместо ufw?
3_Сейчас посмотрел на Debian 12, Arch и Bazzite: везде уже есть по умолчанию.
4_Лучше, чем никакого. Мы говорим про личный сервер, человек не будет еженедельно вручную правильно накатывать туда апдейты с проверкой на виртуалке. Чтобы прям доступ отвалился это маловероятно, а остальное починим.
Я как-то полез разбираться "чо там щяс модно вместо iptables", вдруг выяснилось, что в итоге проще всё равно написать всё в стиле iptables, потому что либо какая-то из прог криво правила сохранит, докер как-то вообще странно с ними работает, и так далее. В итоге смысла в этом ноль.
При обновлении конфигурации не заменяются так как если файл был изменён по умолчанию он оставит изменения как они были и кстати папки есть .d а сами не указаны в основном конфигурации и он просто их не читает и ты как дурак ищи куда надо засунуть путь до них а тут все 100 процентов будет работать и спокойно можно будет забекапить его одним файлом и просто поставить обратно если удалится
iptables зависимость docker и без него ни как
не где не увидел создание резервного локального входа через консоль доступа хостера. как резервную систему.
"Putty не предлагать!" - можете пояснить нубу по какой причине не предлагать?
В Windows 10+ используется PowerShell 7+ у него есть встроенный клиент Open SSH. Сам Powershell на текущий момент является OpenSource и вполне функциональный из коробки.
PuTTY - это сторонняя программа, которая одновременно является и интерпретатором команд, и эмулятором терминала. PowerShell с нормальным эмулятором может всё то же самое. Я использую Fluent, так как он есть в репозиториях Windows и ставится через winget.
Минусы PuTTY:
- Его надо ставить отдельно, следить за версией.
- Для генерации ключей нужна утилита PuTTYgen. В PS используется встроенный ssh-keygen.
- Имеет свой формат ключей .ppk - нужно конвертировать.
- Нет интеграции с основной системой.
- Ну и напоследок PuTTY из коробки выглядит ужасно.
- Кажется, у него нет полноэкранного режима, но точно уже не помню.
Плюсы:
+ Может быть portable, так как это всего один exe.
+ Сохраняет сессии. Fluent тоже так умеет, а ещё поддерживает mosh - это ssh по udp, не рвётся даже при разрывах сигнала.
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.
Try the new cross-platform PowerShell https://aka.ms/pscore6
PS C:\Users\...> which ssh
C:/WINDOWS/System32/OpenSSH//ssh.exe
PS C:\Users\...>Windows10, никакого встроенного в PowerShell клиента OpenSSH. ssh.exe - отдельный компонент. Для запуска ему ни PowerShell, ни cmd.exe не требуется.
Действительно, допустил неточность формулировки по незнанию. OpenSSH тут отдельное ПО, но он есть в составе Windows.
Directory: C:\Windows\System32\OpenSSH
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 31.03.2024 19:08 18934 LICENSE.txt
-a--- 31.03.2024 19:08 36008 NOTICE.txt
-a--- 15.09.2025 22:38 430080 scp.exe
-a--- 15.09.2025 22:38 457728 sftp.exe
-a--- 15.09.2025 22:38 602624 ssh-add.exe
-a--- 15.09.2025 22:38 553472 ssh-agent.exe
-a--- 15.09.2025 22:38 861184 ssh-keygen.exe
-a--- 15.09.2025 22:38 667136 ssh-keyscan.exe
-a--- 15.09.2025 22:38 514048 ssh-pkcs11-helper.exe
-a--- 15.09.2025 22:38 653312 ssh-sk-helper.exe
-a--- 15.09.2025 22:38 1251328 ssh.exe
PowerShell 7 даже в Windows 11 - опция.
SSH-клиент в Windows не имеет никакого отношения к PowerShell.
В Win10,11 даже без WSL есть уже свой нормальный клиент SSH.
+1 инструкция вида:
поставим файрвол
откроем в нем порты которые у нас listen
Вопрос - а зачем файрвол то?
Ставим свежий Linux
Ставим нужный нам софт.
Набираем ss -lntu
Офигеваем, кто все эти люди?
Чтобы долго не офигевать, просто закрываем все порты кроме тех, что нам нужны.
Не так мало пакетов, которые устанавливаются просто как зависимости, но потом начинают слушать порт для своих целей. Полезных, но нам нафиг не нужных, типа поддержки клиентов с Apple. Особенно среди рукожо NodeJS софта.
Я к тому и веду, что для мануала по "настройке сервера" было бы тогда более правильным этот лишний софт туда не допустить, чем изолентой сверху заматывать
И я к тому и веду, что следить и выискивать, что там может стоять такое с открытым портом - это требует и времени и знаний. А файрволл сразу закрывает огромное количество возможных проблем и ничему нужному не мешает. Тем более, что у многих вся нагрузка сейчас в докере, а там свой файрволл - поэтому в системном обычно можно прописать "Разрешить SSH, apt и докер, всё остальное в обе стороны запретить"
Могу дать свежий пример в качестве ответа.
На одном сервере поставил nginx proxy manager. Настроил его через веб-морду на 81 порту. После настройки порт больше не нужен, я его убираю из allow и никаких тревог не испытываю. Все прочие порты, которые он проксирует - открыты.
Тут логика работает следующая: запрещено всё, разрешено -- нужное.
Нужное всегда легче отследить. Вместо того, чтобы закрывать случайные порты, которые кто-то listen, мы закрываем все.
Это как в доме -- строим стены и делаем двери только в нужных нам местах.
Нет. С Вашей аналогией - Вы сначала хаотично возводите дом путём найма неквалифицированных бригад ("установлены какие то программы непонятно какие, наверняка слушают какие то неизвестные мне порты"), а затем вокруг него возводите ещё одну стену ("я закрою всё ненужное файрволом") чтобы было безопасно.
Мне нравится Ваш вопрос. Он ставит под сомнение некоторую аксиому, которая кажется очевидной, но мало кто задумывается о причинах.
Я всегда думал, что нормально закрытый firewall прежде всего от дурака внутри инфраструктуры, а сейчас задумался, посмотрел матчасть и понял.
Когда вы оставляете открытыми все порты, сканеры извне получают TCP Reset от самого сервера, в то время, как с закрытыми будет drop. Сканер просто не получит ответа.
Putty не предлагать, звучит как политический лозунг.
Есть мнение, что изменение порта SSH и установка Fail2Ban избыточны и даже бессмысленны. Как и отключение root-логина.
Шпаргалка по настройке VPS на Debian/Ubuntu (2025)