我們的目標是用Python進行網路封包分析,為了能模擬「流過去」的環境,如果對環境建置不敢興趣可以跳過這一節,監聽的時候一律對本地發送封包也行,不過本地環境必須是Linux,筆者的環境是CentOS。
我們希望能有HostA, HostB和路由器,在HostA或HostB上互相發送封包,然後在路由器上監聽,由於大家通常都只有個人電腦,用VM又太笨重,所以我使用docker為大家展示如何建置環境。
這裡只為大家介紹如何下docker的指令建置我們所要的環境,不深入探討背後的意義,首先,我們要先建立兩個網路bridge
docker network create n1
docker network create n2
下一步,起用三個docker container,分別為HostA, HostB以及router
HostA:docker run --privileged --name hosta --network n1 -it centos:7 /bin/bash
HostB:docker run --privileged --name hostb --network n2 -it centos:7 /bin/bash
Router:docker run --privileged --name router --network n1 --network n2 -it centos:7 /bin/bash
然後對各自三個container裝ifconfig指令好讓能清晰知道HostA和HostB是在不同的LAN上yum update -y && yum install net-tools nc bind-utils -y
跑完後可以自己下ifconfig檢查
我們發現HostA和HostB互ping不會通,但是ping外網就會通,那是因為Host的gateway還沒設定
首先,在router上下ifconfig看router的ip是什麼,會有兩個ip,假設HostA和router共用一個bridgeA,Router在bridgeA的ip是ipA,在HostB上的就是bridgeB和ipB,那麼在HostA下如下指令新增gatewayroute add default gw ipA bridgeA
HostB也要route add default gw ipB bridgeB
之後兩邊互ping,就ping的通了,代表HostA走HostB一定會經過Router,我們就能在Router上分析流過的網路封包。
系列的成果將會放在這:https://github.com/kaichiachen/pytcpdump
文章配合著程式碼有助於學習 :)
Hi kaichiaboy大,
對網路這塊不是很熟,再麻煩大大解惑。
ifconfig
指令看172.21.0.x
屬於哪個bridge,假設是eth0好了,那就執行route add default gw 172.21.0.3 eth0
,代表我的gateway走router的172.21.0.3
還有不懂的歡迎可以留言!
感謝分享~
但當我想要 run router
container 時出現了以下錯誤:
docker: Error response from daemon: Container cannot be connected to network endpoints n1, n2
我的作業平台為 macOS 10.15.7,安裝的 docker 版本為:
$ docker --version Docker version 19.03.13, build 4484c46d9d
查了一下資料,發現有文章(Multiple Docker Networks)提到若有多個 networks 時,只能在 run 的時候給第一個 network、接著再用 docker 指令給第二個 network。修正後我運行 router 的指令改成如下:
$ docker run --privileged --name router --network=n1 -it centos:7 /bin/bash
$ docker network connect n2 router
然後檢查 hosta
的 eth0:
[root@ca37d295a60b /]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.18.0.2 netmask 255.255.0.0 broadcast 172.18.255.255
ether 02:42:ac:12:00:02 txqueuelen 0 (Ethernet)
RX packets 10973 bytes 15837939 (15.1 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 4950 bytes 272095 (265.7 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
hostb
的 eth0:
[root@226e6f67172b /]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.19.0.2 netmask 255.255.0.0 broadcast 172.19.255.255
ether 02:42:ac:13:00:02 txqueuelen 0 (Ethernet)
RX packets 11019 bytes 15840536 (15.1 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 4277 bytes 235841 (230.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
router
的網卡資訊:
[root@7f94a5cec465 /]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.18.0.3 netmask 255.255.0.0 broadcast 172.18.255.255
ether 02:42:ac:12:00:03 txqueuelen 0 (Ethernet)
RX packets 13 bytes 1006 (1006.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.19.0.3 netmask 255.255.0.0 broadcast 172.19.255.255
ether 02:42:ac:13:00:03 txqueuelen 0 (Ethernet)
RX packets 12 bytes 936 (936.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
基於以上資訊,在 hosta
內 ping 172.19.0.2
(試圖 ping hostb
),會無法。
此時在 hosta
中加入以下 gateway:
[root@ca37d295a60b /]# route add default gw 172.18.0.3 eth0
172.18.0.3
是 router
中 n1
的 IP在 hostb
中加入以下 gateway:
[root@226e6f67172b /]# route add default gw 172.19.0.3 eth0
172.19.0.3
是 router
中 n2
的 IPhosta
hostb
就能順利 ping 向彼此了~
是的,關鍵是要加上gateway,讓host知道要經過哪個閘道