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
), как если бы ваш браузер работал там.
Если вы хотите, чтобы другие компьютеры подключались к вашему открытому порту ( 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
Не выполняйте удаленную команду. Это полезно только для переадресации портов. [...]