Prueba aislada de red en un servidor Linux que ejecuta un servidor web (lightttpd) y (curl) clientes

StackOverflow https://stackoverflow.com//questions/12671587

Pregunta

Estoy escribiendo una herramienta de prueba que requiere de tráfico conocidas para ser capturado de una NIC (utilizando libpcap), luego se introduce en la aplicación que estamos tratando de probar.

Lo que estoy tratando de configurar un servidor web (en este caso, lighttpd) y un cliente (curl) que se ejecutan en la misma máquina, en una prueba aislada de la red.Una secuencia de comandos de la unidad de toda la instalación, y el objetivo es ser capaz de especificar un número de clientes, así como un conjunto de archivos para cada cliente para la descarga desde el servidor web.

Mi planteamiento inicial era utilizar simplemente la de loopback (lo) de la interfaz...ejecutar el servidor web en la dirección 127.0.0.1, los clientes buscar sus archivos de http://127.0.0.1, y ejecutar mi libpcap-herramienta basada en la lo de la interfaz.Esto funciona ok, aparte del hecho de que la interfaz de bucle invertido no emula una verdadera interfaz Ethernet.El principal problema con eso es que los paquetes son todos inconsistente tamaños...32kbytes y más grande, y algo aleatorio...además no es posible bajar el MTU en lo (bueno, puede, pero no tiene ningún efecto!).

También he intentado correr en mi real de la interfaz (eth0), pero ya que es una web interno del cliente consultar a un servidor web interno, el tráfico nunca sale de la interfaz, por lo que libpcap nunca lo ve.

Así que me volví a tun/tap.He utilizado socat para enlazar dos interfaces tun junto con una conexión tcp, así que en efecto, yo tenía:

10.0.1.1/24 <-> tun0 <-socat-> tcp connection <-socat-> tun1 <-> 10.0.2.1/24

Esta parece una muy buena solución...tun/tap dispositivos de emular real de los dispositivos Ethernet, para que yo pueda correr mi servidor web en tun0 (10.0.1.1) y mi herramienta de captura en tun0, y se unen a mis clientes a tun1 (10.0.2.1)...Puedo incluso el uso de tc para aplicar la conformación de las reglas para este tipo de tráfico y crear un virtual WAN dentro de mi caja de linux...pero simplemente no funciona...

Aquí están los socat comandos que he usado:

$ socat -d TCP-LISTEN:11443,reuseaddr TUN:10.0.1.1/24,up &
$ socat TCP:127.0.0.1:11443 TUN:10.0.2.1/24,up &

Que produce 2 interfaces tun (tun0 y tun1), con sus respectivas direcciones IP.

Si me quedo ping -I tun1 10.0.1.1, no hay ninguna respuesta, pero cuando me tcpdump -n -i tun0, veo las peticiones de eco ICMP lo que es para el otro lado, simplemente no hay signo de la respuesta que viene de vuelta.

# tcpdump -i tun0 -n
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on tun0, link-type RAW (Raw IP), capture size 65535 bytes
16:49:16.772718 IP 10.0.2.1 > 10.0.1.1: ICMP echo request, id 4062, seq 5, length 64
<--- insert sound of crickets here (chirp, chirp)

Así que me estoy perdiendo algo obvio o es el enfoque equivocado?¿Hay algo más que pueda probar (por ejemplo,2 interfaces físicas, eth0 y eth1???).

La forma más fácil es usar 2 máquinas, pero quiero que todos los de este autónomo, por lo que puede ser programado y automatizado en una sola máquina, sin y otras dependencias...

ACTUALIZACIÓN:

No hay ninguna necesidad de que el 2 socats para ser conectado con una conexión tcp, es posible (y preferible para mí) para hacer esto:

socat TUN:10.0.1.1/24,up TUN:10.0.2.1/24,up &

El mismo problema todavía existe, aunque...

¿Fue útil?

Solución

OK, así que he encontrado una solución con el uso de Linux de la red de espacios de nombres (netns).Hay un artículo útil acerca de cómo usarlo aquí: http://code.google.com/p/coreemu/wiki/Namespaces

Esto es lo que yo hice para mi configuración....

En primer lugar, descargar e instalar: http://cs.itd.nrl.navy.mil/work/core/index.php

A continuación, ejecute este script:

#!/bin/sh

core-cleanup.sh > /dev/null 2>&1
ip link set vbridge down > /dev/null 2>&1
brctl delbr vbridge > /dev/null 2>&1

# create a server node namespace container - node 0
vnoded -c /tmp/n0.ctl -l /tmp/n0.log -p /tmp/n0.pid > /dev/null
# create a virtual Ethernet (veth) pair, installing one end into node 0
ip link add name veth0 type veth peer name n0.0
ip link set n0.0 netns `cat /tmp/n0.pid`
vcmd -c /tmp/n0.ctl -- ip link set n0.0 name eth0
vcmd -c /tmp/n0.ctl -- ifconfig eth0 10.0.0.1/24 up

# start web server on node 0
vcmd -I -c /tmp/n0.ctl -- lighttpd -f /etc/lighttpd/lighttpd.conf

# create client node namespace container - node 1
vnoded -c /tmp/n1.ctl -l /tmp/n1.log -p /tmp/n1.pid > /dev/null
# create a virtual Ethernet (veth) pair, installing one end into node 1
ip link add name veth1 type veth peer name n1.0
ip link set n1.0 netns `cat /tmp/n1.pid`
vcmd -c /tmp/n1.ctl -- ip link set n1.0 name eth0
vcmd -c /tmp/n1.ctl -- ifconfig eth0 10.0.0.2/24 up

# bridge together nodes using the other end of each veth pair
brctl addbr vbridge
brctl setfd vbridge 0
brctl addif vbridge veth0
brctl addif vbridge veth1
ip link set veth0 up
ip link set veth1 up
ip link set vbridge up

Esto, básicamente, establece 2 virtual/aislado/nombre de espacio de las redes en el host de Linux, en este caso, el nodo 0 y el nodo 1.Un servidor web se inicia en el nodo 0.

Todo lo que necesitas hacer ahora es ejecutar curl en el nodo 1:

vcmd -c /tmp/n1.ctl -- curl --output /dev/null http://10.0.0.1

Y supervisar el tráfico con tcpdump:

tcpdump -s 1514 -i veth0 -n

Esto parece que funciona bastante bien...todavía experimentos, pero parece que se va a resolver mi problema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top