У меня есть скрипт 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 вашего маршрутизатора, из-за этого маршрутизатор не знает, что новое входящее соединение на самом деле предназначено для вашего устройства в локальной сети маршрутизатора.
В конечном итоге маршрутизатор знает, что пакет предназначен для устройства, если существует правило (например, переадресация порта или DMZ), или если он видел, что устройство сначала отправило соответствующий пакет другим способом.
Существует множество различных методов подключения к серверу за SNAT, но один из моих любимых - pwnat by Samy Kamkar, поскольку для этого не требуется сторонний сервер, однако для этого потребуется, чтобы клиент также подключался с помощью pwnat.
В качестве альтернативы, если у вас есть общедоступный сервер, вы можете настроить Обратный туннель SSH. Это может быть предпочтительнее, если вы хотите поделиться услугой с другими.
В конечном счете, вышеперечисленные варианты менее предпочтительны для переадресации портов, и их следует рассматривать только в том случае, если вы не контролируете маршрутизатор.