我有一个托管在远程服务器上的 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 反向隧道。如果您希望与他人共享该服务,这可能是更好的选择。
最终,上述选项不如端口转发那么可取,仅在您无法控制路由器的情况下才应考虑。