ActiveTK's Note

Torを起動したまま新しいOnionサービスを立ち上げる方法


作成日時 2023/08/09 21:47
最終更新 2023/08/09 23:54


  • まず初めに
  • Torのデーモンは複数起動できる

  • まず初めに

    とあるサイトを制作している時に、ユーザーのリクエストを切断せずにTorを再起動して別のOnionサービスを立ち上げる必要がありました。

    しかし、Torはhttpdなどと異なり、「ユーザーのリクエストを切らずに設定を変更する」方法が見つからなかったので、対処法をメモします。


    Torのデーモンは複数起動できる

    Torには、ユーザーのリクエストを切らずに設定を変更するオプションが用意されていません。

    しかし、socks5のポートさえ重複しなければ、複数のデーモンを起動することができます。

    そこで、以下のPHPコードでリクエストを切らずに新しいOnionサービスを立ち上げることができました。

    <?php
    
    // Onionサービスごとに重複しないIDを指定して下さい。
    $ID = uniqid();
    $file = "/fakepath/directory_for_tor/" . $ID . "/";
    
    function getUnusedPort() {
      $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
      if (!$socket) return "0";
      $port = 49152;
      while ($port < 65536) {
        if (@socket_bind($socket, "127.0.0.1", $port)) {
          socket_close($socket);
          return $port . "";
        }
        $port++;
      }
      return "0";
    }
    
    $Data = "DataDirectory {$file}data\n" .
      "SocksPort " . getUnusedPort() . "\n".
      "HiddenServiceDir {$file}keys\n".
      "HiddenServicePort 80 127.0.0.1:80\n\n";
    
    mkdir($file, 0777);
    mkdir($file . "data", 0777);
    mkdir($file . "keys", 0700);
    file_put_contents($file . "torrc", $Data);
    
    system("nohup tor -f " . $file . "torrc >/dev/null 2>&1 &");
    sleep(1);
    
    // 立ち上げたOnionサービスのドメイン
    $TorOnionAddr = file_get_contents($file . "keys/hostname");
    echo "Domain: " . $TorOnionAddr;