Часто вижу на этом форуме советы, мол нужно перенести ssh на высокие порты, якобы это каким-то образом поможет скрыть его от пробинга цензора и других злоумышленников, и сделает ваш прокси сервер незаметнее. Это полнейшая чушь, цензор использует портскан (см. GitHub - tread-lightly/CyberOK_Skipa_ips: Это вам не балалайка, получается), найти ssh на нестандартном порте проблемой не является. Можете попробовать сами: nmap -p- IP_ВАШЕГО_VPS
Нужно закрывать сервер правилами фаервола, но многие говорят, мол нет такой возможности, т.к. домашний IP не статический, а дополнительного джамп сервера нет. Опишу способ, как можно это сделать даже с динамическим домашним адресом.
Подготовка
Прежде всего нужно настроить у себя дома динамический DNS (DDNS). Подробно разбирать не буду, этих сервисов целая куча, настраиваются элементарно, хотя бы 1-2 поддерживаются любым "домашним" роутером. Лично я долгое время использовал duckdns, пока не перешёл на cloudflare.В конечном итоге у вас должен быть DDNS домен, который резолвит на ваш текущий домашний ip. Проверяем, если выполнить команду dig +short ВАШ_DDNS_ДОМЕН
на VPS, должно вывести ваш текущий домашний IP-адрес.
Решение
Решение простое, мы создадим разрешающее правило в фаерволе vps, которое будет использовать ipset, а ipset будет постоянно обновляться IP-адресом из DDNS с помощью скрипта.Сам скрипт:
#!/bin/bash
# Update ipset to let my dynamic IP in
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
set=whitelist
host=ВАШ_DDNS_ДОМЕН
me=$(basename "$0")
ip=$(dig +short $host)
if [ -z "$ip" ]; then
logger -t "$me" "IP for '$host' not found"
exit 1
fi
# make sure the set exists
ipset -exist create $set hash:ip
if ipset -q test $set $ip; then
logger -t "$me" "IP '$ip' already in set '$set'."
else
logger -t "$me" "Adding IP '$ip' to set '$set'."
ipset flush $set
ipset add $set $ip
fi
Размещаем скрипт в любом удобном месте, например в /etc/ipset-update-ddns.sh
Проверяем работу скрипта: sh /etc/ipset-update-ddns.sh
Должен был создаться ipset “whitelist” с текущим IP-адресом DDNS. Проверка: ipset list whitelist
Настроим обновление ipset в crontab:
*/5 * * * * /etc/ipset-update-ddns.sh
@reboot /etc/ipset-update-ddns.sh
И наконец добавляем разрешающее правило для ipset: (тут разрешён весь TCP, при желании можно ограничить порты)
iptables -A INPUT -p tcp -m set --match-set whitelist src -m state --state NEW -j ACCEPT
После этого можно отключить общее разрешающее правило для ssh и любые другие лишние правила. С вашего домашнего адреса теперь всегда будет открыт доступ. В качестве резервного доступа, если вдруг что-то пойдёт не так, можно использовать веб-консоль хостинга. Ещё можно прокинуть ssh внутри прокси соединения, например я прокидываю через vless-reality с socks5 инбаундом:
Host vps
ProxyCommand nc -X connect -x LOCAL_SOCKS5_PROXY_IP:PROXY_PORT %h %p
Hostname IP_ВАШЕГО_VPS
User ВАШ_VPS_USER