使用外部 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地址。