Я хочу использовать свой компьютер в качестве SOCKS-прокси. Вам просто нужно сделать ssh -D port_number hostname
? Нужно ли указывать имя пользователя Linux в качестве имени hostname
?
1 ответ
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
), как будто ваш браузер работает там.
Если вы хотите, чтобы другие компьютеры подключались к вашему открытому порту (A
≠ B
, они будут использовать $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
Не выполняйте удаленную команду. Это полезно только для переадресации портов. [...]