Я знаю, что ssh
предоставляет SOCKS прокси с -D
. Интересно, возможно ли запустить такой прокси-сервер по требованию, в момент, когда установлено соединение с указанным портом (с использованием таких соединений, как socat
и nc
под капотом). Это однопользовательский компьютер, поэтому аутентификация локальных соединений не требуется.
Вот что я попробовал:
Скажите веб-браузеру использовать прокси-сервер SOCKS на
localhost:portA
.Для каждого соединения с "триггерным" портом
portA
socat
вызывает скриптnc-ssh-socks
, который в итоге выполняет exec-s дляnc localhost portB
:socat TCP-LISTEN:portA,fork EXEC:"nc-ssh-socks server portB"
Сценарий также гарантирует, что существует процесс
ssh
который предоставляет прокси-сервер SOCKS наlocalhost:portB
:cmd="ssh -fND $2 $1" pgrep -u $USER -fx "$cmd" || $cmd exec nc localhost $2
Однако схема не работает, я продолжаю получать сообщения от socat -ddddd
вида:
W read(6, 0x1bf5360, 8192): Connection reset by peer
W waitpid(): child 25032 exited with status 1
E write(6, 0x1bf5360, 2): Broken pipe
Странно, но иногда я вижу части страницы, которые отображаются в браузере, но я не знаю, из-за кеширования или из-за того, что некоторые соединения работают, но большинство не работает.
Кто-нибудь знает достаточно о socat
, nc
и ssh
чтобы понять, почему это не работает?