Ruby Tor Switching Ip - "общий сбой сервера SOCKS", если я не создаю новый процесс для подключения к telnet в порт управления Tor

При попытке переключения IP-адреса Tor с помощью telnet я сталкиваюсь с SOCKSError::ServerFailure: general SOCKS server failure при попытке подключения к порту управления Tor через telnet. Однако, если я создаю новый процесс для телнеттинга, у меня нет проблем. Я не хочу порождать новый процесс, потому что он ужасен. Я надеялся, что кто-нибудь может помочь мне найти причину этой проблемы и более грубого решения?

Воспроизвести:

начать тор:

tor --SocksPort 9350 --ControlPort 53500 --CookieAuthentication 0 --HashedControlPassword <passwordhash> --DataDirectory /tmp/tor_data/9350

Затем запустите этот код ruby, который использует socksify настроить сервер socks, затем использует tor драгоценный камень Tor::Controller.connect блок, который соединяется с портом управления Tor через telnet для переключения конечной точки Tor:

require 'socksify'
require 'terminator'
require 'tor'

TCPSocket::socks_server = "127.0.0.1"
TCPSocket::socks_port = "9350"

Tor::Controller.connect(:port => 53500) do |tor| #<- error
  tor.authenticate("")
  tor.signal("newnym")
end

Ошибка при Tor::Controller.connect вызов:

SOCKSError::ServerFailure: general SOCKS server failure

Если я заменю Tor::Controller.connect Блок с этим (порождая новый процесс, чтобы сделать telnetting), у меня есть успех:

telnet_pid = nil
begin
  Terminator.terminate :seconds => 20 do
    cmd = "bundle exec ruby -e \"require 'tor'\" -e " +
          "\"Tor::Controller.connect(:port => 53500)" +
          "{|tor| tor.authenticate(''); tor.signal('newnym')}\""
    telnet_pid = Process.spawn(cmd)
    Process.wait telnet_pid
  end
rescue Terminator.error
  puts 'Telnet process to switch Tor endpoint timed out!'
  Process.kill('TERM', telnet_pid) if telnet_pid
end

1 ответ

Решение

Я понял, что сервер socks направляет все запросы TCP через сервер SOCKS, включая мои запросы telnet. Если я отключаю сервер socks во время telnetting, то снова включаю его, он работает:

TCPSocket::socks_server = nil
TCPSocket::socks_port = nil

Tor::Controller.connect(:port => 53500) do |tor| #<- error
  tor.authenticate("")
  tor.signal("newnym")
end

TCPSocket::socks_server = "127.0.0.1"
TCPSocket::socks_port = "9350"
Другие вопросы по тегам