Dédier une interface réseau à une application

Bonsoir,

Mon serveur multimédia a grillé ce soir. :confused: :010
Il semble que ce soit la carte mère. Bref, passons. :102
Ma machine principale peut largement faire office de serveur sauf en terme de bande passante.
C’est pourquoi j’ai récupéré la carte réseau de mon “ancien serveur” (ainsi que les périph de stockage) pour la mettre sur ma machine.
Après quelques galères, les 2 cartes cohabitent sans problème.

Je souhaiterai dédier la carte rajoutée uniquement pour le serveur multimédia et que toutes les autres applications utilisant le réseau (quelque soit le port) utilisent la carte principale.

Peut-on le faire sans iptables ? Avec ou sans iptables, comment ? (je suis vraiment une bille en “réseau”)

merci par avance !

Ça dépend. Quelle est la topologie réseau ?

les 2 cartes sont sur configurées pour être sur le même réseau en DHCP.

un routeur qui distribue (box) :
- mon pc (avec les 2 cartes)
- un autre pc (sur le même réseau en DHCP)
- une console

Ça commence plutôt mal. En général il vaut mieux éviter d’avoir plusieurs interfaces en DHCP actives simultanément sur une même machine.
Quel est le problème avec la bande passante ?

Bon alors voilà : ces 2 cartes ayant le même débit, que j’utilise l’une ou l’autre pour le serveur multimédia ne me pose pas de soucis (je fais référence au fait qu’une carte peut devenir eth0 ou eth1 suivant les boot).

j’ai vu qu’il y avait tuxguardian pour faire ce que je souhaitais. J’ai finalement considéré que mon besoin pouvait se limiter au port utilisé par l’application. Du coup, je me suis lancé dans la configuration d’iptables.

J’y ai créer les règles suivantes :

-A INPUT -p tcp --dport 5001 -i eth0  -j REJECT
-A OUTPUT -p tcp --dport 5001 -o eth0 -j REJECT

-A INPUT -p tcp --dport 5001 -i eth1 -j ACCEPT
-A OUTPUT -p tcp --dport 5001 -o eth1 -j  ACCEPT


#-A INPUT ! -p tcp ! --dport 5001 -i eth1 -j DROP
# la règle précédante ne fonctionne pas car formalisme uniquement valable pour ipv6
# du coup, on la scinde en 2 :
-A INPUT ! -p tcp -i eth1 -j DROP
-A OUTPUT -p tcp ! --dport 5001 -o eth1 -j DROP

Ça va juste bloquer le trafic sur la carte mais en aucun cas faire la répartition que tu souhaites entre les cartes. Pascal te le dira sans doute mais il te faut à mon avis marquer les paquets correspondant au port (5001) via -j MARK et faire un table de routage orientant les paquets en fonction de la marque.

Bonsoir,

