Что мы получим в итоге?
Допустим, у вас или у вашего друга есть сервер, например vasya.com. Пробросив свои локальные порты через сервер, мы набирая в браузере vasya.com:5000 попадать на веб-сервер своего компьютера, не имеющий внешний IP. А подключаясь по ssh: ssh -p5001 Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript. мы всегда можем попасть на свой домашний компьютер, находящийся за NAT.
Предисловие
В сети довольно много информации по ssh-туннелям, но в большинстве случаев это просто набор заклинаний без должных пояснений. Данная статья призвана раскрыть лишь один аспект использования SSH-туннелями: как сделать свой домашний компьютер доступным через внешний сервер.
Настройка SSH на сервере
Спева необходимо включить проброс портов в настройках ssh-сервера.
На сервере vasya.com редактируем файл /etc/ssh/sshd_config
И редактируем (или добавляем) там строчку:
GatewayPorts yes
Перезагружаем ssh-сервер
Открываем порты на сервере
На каждом хорошем сервере должен стаять файрвол. Он блокирует все порты кроме разрешённных.
У меня Ubuntu Server и файрвол UFW.
На сервере редактируем /etc/ufw/user.rules
И добавляем туда:
### SSH TUNNELS ###
# 5000 - home web
# 5001 - home ssh
# 5002 - dacha web
# 5003 - dacha ssh
-A ufw-user-input -p tcp --dport 5000 -j ACCEPT
-A ufw-user-input -p tcp --dport 5001 -j ACCEPT
-A ufw-user-input -p tcp --dport 5002 -j ACCEPT
-A ufw-user-input -p tcp --dport 5003 -j ACCEPT
Перезагружаем ufw-демон.
Создаём туннель
На своём домашнем компьютере набираем:
ssh -N -p22 Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript. -R 5000:localhost:80
-p22 - порт сервера ssh (по умолчанию 22, но для безопасности лучше бы его заменить на какой-нибудь другой).
-N не выполнять команды в ssh-сессии
-R 5000:localhost:80 - прокидываем свой локальный порт 80 на порт vasya.com:5000
Проверяем
Набираем в браузере vasya.com:5000 и убеждаемся, что там показывается наш домашний веб-сервер.