Python

通過全域 IP 訪問設備,而不是路由器上的埠轉發

  • January 8, 2018

我有一個託管在遠端伺服器上的 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 反向隧道。如果您希望與他人共享服務,這可能更可取。

最終,上述選項不如埠轉發可取,僅應在您無法控制路由器的情況下考慮。

引用自:https://serverfault.com/questions/891236