Tor Скрытый сервис на 2 порта? - PullRequest
0 голосов
/ 23 ноября 2018

Я делаю p2p-приложение, полностью основанное на сети Tor.Приложение использует 2 порта для связи, скажем, 8001 для команд управления и 7001 для канала чата.Сначала одноранговый узел подключается к 8001 для запроса чата, и когда Я (другой одноранговый узел) принимает его запрос, я пытаюсь подключиться к нему по номеру 7001 (он должен слушать и ждать, пока я это сделаю).Я сделал это как форму аутентификации.

В итоге один узел прослушивает 2 порта, один для контроля (8001) и в зависимости от его стороны (отправитель / получатель запроса чата)он слушает на 7001 (чат).согласование происходит следующим образом (при условии, что канал управления построен на 8001) -Мы отправляем CHATREQ равноправному узлу, затем прослушивает 7001 -Пир отправляет мне ЧАТОК и пытается подключиться к моему 7001

Проблема, которую я не могу понять, состоит в том, что в большинстве случаев соединение с 7001 не может соединиться, хотя соединение с 8001 прошло хорошо!Что может сделать, чтобы соединение на одном порту работало нормально, а на другом отказывало?Есть ли вещь, которую я неправильно понял?Или проблема в самом механизме (пожалуйста, я хочу, чтобы проблема не заключалась в изменении всего приложения для его обхода! Итак, работа на 2 отдельных портах не может быть изменена :))


Вот соответствующие части кода

1 - функция подключения Socks5

 public static Socket ConnectViaSocks(ushort Socksport, string RemoteAddress, ushort RemotePort, ref sbyte result)
    {
        Socket torsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        torsock.Connect("127.0.0.1", Socksport);
        // Sending intial request : Authentication
        byte[] AuthReq = { 0x05, 0x01, 0x00 };
        torsock.Send(AuthReq);
        // Getting reply
        byte[] buffer = new byte[2];
        int received = torsock.Receive(buffer);
        if (buffer[1] != 0x00) { torsock.Close(); throw new MyException("SOCKS5 : Authentication error "); }
        // Sending Connect request to a domain (.onion domain)
        byte[] header = { 0x05, 0x01, 0x00, 0x03 };
        byte   DomainLength =(byte) RemoteAddress.Length;
        byte[] DomainName = Encoding.ASCII.GetBytes(RemoteAddress);
        byte[] ConnRequest = new byte[4+1+DomainLength+2]; //Request format = {0x05 0x01 0x00 0x03 Domainlength(1 byte) DomainNmame(Variable Bytes) portNo(2 bytes) }
        System.Buffer.BlockCopy(header      , 0, ConnRequest, 0, header.Length);
        ConnRequest[header.Length] = DomainLength;
        System.Buffer.BlockCopy(DomainName, 0, ConnRequest, header.Length+1, DomainName.Length);
        ConnRequest[header.Length + 1 + DomainName.Length ] = (byte)(RemotePort>>8);
        ConnRequest[header.Length + 1 + DomainName.Length + 1] = (byte)(RemotePort & 255);

        torsock.Send(ConnRequest);
        byte[] buffer2 = new byte[10];
        received = torsock.Receive(buffer2);
        if (buffer2[1] != 0x00) { torsock.Close(); }
        result = (sbyte)buffer2[1];
        return torsock;
    }

2- Установление скрытогоservice (AKA: эфемерная скрытая служба) команда из закрытого ключа, который у меня есть.

 string command = "ADD_ONION RSA1024:" + PrivateKey + " Port=7001 Port=8001"; // Creating Onion hidden service on ports 7001,8001 
 torctrl.sendCommand(command);

Примечание: torctrl - это оболочка вокруг сокета, которая отправляет командную строку в порт управления tor.


3- Установление канала чата:

3.1: Партнер-инициатор отправляет запрос чата:

NB.Globals.SKEY = луковый адрес без .onion,

SockThreads.SockTxThread = нить, которая отправляет (message) on (contactSocket) одноранговому узлу

cmd.StrCmd = форматирует запрос чата в унифицированное сообщениеформат в приложении

Console.WriteLine("[Notice] Sending chat request to " + onion);
message = cmd.StrCmd(Globals.SKEY, Globals.nickname, "CHATREQ", 0, "");
Socket contactSocket = Globals.OnionSocks[onion];
Thread myNewThreadTx = new Thread(() => SockThreads.SockTxThread(contactSocket, message));
myNewThreadTx.Start();

3.2 Ответ на ЧАТ REQ

Примечание: MsgOnion: Адрес партнера отправил мне запрос чата

Console.ForegroundColor = System.ConsoleColor.DarkRed;
Console.WriteLine("[Notice] Starting Chat channel creation");
ToPeerMsg = cmd.StrCmd(Globals.SKEY, Globals.nickname, "CHATOK", 0, "");
Thread myNewThreadTx = new Thread(() => SockThreads.SockTxThread(sock, ToPeerMsg));
myNewThreadTx.Start();
Thread.Sleep(1000);
// Connecting to chat port of incoming user
Socket Chatsock = SocketSocks.ConnectViaSocks(9150, MsgOnion + ".onion", 7001, ref result);
if (result == 0)
{ /* Some code to Rx/Tx messages,if come here no problem at all :)*/}

3.3: Ответ на ЧАТ OK

Thread ChatListenThread = new Thread(() =>SockThreads.SockChatListener());
ChatListenThread.Start();

ChatListenThread: Поток прослушивает 7001 и, если он получил соединение, выполняет важную работу в чате (открытие тем, элементов управления и т. Д.).Соответствующая часть на вопрос:

#region Create listener and accept sockets
TcpListener CtrlListener = new TcpListener(System.Net.IPAddress.Any, 7001);
CtrlListener.Start();

#endregion

#region Wait for a connection
Socket sock;
sock = CtrlListener.AcceptSocket();
Console.WriteLine("[Notice] Chat channel established with peer .... Congrats =) ");
...