【问题标题】:Accessing a socket coded using python TCPServer from outside (external machine)从外部(外部机器)访问使用 python TCPServer 编码的套接字
【发布时间】:2014-05-14 06:09:37
【问题描述】:

我正在使用 TCPServer 制作 python 服务器。我能做的事情是:
1. 从其他终端使用 curl (curl 10.157.41.14:8444 --data "var1=10&var2=15")
2. 在 Xming 中使用 firefox 并输入“localhost:8444”

问题是当我尝试从外部访问服务器时,我无法
我认为这是代码的问题,但我的代码没有发现任何错误。
这就是我在 python 代码上配置主机和端口的方式:

from SocketServer import TCPServer, StreamRequestHandler
import socket

class MyRequestHandler(StreamRequestHandler):
    def handle(self):
        print "A client tried to connect";
        self.wfile.write("success/n this is a replay from the server");


server = TCPServer((socket.gethostname(), 8444), MyRequestHandler)
host, port = server.socket.getsockname()
address = host + ":" + str(port)
message = "Started string-length server at " + address
print message

server.serve_forever()


我尝试改变

server = TCPServer((socket.gethostname(), 8444), MyRequestHandler)

server = TCPServer('', 8444), MyRequestHandler);

到:

server = TCPServer('0.0.0.0', 8444), MyRequestHandler);

这些都不适用于我的情况。所以我接下来要做的是试图找出它是否是我的网络配置或防火墙的问题。问题是我不是这些的出口商。这是我所做的:

user@ip-10-157-41-14:/var/www/server$ netstat -tnlpen | grep "8444\|PID"
(Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State       User       Inode       PID/Program name
    tcp        0      0 10.157.41.14:8444       0.0.0.0:*               LISTEN      1014       106226915   31541/python

然后,我这样做是为了了解有关防火墙的更多信息:

user@ip-10-157-41-14:/var/www/server$ sudo iptables -L
[sudo] password for user:
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

我做的另一件事是打开两个终端(在同一台机器上)
在终端 1 我做了“nc -l 5000”
在终端 2 我做了“nc 10.157.41.14 5000”
它似乎工作。但我无权访问另一台 Linux 机器以从另一台机器上进行尝试。

问题是我不明白上面的2个命令。我花了几个小时试图在 stackoverflow 和其他网站上搜索解决方案,但没有找到适合我的解决方案。

在过去(在同一台机器上),我能够编写 cgi python 服务器,我使用 ajax 调用来调用它,但我必须在我使用的 python 的同一目录中编写一个 .htaccess 文件。以下是我的 .htaccess 文件:

Options +ExecCGI
AddHandler cgi-script .py

但我现在遇到的问题是完全不同的问题。

【问题讨论】:

  • "from outside" 是什么意思?同一本地子网上的另一台机器?还是从您的 NAT 路由器外部?
  • 不,这意味着“一台具有不同 IP 地址的机器”我正在使用 Amazon EC2 作为我的服务器并使用 ssh 连接到它。客户端是我正在使用的 Windows 机器上的浏览器。
  • 您究竟是如何通过 SSH 连接到它的(从家里)? 10.157.41.14 不是公共的、可通过 Internet 路由的 IP 地址。您的 EC2 实例是否有公共 IP?
  • 是的,我在发布之前更改了 IP,这样黑客就无法使用这篇文章来对付我了。所以,是的,我拥有的 IP 是公共 IP,但我没有发布我正在使用的确切 IP。 ip没有问题。但我认为因为我发布了我正在使用的防火墙配置和端口,所以更改 IP 是个好主意。所以一切都没有改变,但IP改变了

标签: python sockets amazon-ec2 firewall iptables


【解决方案1】:

我的问题原来是 Amazon EC2 特有的问题。
我在 Amazon EC2 的一个实例中运行我的服务器
Amazon 实例位于具有 IP 的虚拟私有云 (VPC) 中。
您可以决定该实例是向 Internet 公开还是保持私有。
因此,在 EC2 实例之上还有一层额外的保护。
从 EC2 仪表板中,您可以指定打开的端口号并关闭其他端口号。
我在实例级别做什么并不重要,因为仪表板中的配置不允许打开端口。所以,基本上我在 Amazon EC2 中的安全组中添加了开放端口,它运行良好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-10
    • 2021-07-16
    • 1970-01-01
    • 2012-12-11
    • 2011-07-06
    相关资源
    最近更新 更多