Я хочу использовать свой компьютер в качестве 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прослушивает входящие соединения от любогоAC-$hostnameBк которому подключается; сообщение, которое обычно идет кDотAтеперь достигаетDотCD- это любой сервер, он видит связь с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
Не выполняйте удаленную команду. Это полезно только для переадресации портов. [...]
