You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何获取NGROK连接的IP?能否确定NGROK后Python(2.7.9)服务器的访问用户IP?

Hey there! Let's tackle your two questions about Ngrok and user IP addresses clearly:

1. 如何获取NGROK中的连接IP地址?

这里分两种常见场景:

  • 查看Ngrok分配的公网隧道IP/域名
    启动Ngrok后,你的终端会直接输出隧道的公网地址(比如 http://abc123.ngrok.io)。如果需要提取对应的IP,你可以用命令行工具解析域名,比如运行 nslookup abc123.ngrok.io 就能得到对应的公网IP。另外,Ngrok自带本地管理API(默认访问 http://localhost:4040),打开后点击"Inspect"或者直接访问 /api/tunnels 端点,就能看到所有隧道的详细信息,包括公网IP和域名。
  • 查看当前通过Ngrok连接的用户IP
    这个其实和你的第二个问题紧密相关,用户的真实IP不会直接出现在Ngrok的终端日志里,需要从转发到你后端服务的请求头中获取,具体看第二个问题的解决方案。
2. 是否可以确定访问部署在NGROK后方的Python(2.7.9)服务器的用户IP地址?

绝对可以!不过要注意:因为Ngrok是反向代理,你的Python服务器直接收到的请求是来自Ngrok服务器的,所以直接拿到的是Ngrok的IP,而不是用户的真实IP。但Ngrok会把用户的真实IP放在特定的请求头里,你只需要在代码中读取这些头即可。

针对Python 2.7.9的服务器,这里给你两种常见实现示例:

示例1:使用标准库BaseHTTPServer

BaseHTTPServer是Python2.7的标准库,无需额外安装:

from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer

class MyRequestHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        # 优先从X-Forwarded-For头获取真实IP,不存在则用Ngrok的IP兜底
        real_ip = self.headers.get('X-Forwarded-For', self.client_address[0])
        # 如果X-Forwarded-For包含多个IP(用户经过多层代理),取第一个
        if ',' in real_ip:
            real_ip = real_ip.split(',')[0].strip()
        
        self.send_response(200)
        self.end_headers()
        self.wfile.write("Your real IP address is: {}".format(real_ip))

if __name__ == '__main__':
    # 启动服务器监听本地8080端口
    server = HTTPServer(('0.0.0.0', 8080), MyRequestHandler)
    print("Server running on port 8080...")
    server.serve_forever()

示例2:使用Flask(适配Python2.7版本)

如果你用Flask,注意要安装支持Python2.7的Flask版本(比如Flask 0.12.x):

from flask import Flask, request

app = Flask(__name__)

@app.route('/')
def show_real_ip():
    # 同样优先读取X-Forwarded-For, fallback到remote_addr
    real_ip = request.headers.get('X-Forwarded-For', request.remote_addr)
    if ',' in real_ip:
        real_ip = real_ip.split(',')[0].strip()
    return "Your real IP address is: {}".format(real_ip)

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8080)

关键注意点:

  • Ngrok默认会自动添加X-Forwarded-ForX-Real-IP这两个请求头,不需要额外配置隧道参数。
  • X-Forwarded-For可能包含多个IP(格式为用户真实IP, 代理IP1, 代理IP2...),所以要取第一个值作为用户的真实IP。

内容的提问来源于stack exchange,提问作者ori moshe

火山引擎 最新活动