docker容器内抓取宿主机物理网卡包
需求描述:
在docker容器内,实现对宿主机物理网卡的抓包
OS: Ubuntu server 18.04 x64
1. 宿主机安装docker功能
# 下载docker
chenzd@ubuntu:~# wget -qO- https://get.docker.com/ | sh
# 查看是否安装成功
chenzd@ubuntu:~# docker --version
Docker version 18.09.7, build 2d0083d
# 启动docker服务
chenzd@ubuntu:~# sudo service docker start
# 运行docker的hello word, 此命令会现从网上下载,因此启动需要时间
chenzd@ubuntu:~# sudo docker run hello-world
2. 拉取Ubuntu镜像
- 下载image
# 拉取Ubuntu 镜像
chenzd@ubuntu:~# docker pull ubuntu
# 查看image列表
chenzd@ubuntu:~# docker iamges
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest 3556258649b2 3 weeks ago 64.2MB
hello-world latest fce289e99eb9 7 months ago 1.84kB
- 运行容器
chenzd@ubuntu:~# docker run -it ubuntu bash
# 进入docker的bash
root@daa71e046c4e:/#
3. 容器镜像内安装抓包软件
root@daa71e046c4e:/# apt-get update
# 安装ping、 安装ifconfig、安装tcpdump抓包软件
root@daa71e046c4e:/# apt-get install iputils-ping net-tools tcpdump
4. 测试抓取容器网卡的数据
root@daa71e046c4e:/# tcpdump -i eth0
# 此时,仅能抓取到容器的进出网络数据,无法抓取到宿主设备物理网卡的数据。
5. 退出docker,提交images
由于刚刚安装了软件,若直接退出,下次run的时候,启动的又是一个全新的Ubuntu。因此需要提交images
root@daa71e046c4e:/# exit
# 退出到宿主机,注意用户的变化
# docker commit [id] [newname]
chenzd@ubuntu: docker commit daa71e046c4e ubuntu-capture
# 再次观察images
chenzd@ubuntu:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu-capture latest 9e7e71974ac9 4 minutes ago 99.1MB
ubuntu latest 4c108a37151f 4 months ago 64.2MB
hello-world latest fce289e99eb9 7 months ago 1.84kB
6. 测试抓取宿主机网卡的数据
chenzd@ubuntu:~# sudo tcpdump -i enp2s0
可以观察出,在容器内抓取的数据远小于宿主机上抓到的数据,不放心的话也可以-w保存到pcap包,然后用wireshark仔细核对。
7. 停止docker服务
chenzd@ubuntu:~# sudo service docker stop
8. 网卡配置为混杂模式
chenzd@ubuntu:~# sudo ifconfig set enp4s0 promisc
9. 配置网桥
# 安装网桥管理软件brctl
chenzd@ubuntu:~# sudo apt-get install bridge-utils
# 创建网桥
chenzd@ubuntu:~# sudo brctl addbr br0
# 添加物理网卡
chenzd@ubuntu:~# sudo brctl addif br0 enp4s0
# 关闭docker原网桥
chenzd@ubuntu:~# sudo ifconfig docker0 down
10. 修改docker配置文件,使其可指向新创建的网桥
#创建daemon.json文件
chenzd@ubuntu:~# vim /etc/docker/daemon.json
# 向该文件添加内容
{
"bridge":"br0"
}
若先修改为桥接,可能导致容器内无法联网影响软件的安装,因此请在可以联网的情况下先安装好上面的软件
11. 运行容器
docker run -it ubuntu-capture bash
12. 进行测试
root@daa71e046c4e:~# tcpdump -i eth0
# 查看打印输出是否有物理网卡以外局域网数据,本实验宿主机接在交换机镜像口上。
# 此时正常情况下,抓不到镜像数据,只有少量的UDP广播包