Как создать SOCKS прокси с ssh?

1707
Raffaele D'Arco

Я хочу использовать свой компьютер в качестве SOCKS-прокси. Вам просто нужно сделать ssh -D port_number hostname? Нужно ли указывать свое имя пользователя в Linux как hostname?

1

1 ответ на вопрос

1
Kamil Maciorowski

tl; dr - искать жирный текст ниже.


Примечание: я использую $префикс для строк, которые вы должны заменить желаемыми значениями. Этот синтаксис не предназначен для полной совместимости с переменными в любой оболочке.

Использование ssh -Dдействительно так:

ssh -D $port_number $hostname 

или же

ssh -D $port_number $username@$hostname 

Где $hostnameидентифицирует какую-то машину; это может быть IP-адрес, адрес, который может быть разрешен через DNS, /etc/hostsфайл или ssh_configфайл и т. д. Первая команда будет использовать ваше текущее (локальное) имя пользователя, если в вашем ssh_configфайле не указано иное (по умолчанию это не так). Вам необходимо предоставить учетные данные (например, $usernameпароль и пароль при запросе), действительные для $hostnameкомпьютера.

Это откроет $port_numberпорт TCP на вашем локальном компьютере и установит на нем сервер SOCKS. Обратите внимание, что вам может быть запрещено открывать некоторые порты как обычные пользователи, особенно ниже 1024, тогда используйте большее число.

В целом ситуация без SOCKS-прокси, предоставляемого sshследующим образом:

A -> D 

где Aклиент (например, веб-браузер), Dсервер (например, веб-сервер). Но с прокси это выглядит следующим образом:

A -> B -> C -> D 

где:

  • Aпредставляет одного клиента, который использует в B:$port_numberкачестве адреса SOCKS; может быть много клиентов.
  • Bэто машина, на которой ssh -D $port_number Cработает и где TCP $port_numberпрослушивает входящие соединения от любого A.
  • Cэто $hostname Bсоединяется к; связи, которая обычно идет в Dот в Aнастоящее время достигает Dот C.
  • Dявляется ли какой-либо сервер, он видит связь Cи может не знать, что Aи Bучаствуют; может быть много серверов.

Некоторые из этих букв могут относиться к одной и той же машине в некоторых конкретных случаях использования. Очевидно, что любой случай, когда A= не Cдает прямого преимущества над простым A -> Dсоединением, но есть и другие полезные случаи.

Допустим, вы запускаете sshкоманду, показанную выше, и говорите локальному браузеру использовать SOCKS на localhost:$port_number. Это тот случай, когда A= B. Трафик вашего браузера будет переадресован, а сайты, которые вы посещаете ( D), увидят сообщение, исходящее от $hostname( C), как если бы ваш браузер работал там.

Если вы хотите, чтобы другие компьютеры подключались к вашему открытому порту ( AB, они будут использовать в $your_IP:$port_numberкачестве адреса сервера SOCKS), вам необходимо:

  • настроить брандмауэр, чтобы разрешить входящие подключения к TCP-порту $port_number;
  • использовать -gопцию с ssh -D;

или же

  • туннелируйте каждого клиента, например, через его отдельное отдельное sshсоединение, чтобы их соединения выглядели локально (как будто A= B) для вашего уже работающего, ssh -D ...таким образом, брандмауэр не мешает и -gне нужен; это можно сделать, ssh -L $some_port:localhost:$port_number $your_IPвызвав на их стороне или ssh -R $some_port:localhost:$port_number $their_IPвызвав на вашей стороне; клиенты будут использовать в localhost:$some_portкачестве браузеров адрес сервера SOCKS.

Там нет причин, $hostnameне может быть Bс localhost; оно может. В этом случае B= C. Это бессмысленно, когда вы используете этот прокси-сервер SOCKS с вашим локальным браузером ( A= B= C), но если вы разрешаете подключения извне, это имеет смысл. Я думаю, это то, что вы хотите сделать. Команда может быть:

ssh -g -f -N -D $port_number localhost 

Вы можете установить ключ проверки подлинности на основе так это sshсоединение с localhostк localhostне запрашивает пароль. Вышеупомянутое замечание относительно брандмауэра стоит. Любой, кто сможет использовать в $your_IP:$port_numberкачестве адреса сервера SOCKS, будет видеть серверы, которые они посещают, как если бы они находились на вашем компьютере.


Соответствующие фрагменты man 1 ssh:

-D [bind_address:]port
Определяет локальную «динамическую» переадресацию портов уровня приложения. Это работает путем выделения сокета для прослушивания portна локальной стороне, необязательно привязанного к указанному bind_address. Всякий раз, когда устанавливается соединение с этим портом, оно перенаправляется по безопасному каналу, а затем протокол приложения используется для определения того, к чему подключаться с удаленного компьютера. В настоящее время поддерживаются протоколы SOCKS4 и SOCKS5, которые sshбудут действовать как сервер SOCKS. Только root может пересылать привилегированные порты. [...]

-f
Запрашивает sshпереход в фон непосредственно перед выполнением команды. [...]

-g
Позволяет удаленным хостам подключаться к локальным перенаправленным портам.

-N
Не выполняйте удаленную команду. Это полезно только для переадресации портов. [...]

Спасибо чувак :). Так, например, ssh -D 5050 myname @ my_ip - это команда, которую я буду запускать на своем ноутбуке. Затем я открываю порт на маршрутизаторе и, наконец, настраиваю прокси на моем компьютере. Правильно? Raffaele D'Arco 6 лет назад 0
@ RaffaeleD'Arco Я действительно не знаю, правильно ли это, потому что я не знаю, к чему относится my_ip, где находится маршрутизатор в вашей сети и что он делает. Я думаю, что вам не хватает `-g` Если вы хотите, чтобы ваш ноутбук Linux выступал в качестве единственного ретранслятора, тогда `ssh -g -D 5050 $ username @ localhost` должен быть первым шагом. Если ноутбук находится за маршрутизатором, который реализует NAT, и, если возможно, клиенты не находятся в той же локальной сети, то вам нужно настроить переадресацию портов там. Kamil Maciorowski 6 лет назад 0
ДА, я хотел бы настроить свой ноутбук Linux в качестве прокси-сервера. Когда я вдали от дома, я хочу использовать прокси на моем компьютере. Raffaele D'Arco 6 лет назад 0
@R Похоже, вам нужно руководство, чтобы применить мой общий ответ к вашему конкретному случаю. Немного о [проблема XY] (https://meta.stackexchange.com/q/66377/355310). Возможно, было бы лучше раскрыть эти детали в самом начале, мой ответ будет адресован им. ОК, вам нужен SSH-доступ с вашего «путешествующего» компьютера к вашему «домашнему», скорее всего, с переадресацией портов на домашнем маршрутизаторе. Из "путешествия": `ssh -p $ forwarded_port -D $ номер_порта $ имя пользователя @ $ external_IP_of_home`. Настройка прокси-сервера SOCKS в «путешествующем» браузере: `localhost: $ port_number`. Это тот случай, который начинается с «Давайте скажем» в моем ответе. Kamil Maciorowski 6 лет назад 0
Хорошо я понял. Спасибо :) Raffaele D'Arco 6 лет назад 0

Похожие вопросы