Во-первых, моя установка - это ноутбук с 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()
заявление в вашем коде.
(Для получения более подробной информации перейдите по ссылке.) ;-)