Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 斯卡皮公司;Docker:Get container';不使用容器ID的s IP地址?_Python 3.x_Docker_Tcp_Scapy_Docker Networking - Fatal编程技术网

Python 3.x 斯卡皮公司;Docker:Get container';不使用容器ID的s IP地址?

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脚本非常繁琐。有什么想法吗?我尝试过使

使用Scapy(在Python3.6中)和Docker比较IP地址的最简单方法是什么?我有一段代码,它使用Scapy sniff()嗅探我的Docker网桥网络。我想查看每个数据包的源IP地址,如果它与名为“plc1”的容器的IP地址匹配,请执行其他步骤。如果它们不匹配,我只返回一个空列表,然后继续

但是,我不知道如何将数据包的源IP地址与容器名称进行比较。它实际上需要的是容器的名称,而不是ID,因为我并行运行了大量容器,查找ID以插入我的Python3.6脚本非常繁琐。有什么想法吗?我尝试过使用Docker SDK,但它需要容器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()
then
container=client.containers.list(filters={“name”:“5extraxtNodes\u plc1\u 1})
then
ip\u add=container.attrs['NetworkSettings']['IPAddress']
以查找容器plc1的ip地址。在与
plc1
相同的网桥网络上运行此python容器时,出现“无此类文件或目录”错误。如果我将此python代码的
网络
更改为
主机
模式,则会出现相同的错误。