Назад | Перейти на главную страницу

Использовать IP-адрес сервера через SSH-туннель

Во-первых, моя установка - это ноутбук с Ubuntu и сервер Ubuntu.

У меня есть программа на моем локальном ноутбуке, которой требуется доступ к определенной веб-службе (назовем ее http://someserver.com/someservice123). Теперь у этой службы есть брандмауэр, который разрешает доступ только с IP-адреса моего сервера.

Есть ли какой-то тип SSH-туннеля, который я мог бы использовать между моим ноутбуком и сервером, чтобы, когда скрипт python на моем ноутбуке отправлял запрос на http://someserver.com/someservice123 эта служба видит запрос, исходящий с IP моего сервера?

Я знаю, это будет выглядеть примерно так:

ssh -N -R 80:localhost:80 user@myserver

но я не совсем уверен.

Вам нужен не обратный туннель, а обычный туннель.

ssh -L 80:someserver.com:80 user@myserver

Это создаст прослушивающий сокет на порту 80 вашего ноутбука (localhost), который будет переходить на someserver.com через SSH-сервер на myserver.

Я обычно комбинирую туннели с параметрами -CfN, -C включает сжатие (немного ускоряет работу), -f отправляет SSH в фоновый режим после завершения аутентификации (так что у вас все еще есть возможность ввести пароль, если необходимо) , -N гарантирует, что никакая команда не выполняется на сервере SSH (небезопасно иметь SSH, работающий в фоновом режиме, который гипотетически можно использовать для отправки команд на сервер, это немного здоровая паранойя / хорошая практика).

Если вас не волнует очень безопасное соединение между вашим ноутбуком и моим сервером, вы также можете изменить шифр на что-нибудь быстрое, например, на blowfish с помощью -c blowfish или arcfour128 (что еще быстрее).

Итак, я бы использовал это:

ssh -CfNc arcfour128 -L 80:someserver.com:80 user@myserver

Это даст вам красивый, быстрый туннель, который уходит прямо в фоновый режим, вместо того, чтобы оставлять открытую командную строку на вашем сервере.

Имейте в виду, что если вы отправите его в фоновый режим, когда вы хотите разорвать туннель, вам нужно сначала найти идентификатор процесса, выполнив что-то вроде ps -ef | grep ssh и убейте правильный идентификатор процесса.

Вы можете использовать прокси-сервер SOCKS, который предоставляет ssh. Подключиться через

ssh -D 9999 user@myserver

а затем вы можете использовать этот прокси-сервер SOCKS в своем скрипте python, как описано в Как я могу использовать прокси SOCKS 4/5 с urllib2:

import socks
import socket
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 9999)
socket.socket = socks.socksocket

(Поместите этот код в начало вашего скрипта)

Я предлагаю использовать:

ssh -L 8080: localhost: 80 пользователь @ сервер

Таким образом, вы не столкнетесь с тем, что порт 80 является привилегированным портом, подключив свою программу к http://localhost:8080/. Также я бы использовал варианты -C для сжатия, -f для фона и -N за то, что не открывал терминал.
Так ssh -CfN -L 8080:localhost:80 user@server должен делать


В ответ на ваш комментарий позвольте мне процитировать tutorialspoint.com:

Простой клиент:

import socket               # Import socket module
s = socket.socket()         # Create a socket object
host = socket.gethostname() # Get local machine name
port = 8080                # Reserve a port for your service.
s.connect((host, port))
s.close

Поскольку вы используете средства Python для подключения к сетям, я предполагаю, что есть connect() заявление в вашем коде.

(Для получения более подробной информации перейдите по ссылке.) ;-)