使用外部 IP 地址连接到服务器时卷曲 "Connection Refused"
Curl "Connection Refused" when connecting to server with external IP address
我已经创建了一个 RESTful 服务器,当我使用我的本地 IP 地址时,我可以成功地发出请求并获得响应。我希望它在外部暴露在互联网上。我设置了端口转发规则,但似乎无法正常工作。从我正在阅读的 "Connection Refused" 和 (7) 的内容来看,无论是防火墙还是 ISP 问题,都有东西阻止了它。关于做什么的任何想法?
这是我的 curl 命令,适用于我的本地 IP:
Pako-2:Pokebot pako$ curl -X GET http://192.168.1.8:30000/api/v1/getrecord/test
{"data": [{"id": 1, "title": "learn python"}, {"id": 2, "title": "get paid"}]}
这是我尝试使用 What's my ip
给我的外部 IP 地址时看到的
Pako-2:Pokebot pako$ curl -X GET http://MyIpHere:30000/api/v1/getrecord/test
curl: (7) Failed to connect to myIPAddress port 30000: Connection refused
这是我在 router/modem 中制定的端口转发规则
这是我的 router/modem 高级设置选项。我尝试调整我的防火墙设置,但没有成功。我尝试仅使用 NAT,还尝试使用低安全级别并检查所有端口。
----------------编辑----------------
这里是端口转发画面,我应该只设置30000作为开始和结束吗?
这是我的服务器的一些 python 代码:
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
from SocketServer import ThreadingMixIn
import threading
import argparse
import re
import cgi
import json
TODOS = [
{'id': 1, 'title': 'learn python'},
{'id': 2, 'title': 'get paid'},
]
class LocalData(object):
records = {}
class HTTPRequestHandler(BaseHTTPRequestHandler):
print "HTTPRequestHandler BaseHTTPRequestHandler = ", BaseHTTPRequestHandler
def do_POST(self):
print "do_POST"
if None != re.search('/api/v1/addrecord/*', self.path):
ctype, pdict = cgi.parse_header(self.headers.getheader('content-type'))
if ctype == 'application/json':
length = int(self.headers.getheader('content-length'))
data = cgi.parse_qs(self.rfile.read(length), keep_blank_values=1)
recordID = self.path.split('/')[-1]
LocalData.records[recordID] = data
print "record %s is added successfully" % recordID
else:
data = {}
self.send_response(200)
self.end_headers()
else:
self.send_response(403)
self.send_header('Content-Type', 'application/json')
self.end_headers()
return
def do_GET(self):
print "do_GET"
self.send_response(200)
self.end_headers()
self.wfile.write(json.dumps({'data': TODOS}))
return
class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
allow_reuse_address = True
def shutdown(self):
self.socket.close()
HTTPServer.shutdown(self)
class SimpleHttpServer():
def __init__(self, ip, port):
self.server = ThreadedHTTPServer((ip, port), HTTPRequestHandler)
def start(self):
self.server_thread = threading.Thread(target=self.server.serve_forever)
self.server_thread.daemon = True
self.server_thread.start()
def waitForThread(self):
self.server_thread.join()
def addRecord(self, recordID, jsonEncodedRecord):
LocalData.records[recordID] = jsonEncodedRecord
def stop(self):
self.server.shutdown()
self.waitForThread()
if __name__ == '__main__':
server = SimpleHttpServer("0.0.0.0", 30000)
print 'HTTP Server Running...........'
server.start()
server.waitForThread()
--------------------编辑2--------------------
只尝试了 1 个端口,而不是 begin/end 范围,它期待一个范围...
我发现您在本地网络中被拒绝连接很奇怪,因为路由器应该能够检测到外部 IP 是对自身的引用。
这种能力可能取决于路由器,但这是我在网络方面的经验。
也就是说,如果您想在使用端口转发规则后测试外部防火墙,那么您需要一个不在本地网络上的设备。
如果您无法使用其他设备,例如带有手机计划的智能 phone,那么您可以尝试使用 CanYouSeeMe 来测试端口是否打开。
您可能还想为您的服务器设置 DHCP 预留。换句话说,设置一个静态IP地址。
我已经创建了一个 RESTful 服务器,当我使用我的本地 IP 地址时,我可以成功地发出请求并获得响应。我希望它在外部暴露在互联网上。我设置了端口转发规则,但似乎无法正常工作。从我正在阅读的 "Connection Refused" 和 (7) 的内容来看,无论是防火墙还是 ISP 问题,都有东西阻止了它。关于做什么的任何想法?
这是我的 curl 命令,适用于我的本地 IP:
Pako-2:Pokebot pako$ curl -X GET http://192.168.1.8:30000/api/v1/getrecord/test
{"data": [{"id": 1, "title": "learn python"}, {"id": 2, "title": "get paid"}]}
这是我尝试使用 What's my ip
给我的外部 IP 地址时看到的Pako-2:Pokebot pako$ curl -X GET http://MyIpHere:30000/api/v1/getrecord/test
curl: (7) Failed to connect to myIPAddress port 30000: Connection refused
这是我在 router/modem 中制定的端口转发规则
这是我的 router/modem 高级设置选项。我尝试调整我的防火墙设置,但没有成功。我尝试仅使用 NAT,还尝试使用低安全级别并检查所有端口。
----------------编辑----------------
这里是端口转发画面,我应该只设置30000作为开始和结束吗?
这是我的服务器的一些 python 代码:
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
from SocketServer import ThreadingMixIn
import threading
import argparse
import re
import cgi
import json
TODOS = [
{'id': 1, 'title': 'learn python'},
{'id': 2, 'title': 'get paid'},
]
class LocalData(object):
records = {}
class HTTPRequestHandler(BaseHTTPRequestHandler):
print "HTTPRequestHandler BaseHTTPRequestHandler = ", BaseHTTPRequestHandler
def do_POST(self):
print "do_POST"
if None != re.search('/api/v1/addrecord/*', self.path):
ctype, pdict = cgi.parse_header(self.headers.getheader('content-type'))
if ctype == 'application/json':
length = int(self.headers.getheader('content-length'))
data = cgi.parse_qs(self.rfile.read(length), keep_blank_values=1)
recordID = self.path.split('/')[-1]
LocalData.records[recordID] = data
print "record %s is added successfully" % recordID
else:
data = {}
self.send_response(200)
self.end_headers()
else:
self.send_response(403)
self.send_header('Content-Type', 'application/json')
self.end_headers()
return
def do_GET(self):
print "do_GET"
self.send_response(200)
self.end_headers()
self.wfile.write(json.dumps({'data': TODOS}))
return
class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
allow_reuse_address = True
def shutdown(self):
self.socket.close()
HTTPServer.shutdown(self)
class SimpleHttpServer():
def __init__(self, ip, port):
self.server = ThreadedHTTPServer((ip, port), HTTPRequestHandler)
def start(self):
self.server_thread = threading.Thread(target=self.server.serve_forever)
self.server_thread.daemon = True
self.server_thread.start()
def waitForThread(self):
self.server_thread.join()
def addRecord(self, recordID, jsonEncodedRecord):
LocalData.records[recordID] = jsonEncodedRecord
def stop(self):
self.server.shutdown()
self.waitForThread()
if __name__ == '__main__':
server = SimpleHttpServer("0.0.0.0", 30000)
print 'HTTP Server Running...........'
server.start()
server.waitForThread()
--------------------编辑2--------------------
只尝试了 1 个端口,而不是 begin/end 范围,它期待一个范围...
我发现您在本地网络中被拒绝连接很奇怪,因为路由器应该能够检测到外部 IP 是对自身的引用。
这种能力可能取决于路由器,但这是我在网络方面的经验。
也就是说,如果您想在使用端口转发规则后测试外部防火墙,那么您需要一个不在本地网络上的设备。
如果您无法使用其他设备,例如带有手机计划的智能 phone,那么您可以尝试使用 CanYouSeeMe 来测试端口是否打开。
您可能还想为您的服务器设置 DHCP 预留。换句话说,设置一个静态IP地址。