Python 3.x 斯卡皮公司;Docker:Get container';不使用容器ID的s IP地址?
使用Scapy(在Python3.6中)和Docker比较IP地址的最简单方法是什么?我有一段代码,它使用Scapy sniff()嗅探我的Docker网桥网络。我想查看每个数据包的源IP地址,如果它与名为“plc1”的容器的IP地址匹配,请执行其他步骤。如果它们不匹配,我只返回一个空列表,然后继续 但是,我不知道如何将数据包的源IP地址与容器名称进行比较。它实际上需要的是容器的名称,而不是ID,因为我并行运行了大量容器,查找ID以插入我的Python3.6脚本非常繁琐。有什么想法吗?我尝试过使用Docker SDK,但它需要容器ID,这正是我试图避免的 Python3.6代码示例(不起作用)如下所示:Python 3.x 斯卡皮公司;Docker:Get container';不使用容器ID的s IP地址?,python-3.x,docker,tcp,scapy,docker-networking,Python 3.x,Docker,Tcp,Scapy,Docker Networking,使用Scapy(在Python3.6中)和Docker比较IP地址的最简单方法是什么?我有一段代码,它使用Scapy sniff()嗅探我的Docker网桥网络。我想查看每个数据包的源IP地址,如果它与名为“plc1”的容器的IP地址匹配,请执行其他步骤。如果它们不匹配,我只返回一个空列表,然后继续 但是,我不知道如何将数据包的源IP地址与容器名称进行比较。它实际上需要的是容器的名称,而不是ID,因为我并行运行了大量容器,查找ID以插入我的Python3.6脚本非常繁琐。有什么想法吗?我尝试过使
#!/usr/bin/env python3
from scapy.all import *
def find_ports(pkt):
# if src IPaddr matches IP addr of container plc1...
if pkt[IP].src == 'plc1': # THIS DOES NOT WORK
# if there is a match, get some additional packet info
if TCP in pkt:
tcp_dport = pkt[TCP].dport
ip_total_len = pkt.getlayer(IP).len
ip_header_len = pkt.getlayer(IP).ihl * 32 / 8
tcp_header_len = pkt.getlayer(TCP).dataofs * 32 / 8
tcp_seg_len = ip_total_len - ip_header_len - tcp_header_len
sequence_num = pkt[1].ack
return [tcp_dport, tcp_seg_len, sequence_num]
# else if NO MATCHING ip addr's, return blank list...
else:
return []
tempList = sniff(filter="ip", prn=find_ports, iface="br-19f0ba1cf88f")
# if templist not empty...
if tempList:
# send a TCP RST packet...
ip = IP(src="plc1", dst="hmi_pass_thru")
tcp = TCP(sport=502, dport=tempList[0], flags="R", seq=int(tempList[1]), ack=int(tempList[2]) + 1)
pkt = ip / tcp
ls(pkt)
send(pkt, verbose=0)
如果您使用的是docker py,我可能会从所有容器开始,并使用该列表查找感兴趣的IP地址(或者,如果它不是单个容器,则构建一个从IP地址到容器名称的映射)。@DavidMaze因此我在我的
find_ports
函数中添加了一些行以匹配您的建议。在IF语句之前,我执行:client=docker.DockerClient()
thencontainer=client.containers.list(filters={“name”:“5extraxtNodes\u plc1\u 1})
thenip\u add=container.attrs['NetworkSettings']['IPAddress']
以查找容器plc1的ip地址。在与plc1
相同的网桥网络上运行此python容器时,出现“无此类文件或目录”错误。如果我将此python代码的网络
更改为主机
模式,则会出现相同的错误。