У меня есть две машины, доступные в Интернете без использования NAT. На обеих машинах работает служба SSH.
Я хочу подключиться через SSH / SFTP к серверу A на порту 2000, и это соединение должно быть направлено на порт 22 сервера B (поведение похоже на обратный прокси-сервер HTTP, но с использованием SSH / SFTP вместо HTTP)
С iptables проблем быть не должно:
#!/bin/bash
export IP="1.2.3.4"
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables \-t nat \-A POSTROUTING \-o eth0 \-d $IP \-j MASQUERADE
iptables \-A PREROUTING \-t nat \-p tcp \--dport 2000 \-j DNAT \--to $IP:22
Что-то вроде:
ssh -o ProxyCommand="ssh -e none userA@serverA:2000 nc -w 1 serverB 22" userB@ServerB
где вы подключаетесь к serverA с ssh логином userA для открытия вперед связь с serverB с которым вы входите userB.
Пояснение:
Команда прокси открывает ssh-соединение с ServerA (с именем пользователя userA) и инициируйте двунаправленное подключение к порту 22 serverB.
Начальный ssh
команда используйте это ProxyCommand
установить двунаправленное соединение с ServerB где вы должны войти в систему с userB.
Короче говоря:
Существует зашифрованное соединение от портативного компьютера к серверу ServerA (шаг 1 на вашем рисунке) и
другое зашифрованное соединение от портативного компьютера к ServerB (шаг 1 + шаг 2), инкапсулированное в первое соединение в его первой части (шаг 1), чем связанное nc
во второй части (шаг2).
Вместо HTTP, As SSH
является двунаправленным, когда соединение открыто, все запросы и ответы следуют за одним и тем же соединением. Так что не нужно думать о шагах 3 и 4.
Вы можете использовать порт ssh для архивации этого
ssh -L localportinmypc:hostname_of_the_behind_the_firewall:remoteport hostname_of_my_firewall
Теперь после этого:
sftp -o Port=localportinmyp localhost or ssh -p localportinmyp