Y a quelque temps, j’avais besoin de faire à peu près la même chose (voir mon post https://www.debian-fr.org/routage-different-selon-le-programme-t36516.html).

Le tuto suivante de syam te sera sûrement d’une aide précieuse : isalo.org/wiki.debian-fr/ind … s_internet

Librement,

François a raison. Ces règles ne font que du filtrage, pas de la répartition. Et le noyau est très bête : si on bloque les paquets sur une interface, il ne va pas essayer de les envoyer par l’autre. C’est une question de table de routage : si ça dit de sortir par telle interface pour telle destination, le noyau s’y conforme strictement.

En revanche il y a d’autres stratégies que le marquage de paquets. Par exemple on peut faire en sorte que certaines applications utilisent une adresse IP dédiée, et router le trafic sortant en fonction de l’adresse source.

Une autre approche est la répartition de charge par agrégation de liens, au niveau IP ou des interfaces ethernet. Au niveau ethernet, cela se fait avec le “bonding” en mode balance-rr. Au niveau IP, cela peut se faire par exemple avec une route multipath ou avec l’interface virtuelle teql (true equalizer). Cf. le LARTC-howto.

Bon et bien il semble que vous ayez raison
Ce que j’ai mis en place ne fonctionnait plus ce matin :confused:

Je regarderai à tête reposée vos remarques/liens ce soir.

Merci

nb : j’ai pas regardé plus loin que le bout de mon nez sur ce coup là (et j’en suis pas fière) mais l’explication de PascalHambourg est logique.

Il y a tout de même quelque chose que je ne comprends pas :

  • Mon serveur uPnP (PMS - Playstation media server) permet de spécifier l’interface à utiliser --> j’ai mis eth1
  • La console recherche sur le réseau et donc devrait chercher sur mes 2 interfaces. Ma configuration ne devrait t’elle pas lui permettre de passer par l’eth1 ? alors qu’elle trouve aléatoirement le serveur uPnP…

Il faut avoir conscience que connecter plusieurs interfaces d’une machine à un même réseau n’est pas une situation normale.

J’ai oublié un point important dans mon message précédent : si on utilise une solution au niveau IP, il faut s’assurer que la validation d’adresse source (rp_filter) n’est pas activée, pour les deux interfaces au moins. Voir dans /etc/sysctl.conf.

Bonsoir, je n’y arrive pas avec les liens donnés…et surtout je ne maitrise pas ce que je fait :unamused:

Cependant, je n’ai pas encore laché l’affaire (mais je suis à 1 doigt --> pas de référence cinématographique svp :wink:)

Je suis parti plutôt vers cette solution qui me parait moins complexe.

Ce qui donne ce script :

#!/bin/bash

# Créer les règles de routage (avant de créer le marquage de paquets)
# Usage:
#    createRoutingPolicy MARKER IFACE IFACE_IP GATEWAY
createRoutingPolicy()
{
  local MARKER="$1"
  local IFACE="$2"
  local IFACE_IP="$3"
  local GATEWAY="$4"

  # (2) table de routage alternative
  ip route flush table "$MARKER"
  ip route show table main | grep -Ev ^default | while read ROUTE; do ip route add table "$MARKER" $ROUTE; done
  ip route add table "$MARKER" default via "$GATEWAY" dev "$IFACE"

  # (3) activation du routage
  ip rule add fwmark "$MARKER" table "$MARKER"
  ip route flush cache

  # (4) translation NAT
  iptables -t nat -A POSTROUTING -o "$IFACE" -m mark --mark "$MARKER" ! -s "$IFACE_IP" -j SNAT --to-source "$IFACE_IP"
}

# Créer le marquage de paquets (une fois les règles de routage en place)
# Usage:
#   createMarkingPolicy MARKER [REGLES_IPTABLES]*
createMarkingPolicy()
{
  local MARKER="$1"
  shift
  # (5) ajout du marquage de paquets
  iptables -t mangle -A OUTPUT "$@" -j MARK --set-mark "$MARKER"
}

# Supprimer le marquage de paquets (avant de supprimer les règles de routage)
# Usage:
#   removeMarkingPolicy MARKER [REGLES_IPTABLES]*
removeMarkingPolicy()
{
  local MARKER="$1"
  shift
  # (5) suppression du marquage de paquets
  iptables -t mangle -D OUTPUT "$@" -j MARK --set-mark "$MARKER"
}

# Supprimer les règles de routage (une fois le marquage de paquets supprimé)
# Usage:
#    removeRoutingPolicy MARKER IFACE IFACE_IP
removeRoutingPolicy()
{
  local MARKER="$1"
  local IFACE="$2"
  local IFACE_IP="$3"

  # (4) translation NAT
  iptables -t nat -D POSTROUTING -o "$IFACE" -m mark --mark "$MARKER" ! -s "$IFACE_IP" -j SNAT --to-source "$IFACE_IP"

  # (3) désactivation du routage
  ip rule del fwmark "$MARKER" table "$MARKER"

  # (2) table de routage alternative
  ip route flush table "$MARKER"
  ip route flush cache
}


pmsGroup="pmsgrp"
pmsUser="$1"
iface="$2"
gateway="$3"
marker=100

PWD="$(cd "$(dirname "$0")";pwd)/"

# recuperation de l'adresse ip de ${iface}
{ read; read -a infos; } < <(ifconfig ${iface})
iface_ip="${infos[1]#*:}"

# creation du groupe dédié à pms si besoin
grep -q "^${pmsGroup}" /etc/group || {
	addgroup "${pmsGroup}"
	find "${PWD}" -exec chown :${pmsGroup} {} +
}

# ajout du groupe à l'utilisateur si besoin
grpsUser="$(groups ${pmsUser})"
grpsUser=" ${grpsUser#*:} "
[[ "${grpsUser}" == *\ ${pmsGroup}\ * ]] || usermod -a -G "${pmsGroup}" "${pmsUser}"

# création de la stratégie
createRoutingPolicy "${marker}" "${iface}" "${iface_ip}" "${gateway}"
createMarkingPolicy "${marker}" -m owner --gid-owner "${pmsGroup}"

# suppression de la stratégie
#removeMarkingPolicy "${marker}" -m owner --gid-owner "${pmsGroup}"
#removeRoutingPolicy "${marker}" "${iface}" "${iface_ip}"

Mais lorsque je le lance, j’obtiens ceci : RTNETLINK answers: File exists

…et bien évidemment ma console ne trouve pas PMS :smiling_imp:
et pourtant, dans les logs de PMS, je vois ceci : [quote][Thread-12] INFO 22:29:18.104 No IP filter specified, access granted to /192.168.1.39
[/quote]
(192.168.1.39 étant l’IP de la console)

Autre chose, si je précise eth0 à PMS, ça fonctionne nickel :12

Si besoin :

# cat /etc/network/interfaces 
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug eth0
auto eth0
#iface eth0 inet dhcp
iface eth0 inet static
  address 192.168.1.31
  netmask 255.255.255.0
  gateway 192.168.1.254

allow-hotplug eth1
auto eth1
#iface eth1 inet dhcp
iface eth1 inet static
  address 192.168.1.32
  netmask 255.255.255.0
  gateway 192.168.1.254
#route
  address 192.168.1.100
  netmask 255.255.255.0
  gateway 192.168.1.1

PS : pour ce soir, je lache l’affaire, ça fait 3 heures que j’y suis --> je vais me matter un film