SSH проксирование и проброс портов


Tagged , , , , , , ,

Разберемся немного с проксирование и пробросом портов через ssh.

Ситуация первая. У нас есть домашний компьютер с *nix-системой с белым IP и есть рабочий сервер или стационарник так же с Linux. Есть необходимость зайти из дома и провести какие-то действия на работе. Но безопасники перекрыли все что можно и соответственно напрямую мы подключиться не можем.
Решение. Делаем реверс-прокси с рабочего компа до домашнего. На рабочем компе:

work$ ssh -R 20022:127.0.0.1:22 -N user@home.babara.ru

После чего, будучи дома, набираем на домашнем компе:

home$ ssh workuser@127.0.0.1 -p 20022

И получаем доступ к консоли рабочего компа. Работает это следующим способом: Рабочий комп, подключившись к домашнему говорит домашнему компу открыть порт 20022 и заворачивает все, что придет на домашний 20022 в свой(рабочий) 127.0.0.1 и порт 22(ssh).

Ситуация вторая. У нас есть сервер, на котором крутится MySQL или другой демон, который прослушивает исключительно 127.0.0.1. Вам надо подправить таблицы или данные, но делать это из консоли вам лень. Хочется делать через красивые программы, но зацепиться они не могут, потому что mysql не доступен из вне.
Решение. Настраиваем обычный форвардинг.

$ ssh -L 43306:127.0.0.1:3306 -N user@server.local

После чего в своей красивой программе настраиваем подключение к БД как: host=127.0.0.1 и port=43306, при условии, что программу вы запускаете на том же компе, на котором создали форвардинг. Все, теперь вы подключены к серверной БД. Работает это так: Открывается локальный порт(43306), который заворачивает все идущие к нему соединения на удаленный server.local, по адресу 127.0.0.1 и порт 3306.

Ситуация третья. У вас есть 2 системы, которые не могут напрямую друг с другом взаимодействовать. Но вы имеете доступ к обеими. Надо, к примеру, проксировать web-запросы из одной в другую. У меня это была виртуалка, на которой крутился тестовый jenkins и был отдельно стоящий сервер с развернутым gitlab. Напрямую gitlab по понятным причинам не мог слать push-уведомления на мою локальную виртуалку.
Решение. Побыть посредником. То, как первоначально это сделал, скорее всего не оптимально, но точно работало.
На своей основной машине набираем в первом окне консоли:

$ ssh -L 8081:127.0.0.1:80 -N user@jenkins.local

Открываем второе окно и пишем:

$ ssh -R 50080:127.0.0.1:8081 -N user@gitlab.local

В gitlab, у репозитория прописываем куда слать push-уведомления: http://127.0.0.1:50080/jenkins-test/
Как это работает: В первой консоли мы открываем форвардинг локального порта 8081 на внутренний интерфейс(127.0.0.1) сервера jenkins на порт 80. Вторая консоль открывает реверс-прокси, открывая на gitlab внутреннем интерфейсе(127.0.0.1) порт 50080, все данные с которого(gitlab сам на себя будет слать уведомления) будут завернуты на мою локальную машину(127.0.0.1) в порт 8081, которые в конечном счете передадутся в jenkins через первый форвардинг.

Возможно было бы проще сделать так:

$ ssh -R 50080:192.168.56.101:80 -N user@gitlab.local

Где 192.168.56.101 это виртуалка с jenkins. Но про это я уже подумал позже и это я не тестировал.

Все это простейшие вещи, которые прописаны в man к команде ssh, но имхо на примерах это нагляднее.

Share:

No comments

RSS / trackback

Respond