Обновить

Комментарии 4

Прикольная идея, сам бы так поигрался)

Кажется, в handleConnection есть подвох: SetReadDeadline ставится на 5 секунд и потом не сбрасывается. Для curl это незаметно, запрос короче таймаута. А вот SSH-сессия, по идее, должна отвалиться через 5 секунд с i/o timeout, когда io.Copy в очередной раз полезет читать из conn. После чтения заголовка стоит сбросить дедлайн:

conn.SetReadDeadline(time.Time{})

Ещё момент: не все SSH-клиенты сразу шлют свою строку, некоторые ждут баннер от сервера. С таким клиентом роутер будет молча ждать 5 секунд и закроет соединение. В sslh, который решает ровно эту задачу, сделано наоборот: если клиент за таймаут ничего не прислал, соединение считается SSH и уходит в sshd. Можно подсмотреть эту логику.

Спасибо, после чтения заголовка это нужно сделать, да)

Я бы отредактировал статью и заменил некоторые слова пока её ркн не ограничил, надеюсь понятно почему.

Чтобы не рисковать с ребутом можно через

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 22 -j DNAT --to-destination :2222

направить новые соединения на любой локальный порт (2222) вместо реального ssh, текущее ssh соединение останется работать если вы не закроете его, а новое пойдет уже на порт 2222

С udp трафиком можно вообще обойтись без сторонних программ, а сразу через iptables делать DNAT на нужные порты если в 1 пакете обнаружились байты протокола. это даёт минимальную нагрузку на цпу

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации