通过全局 IP 访问设备,而不是路由器上的端口转发

通过全局 IP 访问设备,而不是路由器上的端口转发

我有一个托管在远程服务器上的 Python 脚本。假设托管网站提供的 URL 是“myproject.host.com”。以下是脚本的一部分:

import json
import socket
from flask import Flask
from flask import request
from flask import make_response
app=Flask(__name__)

# domain given by noip.com, forwarded port
ip = ('abc.noip.org', 9050)

# used to find device's global IP address, and modify the variable ip accordingly
@app.route('/findMyIP',methods=['GET'])
def findMyIP():
    global ip
    mip = request.environ.get('HTTP_X_REAL_IP', request.remote_addr)
    print(mip)
    ip = (mip,9050)
    return mip

@app.route('/webhook',methods=['GET'])
def webhook(data = 'Test Message'):
    # I am using UDP protocol
    sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    sock.sendto(data.encode(),ip)
    sock.close()
    return 'data sent'

我已经对路由器进行端口转发,以便通过互联网访问本地网络上的设备。

假设noip.com给出的域名是abc.noip.org,转发端口是9050。

通过此设置,我可以毫无问题地访问我的设备。

我的目标是使用其全局 IP 地址访问该设备,而不必在每次使用不同的路由器或使用热点时设置端口转发。

我尝试这样做:

-> 从设备,我连接到“myproject.host.com/findMyIP”。这通常显示设备 IP 的格式为 10.xx.xx.xxx。

-> 我尝试使用从上述步骤获得的 IP 地址与设备通信。

但我无法让它工作。我这里遗漏了什么?

答案1

IP 地址实际上是路由器的 WAN 网络接口的地址,因此,路由器不知道新的传入连接实际上是针对路由器 LAN 上的设备的。

最终,如果存在规则(例如端口转发或 DMZ),或者路由器发现设备首先以另一个方式发送相关数据包,则路由器就知道该数据包的目的地是该设备。

存在多种连接到 SNAT 后面的服务器的方法,但我最喜欢的方法之一是普纳特由 Samy Kamkar 提供,因为这不需要第三方服务器,但是,这将要求客户端也使用 pwnat 进行连接。

或者,如果你有一个可公开访问的服务器,你可以设置一个SSH 反向隧道。如果您希望与他人共享该服务,这可能是更好的选择。

最终,上述选项不如端口转发那么可取,仅在您无法控制路由器的情况下才应考虑。

相关内容