heiher / natmap

TCP/UDP port mapping for full cone NAT
MIT License
1.38k stars 103 forks source link

如何添加对“转发后的地址和端口”使用脚本进行输出? #79

Open angel202422 opened 3 months ago

angel202422 commented 3 months ago

通知脚本可以调用的参数有公网IP、公网端口、IP4P、协议、绑定端口等;目前可以实现输出方式为 “内网IP:绑定端口——打洞公网IP:端口”;比如使用脚本可以输出“100.125.136.199:13485——112.137.195.83:5957” ;但是100.125.136.199这个IP实际上是路由拨号后或得的移动宽带的内网IP,实际想要的是转发后的内网的IP的;最终实现类似于“192.168.10.123:80——112.137.195.83:5957”这种,请问如何实现?非常感谢 另一个求教事项:请AI写了一个脚本,想要通过webhook来通知变化后的公网IP和端口,但是不能实现 代码如下:

!/bin/sh

发送HTTP GET请求

result=$(curl "http://www.baidu.com/tool/shownat.php?op=put&host=$1&port=$2" 2>/dev/null)

将$1和$2(用冒号分隔)写入文件

echo "$1:$2" > /etc/storage/ip3.txt

设置webhook的URL

webhook_url="https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=12345678-1234-1234-1234-d95e12345678"

构造JSON格式的payload

payload="{\"text\": \"IP: $1:$2\"}"

发送POST请求到webhook

curl -X POST -H "Content-Type: application/json" -d "$payload" "$webhook_url" 2>/dev/null

curl -X POST -H "Content-Type: application/json" -d "$payload" "$webhook_url"

实际运行后只能输出 ip3.txt 这个文档(内含公网IP和端口),但不能实现通过webhook进行通知(webhook在另一项目上正常使用,排除webhook问题),现在不清楚是哪里出了问题了 请高手指教,不胜感激

ysc3839 commented 3 months ago

“想要的是转发后的内网的IP” 这不是你自己设置的吗?比如说你想转发到 192.168.1.2:8000,那手动写上去就好了。

curl加参数 -vvv 同时去掉 2>/dev/null,看输出什么。

lhongcai commented 2 months ago

可以通过第三方短连接服务来跳转 natmap传递来的公网ipv4和端口号通过URL缩短器的API接口提交到短链接上,从而访问这个短链接来实现重定向到大内网web服务。 natmap利用缩短url网站重定向到大内网web natmap利用缩短url网站(gg.gg)重定向功能来访问大内网web

egg1234 commented 1 month ago

https://github.com/heiher/natmap/issues/81

应该可以通过下面的项目解决向客户端或对端共享/报告打洞后的出口IP地址及端口的问题 https://github.com/Violet-sword/Exchange-Variable

HSXX commented 3 weeks ago
<?php
// 设置数据库文件路径
$dbFile = __DIR__ . '/data.db';
// 创建一个新的PDO实例连接到SQLite数据库
try {
    $pdo = new PDO("sqlite:$dbFile");
    // 设置错误模式为异常
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // 创建表(如果不存在)
    $pdo->exec("
        CREATE TABLE IF NOT EXISTS key_value_store (
            id TEXT PRIMARY KEY,
            value TEXT
        )
    ");
} catch (PDOException $e) {
    die("数据库连接失败: " . $e->getMessage());
}

// 检查请求方法
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // 处理POST请求,保存键值对
    $id = isset($_POST['id']) ? $_POST['id'] : null;
    $value = isset($_POST['value']) ? $_POST['value'] : null;

    if ($id && $value) {
        try {
            // 插入或更新数据
            $stmt = $pdo->prepare('INSERT OR REPLACE INTO key_value_store (id, value) VALUES (:id, :value)');
            $stmt->execute([':id' => $id, ':value' => $value]);
            echo "键值对 {$id}={$value} 已保存";
        } catch (PDOException $e) {
            echo "数据库操作失败: " . $e->getMessage();
        }
    } else {
        echo "缺少必要的参数:id 和 value";
    }
} elseif ($_SERVER['REQUEST_METHOD'] === 'GET') {
    // 处理GET请求,查询键值对
    $id = isset($_GET['id']) ? $_GET['id'] : null;

    if ($id) {
        try {
            $stmt = $pdo->prepare('SELECT value FROM key_value_store WHERE id = :id');
            $stmt->execute([':id' => $id]);
            $result = $stmt->fetch(PDO::FETCH_ASSOC);

            if ($result) {
                echo $result['value'];
            } else {
                echo "未找到ID {$id}";
            }
        } catch (PDOException $e) {
            echo "数据库操作失败: " . $e->getMessage();
        }
    } else {
        echo "缺少必要的参数:id";
    }
} else {
    // 不支持的方法
    http_response_code(405);
    echo "不支持的请求方法";
}
?>

可以使用如上php进行上报与查询 使用post如下进行更新 id=自定义&value=xxx 使用get如下进行查询 id=自定义