O Script abaixo permite a criação de um ambiente de testes com dois containers com imagens ubuntu instaladas e ferramentas de teste de redes:
#######################################
#!/bin/bash
#Cria os hosts
docker run -itd --name h1 dnredson/hostup
docker run -itd --name h2 dnredson/hostup
docker run -itd --name sw1 dnredson/p4d
#Adiciona as interfaces Veth
sudo ip link add veth1 type veth peer name veth2
sudo ip link add veth3 type veth peer name veth4
#salva as informações de estado de cada container para criar os namespaces
PID1=$(docker inspect -f '{{.State.Pid}}' h1)
PID2=$(docker inspect -f '{{.State.Pid}}' sw1)
PID3=$(docker inspect -f '{{.State.Pid}}' h2)
#adiciona cada interface para o namespace correspondente
sudo ip link set veth1 netns $PID1
sudo ip link set veth2 netns $PID2
sudo ip link set veth3 netns $PID2
sudo ip link set veth4 netns $PID3
#Configura cada uma das interfaces
#Configura a veth1 com endereço IP, MAC e incia
sudo nsenter -t $PID1 -n ip addr add 192.168.1.1/24 dev veth1
sudo nsenter -t $PID1 -n ip link set dev veth1 address 00:00:00:00:01:01
sudo nsenter -t $PID1 -n ip link set veth1 up
#Configura a veth2 com endereço IP, MAC e incia
sudo nsenter -t $PID2 -n ip addr add 192.168.1.2/24 dev veth2
sudo nsenter -t $PID2 -n ip link set dev veth2 address 00:00:00:00:01:02
sudo nsenter -t $PID2 -n ip link set veth2 up
#Configura a veth3 com endereço IP, MAC e incia
sudo nsenter -t $PID2 -n ip addr add 192.168.2.2/24 dev veth3
sudo nsenter -t $PID2 -n ip link set dev veth3 address 00:00:00:00:02:01
sudo nsenter -t $PID2 -n ip link set veth3 up
#Configura a veth4 com endereço IP, MAC e incia
sudo nsenter -t $PID3 -n ip addr add 192.168.2.3/24 dev veth4
sudo nsenter -t $PID3 -n ip link set dev veth4 address 00:00:00:00:02:02
sudo nsenter -t $PID3 -n ip link set veth4 up
#######################################
Uma vez configurados, acessar o terminal de cada um dos hosts para configuração de rotas, forçando o tráfego a passar pelo container switch.
Seguindo o exemplo do script acima:
No switch 1:
route add -net 192.168.2.3 netmask 255.255.255.255 gw 192.168.1.2
No switch 2:
route add -net 192.168.1.1 netmask 255.255.255.255 gw 192.168.2.2
No switch:
Acessar o container para execução do switch bmv2 com o código p4 compilado. Para o exemplo acima, iniciar como:
simple_switch --log-console -i 1@veth2 -i 2@veth3 standard.json
O arquivo standard.json é um exemplo de um programa p4 compilado simples, está disponível em:
https://github.com/dnredson/geradoresDeTrafego/blob/main/standard.json
Para compilar seu próprio código P4, utilize o container p4c https://hub.docker.com/r/p4lang/p4c . Em breve, o compilador será incorporado ao P4D.
Caso deseje adicionar entradas na tabela de roteamento através do controlador do switch, acesse o terminal do container e inicie o client do bmv2:
simple_switch_CLI
adicionar as entradas, no scrip acima, o exemplo seria:
table_add MyIngress.ipv4_lpm ipv4_forward 192.168.2.3 => 00:00:00:00:02:02 2
table_add MyIngress.ipv4_lpm ipv4_forward 192.168.1.1 => 00:00:00:00:01:01 1
Desta forma, o ambiente está configurado.
##################################
#!/bin/bash
containers=("h1" "h2" "sw1" "sw2" )
for container in "${containers[@]}"; do
if [ $(docker ps -a -q -f name=^/${container}$) ]; then
echo "Removendo o contêiner $container..."
docker stop $container
docker rm $container
fi
done
veths=("veth1" "veth2" "veth3" "veth4" "veth5" "veth6")
for veth in "${veths[@]}"; do
if ip link show | grep -q $veth; then
echo "Removendo a interface $veth..."
sudo ip link delete $veth
fi
done
echo "Ambiente limpo com sucesso!"
#################################
Content type
Image
Digest
sha256:9cd2aea36…
Size
442 MB
Last updated
over 2 years ago
docker pull dnredson/p4d