执行摘要。
当我试图在Python中的套接字上进行通信时,我会得到“ConnectionReady111”。当连接被拒绝时,侦听器将停止侦听。使用导入multiprocessing.connection、socket、zeromq也会出现同样的问题。
我的感觉是Python和OS/网络之间的链接不起作用。但是,在ubuntu终端上发出的NC和套接字命令可以通过同一个端口进行通信。
尽管它给我带来了不便,但如果无效的连接请求导致套接字停止侦听,显然存在严重的安全风险。理想的拒绝服务攻击。
证据:
我有两个节目:
t2.py
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
from multiprocessing.connection import Client
def main():
address = ('192.168.1.100', 16001)
conn = Client(address, authkey = b'password')
if __name__ == "__main__":
main()
当我启动监听器(空闲中的f5)时,它似乎启动正常。
>>>
==================== RESTART: /home/william/Midas/api/t2.py ====================
listener ready
ready to connect
套接字开始监听:
状态Recv-Q发送-Q本地地址:端口对等地址:端口处理
听0 1 192.168.1.100:16001 0.0.0:*
但是,当我启动客户机(空闲中的f5)时,我得到以下内容:
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监听套接字消失。
状态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/网络之间的链接不起作用。
尽管它给我带来了不便,但如果无效的连接请求导致套接字停止侦听,显然存在严重的安全风险。理想的拒绝服务攻击。
发布于 2022-03-07 22:25:48
我不能重复你的问题,因此不知道是什么问题。但是,一些评论。
我在代码中添加了一个简单的乒乓交换:
# 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")
# 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次:
$ 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选项卡:
$ python t1.py
b'PONG'
$ python t1.py
b'PONG'
$ python t1.py
b'PONG'
请注意..。你可能认为你命名的这些东西是相同的--但它们有很大的不同:
multiprocessing.connection,套接字,零。
python 进口插座模块直接转换了经典的BSD套接字API。“套接字API”定义了如下内容:端口、侦听端口、连接到端口、接受连接、send
、recv
、close
和其他一些函数。一本关于网络编程的书可能会有所帮助(例如,这本书是随机示例 --我不赞同它)。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是一个很棒的工具。
https://askubuntu.com/questions/1332807
复制相似问题