Python
通過全域 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 地址與設備通信。
但我無法讓它工作。我在這裡想念什麼?
IP 地址實際上是路由器的 WAN 網路介面的地址,因此,路由器不知道新的傳入連接實際上是針對路由器 LAN 上的設備的。
最終,如果存在規則(例如埠轉發或 DMZ),或者如果它看到設備首先以另一種方式發送相關數據包,路由器就會知道數據包的目的地是設備。
存在許多不同的連接到 SNAT 後面的伺服器的方法,但是我最喜歡的方法之一是 Samy Kamkar 的pwnat,因為這不需要第三方伺服器,但是,這將要求客戶端也使用 pwnat 進行連接。
或者,如果您有可公開訪問的伺服器,則可以設置SSH 反向隧道。如果您希望與他人共享服務,這可能更可取。
最終,上述選項不如埠轉發可取,僅應在您無法控制路由器的情況下考慮。