Tengo un sistema Linux (que sea A) con 2 tarjetas ethernet, a saber, eth0 y eth1 que están conectadas a dos LAN totalmente no relacionadas.
Básicamente, eth0 se usa para el tráfico normal de aplicaciones y eth1 se usa solo para fines de depuración. La depuración significa que eth1 está vinculado mediante un cable cruzado a otra caja de Linux (que sea B) que ejecuta Wireshark. Quiero que Wireshark pueda procesar paquetes de aplicaciones que viajan en el eth0 de A.
Básicamente, necesito copiar los paquetes de viaje de la interfaz eth0 a la interfaz eth1 para que Wireshark en la casilla B pueda rastrearlos (por algunas razones no tengo acceso físico a LAN eth0). También podría necesitar especificar qué paquetes copiar de eth0 a eth1 de acuerdo con alguna regla (por cierto, según los campos TCP / IP).
También tenga en cuenta que el eth0 de A no necesita ponerse en modo promiscuo porque solo quiero copiar un subconjunto de paquetes que tienen A como destino
¿Hay alguna manera de lograr esto usando solo iptables? ¿O necesito escribir una aplicación para que esto funcione? ¿Qué debo hacer para "copiar" los paquetes?
fuente
Puede usar la acción reflejada tc. Por ejemplo: para el tráfico entrante:
Para tráfico saliente:
fuente
Busque en la red tcpbridge, que es exactamente lo que hace el trabajo. También se puede usar para hablar con máquinas virtuales.
fuente
Algo como rinetd podría funcionar (redirector / servidor para TCP solo creo, por lo que no hay ARP, capa 2, etc.), pero honestamente, obtener algunos conmutadores administrados que tengan capacidades de duplicación de puertos o si esa caja se usa únicamente para cables de conexión, podría agregarle otra NIC, conectar las dos interfaces, ponerla frente al eth0 de la máquina A y tener una máquina de detección exclusiva.
fuente
Un dispositivo que copia tramas de Ethernet de una interfaz a otra es un puente. Puede configurar su sistema Linux para que actúe como un puente. Alguna documentación se puede encontrar aquí:
Puede aplicar reglas de filtrado al tráfico puenteado utilizando ebtables , que es un análogo del
iptables
tráfico de capa 2.fuente
En mi configuración, el tráfico TX de multidifusión estaba marcado por iptables, pero el enrutamiento de políticas utilizando nuevas tablas de enrutamiento nunca funcionó. Aunque funcionó para paquetes TX de unidifusión (redirigiendo paquetes de origen de eth0 a eth5). Usando tc, podría llevar el tráfico eth0 mcast a eth5. La dirección src mac y src ip se cambian a la de eth5, por lo que no creará problemas con los aprendizajes de los conmutadores. Todo el soporte del núcleo para la programación de paquetes del núcleo CONFIG_NET_SCHED debe estar habilitado
Abajo FUNCIONA para el tráfico de unidifusión y multidifusión que redirige de eth0 a eth5
Netfilter se puede usar para interactuar directamente con la estructura que representa un paquete en el núcleo. Esta estructura, sk_buff, contiene un campo llamado "__u32 nfmark" que vamos a modificar. TC leerá ese valor para seleccionar la clase de destino de un paquete.
IP_ADDR_ETH0 =
ifconfig eth0 | grep 'inet addr'| cut -d ':' -f 2 | cut -d ' ' -f 1 | tr -d '\n'
iptables -t mangle -A OUTPUT -s $ {IP_ADDR_ETH0} -p udp --match multipuerto --dports 329,330 -o eth0 -j MARK --set-mark 2Vamos a crear un árbol que represente nuestra política de programación y que use el qdisc PRIO (programador de paquetes) (puede probar otros disponibles). qdiscs adjuntando en la raíz de un dispositivo
tc qdisc add dev eth0 root handle 15: prio
Ahora tenga a un lado una política de modelado de tráfico y al otro lado la marca de paquetes. Para conectar los dos, necesitamos un filtro.
refer man tc-mirred (8): la acción mirred permite la duplicación de paquetes (copia) o la redirección (robo) del paquete que recibe. La duplicación es lo que a veces se denomina Switch Port Analyzer (SPAN) y se usa comúnmente para analizar y / o depurar flujos.
refer man tc-fw (8): fw - filtro de control de tráfico fwmark el filtro fw permite clasificar paquetes basados en un fwmark previamente establecido por iptables. Si es idéntico al 'identificador' del filtro, el filtro coincide. iptables permite marcar paquetes individuales con el objetivo MARK, o conexiones completas usando CONNMARK.
MAC_ADDR_ETH1 =
cat /sys/class/net/eth1/address
IP_ADDR_ETH1 =ifconfig eth1 | grep 'inet addr'| cut -d ':' -f 2 | cut -d ' ' -f 1 | tr -d '\n'
tc filter add dev eth0 parent 15: 0 protocol ip prio 1 handle 0x2 fw action pedit ex munge eth src set $ {MAC_ADDR_ETH1} pipe \ action pedit ex munge ip src set $ {IP_ADDR_ETH1} pipe \ action mirred redirect de salida dev eth1mostrar las reglas establecidas arriba: tc qdisc show dev eth0 filtro tc show dev eth0
eliminar / desarmar las reglas establecidas arriba: tc qdisc del dev eth0 root
fuente