Add loopback <-> external IP translation

This commit is contained in:
mykola2312 2022-03-16 16:32:15 +02:00
parent 7882278947
commit ea352a640a
2 changed files with 56 additions and 1 deletions

View file

@ -1,5 +1,6 @@
<?php
require("../php/config.php");
require("network.php");
$DB_NAME = "torrent";
$ANN_MIN_INTERVAL = 15;
$ANN_INTERVAL = 60;
@ -106,6 +107,8 @@ if (isset($_GET["port"])) {
bad_request("No port");
}
$externalIp = get_external_ip();
$date = new DateTime("now");
$now = $date->format('Y-m-d H:i:s');
@ -114,7 +117,7 @@ $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $conn->prepare("REPLACE INTO `tracker` (info_hash, ip, port, update_time) VALUES (:info_hash, :ip, :port, :update_time)");
$stmt->bindValue(":info_hash", $hash, PDO::PARAM_STR);
$stmt->bindValue(":ip", $ip, PDO::PARAM_STR);
$stmt->bindValue(":ip", is_loopback($ip) ? $externalIp : $ip, PDO::PARAM_STR);
$stmt->bindValue(":port", $port, PDO::PARAM_INT);
$stmt->bindValue(":update_time", $now, PDO::PARAM_STR);
$stmt->execute();
@ -127,6 +130,11 @@ $stmt->execute();
$stmt->bindColumn(1, $peerIp);
$stmt->bindColumn(2, $peerPort);
while ($stmt->fetch(PDO::FETCH_BOUND)) {
if (is_loopback($peerIp) && !is_loopback($ip)) {
$peerIp = $externalIp;
} else if ($peerIp == $externalIp && is_loopback($ip)) {
$peerIp = ip4_loopback();
}
$peers .= pack("Nn", inet_pton($peerIp), $peerPort);
}

47
network.php Normal file
View file

@ -0,0 +1,47 @@
<?php
function ip4_loopback()
{
return inet_pton("127.0.0.1");
}
function ip6_loopback()
{
return inet_pton("::1");
}
function ip_address($ip)
{
$ipAddr = inet_pton($ip);
if ($ipAddr == false) {
throw new Exception("invalid ip address");
}
return $ipAddr;
}
function is_loopback($ip)
{
$ipAddr = ip_address($ip);
return $ipAddr == ip4_loopback() || $ipAddr == ip6_loopback();
}
function get_external_ip()
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://ident.me");
curl_setopt($ch, CURLOPT_PORT, 80);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($ch);
curl_close($ch);
if (result == false) {
throw new Exception("request to ident.me failed");
} else if (inet_pton($result) == false) {
throw new Exception("ident.me respond invalid ip");
}
return $result;
}
?>