卷曲"连接被拒绝"连接到具有外部IP地址的服务器时

时间:2016-09-05 22:39:50

标签: python curl networking portforwarding

我创建了一个RESTful服务器,当我使用本地IP地址时,我可以成功发出请求并获得响应。我希望它能在外部暴露在互联网上。我设置了一个端口转发规则,但我似乎无法让事情发生。从我正在阅读"连接被拒绝" (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

这是我在路由器/调制解调器中制作的端口转发规则 enter image description here

以下是我的路由器/调制解调器高级设置选项。我试过调整我的防火墙设置,但没有运气。我尝试过仅使用NAT,并且还检查了所有端口的低安全级别。

enter image description here enter image description here enter image description here enter image description here

-----------------编辑-----------------

这是端口转发屏幕,我应该将30000设置为开始和结束吗? enter image description here

这是我的服务器的一些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个端口,而不是开始/结束范围,它期待一个范围...... enter image description here enter image description here

1 个答案:

答案 0 :(得分:2)

我觉得很奇怪你会在本地网络中拒绝连接,因为路由器应该能够检测到外部IP是对自身的引用。

这种能力可能取决于路由器,但那是我在网络方面的经验。

话虽这么说,如果您想在播放端口转发规则后测试外部防火墙,那么您需要一台不在本地网络上的设备。

如果您无法使用其他类似智能手机的设备,那么您可以尝试使用CanYouSeeMe来测试端口是否正在打开。

您可能还想为服务器设置DHCP预留。换句话说,设置静态IP地址。