Я использую контейнеры LXC для хостинга ssh, и я хотел бы перенаправить трафик SSH / SFTP (используя порт 22) на частный IP-адрес контейнера, но на основе пользователя / IP. То есть - один исходный порт, много направлений.
Я не могу назначить публичный IP-адрес каждому контейнеру.
Возможные решения я разобрался:
Простой - забудьте о глобальном порту 22 и используйте порт, соответствующий конкретному пользователю. Например, у ahes будет порт 6666. Затем перенаправьте трафик с помощью простого правила iptables: server.com:6666 => 10.10.66.66:22. Недостатком является то, что в некоторых местах заблокированы порты, отличные от 22/80/443.
используйте директиву ForceCommand в sshd на родительском сервере:
Match Group users ForceCommand /usr/local/bin/ssh.sh
ssh.sh скрипт:
#!/bin/bash # ...some logic here to find user IP address # run ssh exec ssh $USER@$IP $SSH_ORIGINAL_COMMAND
Это решение почти хорошее, но я не нашел способа заставить sftp работать с этой конфигурацией.
Другое соображение заключается в том, что я не могу копаться в протоколе, потому что шифрование выполняется до отправки любых данных, идентифицирующих пользователя. Более того, у меня действительно нет навыков для взлома исходного кода sshd, и сохранение родительского сервера с исходными пакетами очень желательно из соображений безопасности.
Я также нашел пакет libpam-nufw, используемый для аутентификации на уровне подключения (iptables), но я думаю, что он предназначен для других целей.
Буду признателен за любые подсказки. Спасибо.
Установите HTTP-прокси, прослушивающий порт 443, и включите пересылку соединений на порт 22 на внутренних IP-адресах LXC. Затем, при использовании клиентов ssh / sftp, используйте опцию ProxyConnect в сочетании с netcat / socat / proxytunnel / something.
Другое распространенное решение - настроить SSH-шлюз (например, выделенный LXC на том же самом устройстве). Пользователи сначала подключаются к нему, а затем к своему экземпляру LXC.