Перейти к содержимому
Secret Knock

Как работает port knocking

Port knocking сохраняет службу невидимой, пока кто-то не докажет, что знает секрет. В этом руководстве рассказывается, как это работает, о двух распространённых реализациях — knockd и fwknop — и о том, почему стуки не срабатывают на практике.

Как работает port knocking

Брандмауэр отклоняет все подключения к защищённому порту, поэтому сканер ничего не видит. Небольшой демон отслеживает трафик, поступающий на брандмауэр. Когда один адрес источника создаёт ожидаемый шаблон, демон добавляет правило брандмауэра, разрешающее этот адрес, обычно на короткое время.

Шаблон — это стук. В knockd это последовательность попыток подключения к определённым портам в заданном порядке и за ограниченное время. В fwknop это один зашифрованный пакет.

knockd: последовательности стуков

knockd прослушивает интерфейс и сопоставляет попытки подключения с последовательностями из /etc/knockd.conf. Последовательность может сочетать порты TCP и UDP. При совпадении knockd выполняет команду — обычно правило iptables или nftables для стучащего адреса (%IP%).

В этом примере SSH открывается для стучащего адреса и снова закрывается через 10 секунд. Существующие сеансы SSH продолжают работать, если брандмауэр принимает установленные подключения.

[options]
    UseSyslog

[openSSH]
    sequence      = 7311:tcp,8822:tcp,9133:udp
    seq_timeout   = 10
    tcpflags      = syn
    start_command = /usr/sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
    cmd_timeout   = 10
    stop_command  = /usr/sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
/etc/knockd.conf — открыть SSH на 10 секунд

Выбирайте собственные порты; никогда не используйте повторно порты из опубликованных примеров. tcpflags = syn заставляет knockd учитывать только пакеты с флагом SYN — первый пакет попытки подключения.

fwknop: Single Packet Authorization

fwknop заменяет последовательность одним пакетом UDP, который зашифрован (AES) и аутентифицирован (HMAC). Серверный fwknopd пассивно перехватывает его, проверяет, убеждается, что пакет не воспроизведён повторно, и открывает запрошенный порт для адреса внутри пакета.

Создайте ключи командой fwknop --key-gen и поместите их в access.conf на сервере. Secret Knock импортирует клиентскую часть из вашего .fwknoprc.

SOURCE              ANY
OPEN_PORTS          tcp/22
KEY_BASE64          <output of fwknop --key-gen>
HMAC_KEY_BASE64     <output of fwknop --key-gen>
FW_ACCESS_TIMEOUT   30
/etc/fwknop/access.conf — разрешить SSH с ключом SPA

Поскольку разрешённый адрес передаётся внутри зашифрованного пакета, SPA может открыть порт для адреса, отличного от адреса отправителя пакета. Это удобно, когда вы стучите с телефона через мобильную сеть для ноутбука в другом месте.

Почему стуки не срабатывают

  • IPv4 или IPv6: стук ушёл через одно семейство адресов, а SSH подключается через другое. Брандмауэр открыл дверь для адреса, который вы не используете.
  • Другой общедоступный адрес: в мобильной сети, за NAT оператора или VPN сервер видит другой IP, не тот, который вы ожидаете. Проверьте адрес, с которого отправляете стук.
  • Повторно переданные SYN: если на стук TCP нет ответа, операционная система клиента снова отправляет тот же SYN. В наших тестах knockd 0.8 сбрасывал последовательность при таком повторном SYN, поэтому клиент должен отправлять каждый стук один раз и быстро прекращать попытку.
  • Время: стуки, пришедшие за пределами seq_timeout или в неверном порядке, запускают последовательность заново.
  • Промежуточные сетевые устройства: некоторые сети блокируют или изменяют трафик к необычным портам, поэтому стук, работающий дома, может не сработать в сети отеля или офиса.

Это безопасно?

Последовательность knockd отправляется без шифрования: любой, кто наблюдает ваш трафик, может воспроизвести её. Используйте её, чтобы скрыть службу от сканеров, перед ключами SSH, а не вместо них. fwknop SPA устраняет этот недостаток с помощью шифрования, HMAC и защиты от повторного воспроизведения и является лучшим выбором, если ваш трафик могут наблюдать.

Стуки с iPhone, Mac и Apple Watch

Secret Knock отправляет последовательности knockd и пакеты fwknop SPA с iPhone, iPad и Mac, проверяет ответ порта и открывает ваше приложение SSH. Apple Watch стучат через сопряжённый iPhone, поскольку watchOS не позволяет приложениям отправлять необработанные пакеты TCP или UDP; вдали от iPhone они могут отправлять SPA по HTTP на серверы, где это включено.

Руководства по настройке

Держите дверь закрытой. Носите стук с собой.

Secret Knock скоро появится в App Store для iPhone, iPad, Mac и Apple Watch.

Secret Knock →