У меня есть пара VDS для разных нужд (почта, веб-сервер, хранилище и т.д.) и вот, возникла необходимость скрыть порты (22, 443 и т.д.) от посторонних глаз.
Немного подумав (идея уже не нова), я решил написать простой, так сказать, ICMP-молоток, то есть открытие портов по пингу.
Но не простой пинг, а с определённым размером сообщения/пакета.
Пример для Linux:
Где -s — размер отправляемого сообщения, —s — это число.ping -s 999 -c1 mysrv.com
Если размер сообщения совпадает, то для IP-адреса отправителя на некоторое время открываются указанные порты и в Telegram отправляется сообщение об открытии портов.
Итак для реализации этого хака вам понадобятся: ufw, curl, tcpdump: apt install ufw curl tcpdump
и сам скрипт: nano /opt/port-knocker.sh
#!/bin/bash
PING_SIZE=999
PORTS='tcp/22 tcp/443'
TIMEOUT=3600
TOKEN="121212XXXX:XXXXZZZZAAAAEEEERRRRQQQQGGGGTTTTHHHH"
CHATID="55555XXXX"
PACKAGE_SIZE=$(( $PING_SIZE + 28 ))
function allow_access {
RESULT=`ufw allow proto $PROTO from $SRC to $DST port $PORT`
echo "`date` _ PORT-knocker _ $SRC -> $DST:$PORT : $RESULT"
MESS="<b>`uname -n`</b> %0A`date` %0Aufw allow proto tcp from $SRC to $DST PORT $PORT %0A$RESULT"
curl -s " https://api.telegram.org/bot${TOKEN}/sendMessageЭchat_id=${CHATID}&text=$MESS&parse_mode=HTML " >/dev/null &
}
function deny_access {
sleep ${TIMEOUT} && RES=$(`ufw show added | grep "$DST" | grep "$SRC" | grep "port $PORT" | grep "proto $PROTO" | sed 's|ufw |ufw delete |g'`) && echo "`date` _ PORT-knocker _ $SRC -> $DST:$PORT : $RES" &
}
while true
do
LINE=`timeout 3600 tcpdump -n -c1 -i any icmp[icmptype] == icmp-echo and ip[2:2] == $PACKAGE_SIZE 2>/dev/null`
if [ -n "$LINE" ]
then
IP=`echo $LINE | sed 's|^.
*IP ||' | tr ':' ' ' | awk '{print $1" "$3 }'`
SRC=`echo $IP | awk {'print $1'}`
DST=`echo $IP | awk {'print $2'}`
if [ -n "$SRC" ] && [ -n "$DST" ]
then
for PPORT in ${PORTS}
do
PROTO=`echo $PPORT | sed 's|/| |g' | awk '{print $1}'`
PORT=`echo $PPORT | sed 's|/| |g' | awk '{print $2}'`
if ufw show added | grep "$DST" | grep "$SRC" | grep " $PORT"
then
deny_access
else
allow_access
deny_access
fi
done
fi
else
echo "`date` - Timeout, reload sniffer"
fi
done
Где, PING_SIZE — размер сообщения PORTS='tcp/22 tcp/443' — протокол и порт TIMEOUT=3600 - таймаут открытия порта в секундах ТОКЕН — Telegram BotFather предложит вам запрос «/mybots» -> «API Token».
CHATID — Telegram IDBot предложит вам ввести запрос «/getid».
Делаем скрипт исполняемым: chmod +x /opt/port-knocker.sh
Чтобы скрипт работал как сервис: nano /etc/systemd/system/pk.service
[Unit]
Description=Start port-knocker
[Service]
StandardOutput=syslog
StandardError=syslog
WorkingDirectory=/opt/
Type=simple
ExecStart=/bin/bash /opt/port-knocker.sh
KillMode=process
Restart=on-failure
RestartSec=5s
[Install]
WantedBy=multi-user.target
Запустим скрипт: systemctl start pk
systemctl enable pk
Мы проверяем: ping -s 999 -c1 mysrv.com
В корзину должно прийти сообщение о том, что порты открыты для такого-то IP Если все ок, то можно активировать UFW: ufw enable
ufw show added
Повторить: ping -s 999 -c1 mysrv.com
и посмотрите еще раз: ufw show added
ufw allow from XXX.XXX.XXX.XXX to YYY.YYY.YYY.YYY port 22 proto tcp
ufw allow from XXX.XXX.XXX.XXX to YYY.YYY.YYY.YYY port 443 proto tcp
Так что все ок, у меня все хорошо!))) P.S. Шаблон на Python3 уже есть, если будет спрос, перепишу)
Теги: #информационная безопасность #разработка Linux #Системное администрирование #настройка Linux #icmp #доступ
-
Картриджи Epson: Надежное Решение Для Печати
19 Oct, 24 -
Первый Прототип Raspberry Pi Model A
19 Oct, 24 -
Создатель Scadapy Для Python
19 Oct, 24