3

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

1 ответ1

4

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 .

Это откроет TCP-порт $port_number на вашем локальном компьютере и установит на нем сервер 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
Не выполняйте удаленную команду. Это полезно только для переадресации портов. [...]

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .