использование Tor в качестве прокси
Я пытаюсь использовать Tor-Server в качестве прокси-сервера в HttpWebRequest
, мой код выглядит так:
HttpWebRequest request; HttpWebResponse response; request = (HttpWebRequest)WebRequest.Create("http://www.google.com"); request.Proxy = new WebProxy("127.0.0.1:9051"); response = (HttpWebResponse)request.GetResponse(); response.Close();
он отлично работает с «обычными» прокси, но с Tor я получаю исключения во время вызова
GetResponse() with Status = ServerProtocolViolation. The message is (in German...):Message = "Der Server hat eine Protokollverletzung ausgeführt.. Section=ResponseStatusLine"
- В Windows 7, как изменить настройки прокси-сервера из командной строки?
- C # WebBrowser Control Proxy
- C # webclient и прокси-сервер
- Прокси-базовая аутентификация в C #: ошибка HTTP 407
- Как изменить настройки прокси-сервера в Android (особенно в Chrome)
- Как я могу использовать SSH с прокси-сервером SOCKS 5?
- Как аутентифицировать прокси-сервер при использовании classа HttpClient?
- Как создать простой прокси-сервер в C #?
- Как узнать, какое приложение Windows прослушивает конкретный порт TCP?
- Проблема с Windows XP Internet
- Получение данных мыла RAW из веб-справочного клиента, запущенного в ASP.net
- Бесплатный локальный прокси-движок для Windows?
- Как туннелировать HTTP через SSH через SOCKS?
Если у вас установлено и работает privoxy, вы можете сделать
request.Proxy = new WebProxy("127.0.0.1:8118"); // default privoxy port
Это позволит вам делать запросы, используя
Tor не является прокси-сервером HTTP. Это прокси-сервер SOCKS. Вы можете использовать прокси-сервер HTTP, который поддерживает пересылку на SOCKS (например, Privoxy) и подключается к нему с помощью кода.
Да, как сказал другой плакат, нужен клиент для носков. Некоторые библиотеки – это прокси- сервер Starksoft Proxy , ProxySocket и компонентный прокси- сервер . sockscap – это инструмент, который перехватывает и перенаправляет вызовы winsock, а privoxy – это локальный прокси-сервер, который может туннелировать ваши запросы поверх носков. Несколько различных решений.
Используйте библиотеку «SocksWebProxy». Вы можете использовать его с WebClient & WebRequest (просто назначьте новый SocksWebProxy атрибуту * .Proxy). Нет необходимости в Privoxy или аналогичной услуге для перевода трафика HTTP на tor.
https://github.com/Ogglas/SocksWebProxy
Я сделал некоторые расширения для него, включив порт управления. Вот как вы могли бы запустить Tor в фоновом режиме без пула Tor Browser Bundle и управлять Tor, мы можем использовать Telnet или отправлять команды программно через Socket.
Socket server = null; //Authenticate using control password IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9151); server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); server.Connect(endPoint); server.Send(Encoding.ASCII.GetBytes("AUTHENTICATE \"your_password\"" + Environment.NewLine)); byte[] data = new byte[1024]; int receivedDataLength = server.Receive(data); string stringData = Encoding.ASCII.GetString(data, 0, receivedDataLength); //Request a new Identity server.Send(Encoding.ASCII.GetBytes("SIGNAL NEWNYM" + Environment.NewLine)); data = new byte[1024]; receivedDataLength = server.Receive(data); stringData = Encoding.ASCII.GetString(data, 0, receivedDataLength); if (!stringData.Contains("250")) { Console.WriteLine("Unable to signal new user to server."); server.Shutdown(SocketShutdown.Both); server.Close(); } else { Console.WriteLine("SIGNAL NEWNYM sent successfully"); }
Шаги для настройки Tor:
- Скопируйте torrc-defaults в каталог, в котором находится tor.exe. Каталог по умолчанию, если вы используете браузер Tor: «~ \ Tor Browser \ Browser \ TorBrowser \ Data \ Tor”
- Откройте окно подсказки cmd
- chdir в каталог, где находится tor.exe. Каталог по умолчанию, если вы используете браузер Tor: «~ \ Tor Browser \ Browser \ TorBrowser \ Tor \”
- Создайте пароль для доступа к управляющему порту Tor.
tor.exe --hash-password “your_password_without_hyphens” | more
- Добавьте свой пароль password hash в torrc-defaults в ControlPort 9151. Он должен выглядеть примерно так:
hashedControlPassword 16:3B7DA467B1C0D550602211995AE8D9352BF942AB04110B2552324B2507
. Если вы принимаете свой пароль как «пароль», вы можете скопировать строку выше. - Теперь вы можете получить доступ к управлению Tor через Telnet после его запуска. Теперь код может запускаться, просто отредактируйте путь к тому месту, где находятся файлы Tor в программе. Проверка модификации Tor через Telnet:
- Запустите tor с помощью следующей команды:
tor.exe -f .\torrc-defaults
- Откройте другую подсказку cmd и введите:
telnet localhost 9151
- Если все пойдет хорошо, вы увидите полностью черный экран. Введите «
autenticate “your_password_with_hyphens”
« Если все пойдет хорошо, вы должны увидеть «250 OK». - Напечатайте «
SIGNAL NEWNYM
», и вы получите новый маршрут, ergo новый IP. Если все пойдет хорошо, вы должны увидеть «250 OK». - Введите «
setevents circ
» (события схемы), чтобы включить вывод консоли - Введите «
getinfo circuit-status
», чтобы увидеть текущие цепи
Вам нужно «извлечь» stream из носков …
Imports System.IO Imports System.Net Imports System.Net.Sockets Imports System.Text Imports System.Runtime.CompilerServices Public Class Form1 Sub Form1_Load() Handles Me.Load Dim Host As String = "google.com" Dim P As New SocksProxy("localhost", 64129) 'Set your socks proxy here Dim Stream As NetworkStream = P.GetStream(Host, 80) Dim buffer As Byte() = Download(Stream, Host, "") My.Computer.FileSystem.WriteAllBytes("C:\webpage.html", buffer, False) MsgBox("ok") End Sub Function Download(Stream As NetworkStream, Host As String, Resource As String) As Byte() Using writer = New StreamWriter(Stream) writer.Write(String.Format("GET /{2} HTTP/1.1{0}Host: {1}{0}{0}", vbCrLf, Host, Resource)) writer.Flush() Dim byteList As New List(Of Byte) Dim bufferSize As Integer = 4096 Dim buffer(bufferSize - 1) As Byte Do Dim bytesRead As Integer = Stream.Read(buffer, 0, bufferSize) byteList.AddRange(buffer.Take(bytesRead)) Loop While Stream.DataAvailable Return byteList.ToArray End Using End Function End Class Public Class SocksProxy Private _SocksHost As String Private _SocksPort As Integer Sub New(SocksHost As String, SocksPort As Integer) _SocksHost = SocksHost _SocksPort = SocksPort End Sub Function GetStream(HostDest As String, PortDest As Short) As NetworkStream Dim client As TcpClient = New TcpClient() client.Connect(_SocksHost, _SocksPort) Dim stream As NetworkStream = client.GetStream() 'Auth Dim buf = New Byte(299) {} buf(0) = &H5 buf(1) = &H1 buf(2) = &H0 stream.Write(buf, 0, 3) ReadExactSize(stream, buf, 0, 2) If buf(0) <> &H5 Then Throw New IOException("Invalid Socks Version") End If If buf(1) = &HFF Then Throw New IOException("Socks Server does not support no-auth") End If If buf(1) <> &H0 Then Throw New Exception("Socks Server did choose bogus auth") End If buf(0) = &H5 buf(1) = &H1 buf(2) = &H0 buf(3) = &H3 Dim domain = Encoding.ASCII.GetBytes(HostDest) buf(4) = CByte(domain.Length) Array.Copy(domain, 0, buf, 5, domain.Length) Dim port = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(CShort(PortDest))) buf(5 + domain.Length) = port(0) buf(6 + domain.Length) = port(1) stream.Write(buf, 0, domain.Length + 7) ' Reply ReadExactSize(stream, buf, 0, 4) If buf(0) <> &H5 Then Throw New IOException("Invalid Socks Version") End If If buf(1) <> &H0 Then Throw New IOException(String.Format("Socks Error {0:X}", buf(1))) End If Dim rdest = String.Empty Select Case buf(3) Case &H1 ' IPv4 ReadExactSize(stream, buf, 0, 4) Dim v4 = BitConverter.ToUInt32(buf, 0) rdest = New IPAddress(v4).ToString() Exit Select Case &H3 ' Domain name ReadExactSize(stream, buf, 0, 1) If buf(0) = &HFF Then Throw New IOException("Invalid Domain Name") End If ReadExactSize(stream, buf, 1, buf(0)) rdest = Encoding.ASCII.GetString(buf, 1, buf(0)) Exit Select Case &H4 ' IPv6 Dim octets = New Byte(15) {} ReadExactSize(stream, octets, 0, 16) rdest = New IPAddress(octets).ToString() Exit Select Case Else Throw New IOException("Invalid Address type") End Select ReadExactSize(stream, buf, 0, 2) Dim rport = CUShort(IPAddress.NetworkToHostOrder(CShort(BitConverter.ToUInt16(buf, 0)))) Return stream End Function Private Sub ReadExactSize(stream As NetworkStream, buffer As Byte(), offset As Integer, size As Integer) While size <> 0 Dim read = stream.Read(buffer, offset, size) If read < 0 Then Throw New IOException("Premature end") End If size -= read offset += read End While End Sub End Class