首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ConnectionRefusedError:[Errno 111]连接被拒绝

ConnectionRefusedError:[Errno 111]连接被拒绝
EN

Ask Ubuntu用户
提问于 2021-04-21 03:31:43
回答 1查看 16K关注 0票数 2

执行摘要。

当我试图在Python中的套接字上进行通信时,我会得到“ConnectionReady111”。当连接被拒绝时,侦听器将停止侦听。使用导入multiprocessing.connection、socket、zeromq也会出现同样的问题。

我的感觉是Python和OS/网络之间的链接不起作用。但是,在ubuntu终端上发出的NC和套接字命令可以通过同一个端口进行通信。

尽管它给我带来了不便,但如果无效的连接请求导致套接字停止侦听,显然存在严重的安全风险。理想的拒绝服务攻击。

证据:

我有两个节目:

t2.py

代码语言:javascript
运行
复制
from multiprocessing.connection import Listener
def main():
    listener = Listener(('192.168.1.100', 16001), authkey=b'password')
    print ("listener ready", listener)
    running = True
    while running :
        print ("ready to connect")
        conn = listener.accept()
        print('connection accepted from', listener.last_accepted)
        
if __name__ == "__main__":
   main()

t1.py

代码语言:javascript
运行
复制
from multiprocessing.connection import Client
def main():
   
    address = ('192.168.1.100', 16001)            
    conn = Client(address, authkey = b'password')        
if __name__ == "__main__":
   main()

当我启动监听器(空闲中的f5)时,它似乎启动正常。

代码语言:javascript
运行
复制
>>> 
==================== RESTART: /home/william/Midas/api/t2.py ====================
 listener ready  

ready to connect

套接字开始监听:

ss -lt

状态Recv-Q发送-Q本地地址:端口对等地址:端口处理

听0 1 192.168.1.100:16001 0.0.0:*

但是,当我启动客户机(空闲中的f5)时,我得到以下内容:

代码语言:javascript
运行
复制
    Traceback (most recent call last):   File "/home/william/Midas/api/t1.py", line 25, in 
        main()   File "/home/william/Midas/api/t1.py", line 15, in main    
        conn = Client(address, authkey = b'password')   File "/usr/lib/python3.8/multiprocessing/connection.py", line 502, in Client    
c = SocketClient(address)   File "/usr/lib/python3.8/multiprocessing/connection.py", line 630, in SocketClient

s.connect(address) ConnectionRefusedError: [Errno 111] Connection refused

and监听套接字消失。

ss -lt

状态Recv-Q发送-Q本地地址:端口对等地址:端口处理

听0 5 127.0.0.1:ipp 0.0.0:*听0 1 127.0.0.1:36093 0.0.0:*听0 5*ipp :*

我尝试过更改端口号,设置FW规则,IP地址从硬编码到"localhost",远程客户端(在Windows上)等等。尽管症状不同,但什么也不起作用。

我尝试使用“套接字导入”对连接进行编程,结果完全相同。零q也不能用。

然而,终端中发出的NC和套接字命令可以通过同一端口进行通信。

我正在运行Ubuntu20.04.2LTS。除了我在windows上尝试的一个客户端之外,所有的测试都是在一个ubuntu系统上完成的。这是一个相当新的安装,所以我不太可能弄坏了什么东西。

谁能告诉我我做错了什么吗?

我的感觉是Python和OS/网络之间的链接不起作用。

尽管它给我带来了不便,但如果无效的连接请求导致套接字停止侦听,显然存在严重的安全风险。理想的拒绝服务攻击。

EN

回答 1

Ask Ubuntu用户

发布于 2022-03-07 22:25:48

我不能重复你的问题,因此不知道是什么问题。但是,一些评论。

我在代码中添加了一个简单的乒乓交换:

代码语言:javascript
运行
复制
# t2.py

from multiprocessing.connection import Listener

listener = Listener(('127.0.5.1', 16001), authkey=b'password')
print ("listener ready", listener)
running = True
while running :
    print ("ready to connect")
    conn = listener.accept()
    print('connection accepted from', listener.last_accepted)
    msg = conn.recv()
    print(f"received: {msg}")
    conn.send(b"PONG")
代码语言:javascript
运行
复制
# t1.py

from multiprocessing.connection import Client
address = ('127.0.5.1', 16001)            
conn = Client(address, authkey = b'password')        
conn.send(b"PING")
print(conn.recv())

并将侦听地址从链路本地子网127.0.0.0/8更改为一个。

然后简单地使用两个终端选项卡/窗口,运行t2.py,然后运行t1.py 3次:

代码语言:javascript
运行
复制
$ python t2.py
listener ready 
ready to connect
connection accepted from ('127.0.0.1', 36702)
received: b'PING'
ready to connect
connection accepted from ('127.0.0.1', 36704)
received: b'PING'
ready to connect
connection accepted from ('127.0.0.1', 36706)
received: b'PING'
ready to connect

服务器进程按预期继续运行。client选项卡:

代码语言:javascript
运行
复制
$ python t1.py
b'PONG'
$ python t1.py
b'PONG'
$ python t1.py
b'PONG'

请注意..。你可能认为你命名的这些东西是相同的--但它们有很大的不同:

multiprocessing.connection,套接字,零。

python 进口插座模块直接转换了经典的BSD套接字API。“套接字API”定义了如下内容:端口、侦听端口、连接到端口、接受连接、sendrecvclose和其他一些函数。一本关于网络编程的书可能会有所帮助(例如,这本书是随机示例 --我不赞同它)。sockets已有近40年的历史,因此您也可以轻松地在网上找到免费的学习材料。

接下来是进口多处理模块。完全不同的故事。它为多进程Python程序提供帮助。它们创建多个PID,并且可以在多个处理器核上运行。几乎可以肯定的是,您希望这些过程能够相互交谈,以完成有用的工作。这就是套接字派上用场的地方:由于进程是由OS彼此隔离的,所以网络提供了一种构建通信的方法(即使它仅限于本地主机)。子模块multiprocessing.connection正是为此提供了符合人体工程学的帮助。

接下来,MQ是一个完全独立的项目(它不是python,也不是python特定的)。它做了一些有趣的事情;它重新定义了另一个“套接字API”。MQ套接字≠BSD套接字。Zeromq套接字可以做BSD套接字不能做的事情(pub/sub,扇出,应用程序级路由)。Zeromq套接字是建立在BSD套接字之上的;如果您对低级API有问题,我建议您在使用基本的基本套接字后才能使用ZMQ。

尽管症状各不相同,但什么也不起作用。

同样,您应该习惯于解释网络故障模式。提出的错误码具有精确的定义意义。例如,经典的Connection refused errno 111意味着您connect()要的主机的初始SYN包是用一个RST数据包来响应的,而不是普通的SYN+ACK --通常是在没有程序监听您connect()到的远程计算机上的给定端口时发生的。

关于你的安全问题还有一句话。您应该始终假定网络是对抗性的(敌对的),无论在时空上是否确实如此,甚至在本地主机网络中也是如此。这就是为什么高级多处理API有authkey参数的原因;它几乎总是需要的。password字节串是authkey最糟糕的值之一,请尝试更好的方法。一个活跃的网络对手,理论上可以解释你的问题;有一种叫做"RST注入攻击“的东西。您可能也已经耗尽了/SOMAXCONN。

最后,Wireshark是一个很棒的工具。

票数 1
EN
页面原文内容由Ask Ubuntu提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://askubuntu.com/questions/1332807

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档