5 votes

Transfert de port entre interfaces pontées

J'ai donc un certain nombre d'interfaces de pont liées à mon périphérique Ethernet principal ( em1 , blâmer HP). Ils servent les différents conteneurs LXC que j'ai sur mon serveur et me permettent d'y accéder facilement à partir d'autres appareils physiques sur le réseau.

name    id                  STP   interfaces    IP
br0     8000.989096db8b8a   no    em1           10.10.0.2
                                  veth236T4V    10.10.0.15
                                  veth269GNR    10.10.0.16
                                  vethBYBC0Y    10.10.0.17

Ces derniers obtiennent tous leur IP à partir du réseau principal DHCP (qui attribue des baux statiques).

Je souhaite déplacer un service qui fonctionne sur l'hôte principal ( em1 , 10.10.0.2 (ports 9000, 9001) au premier conteneur LXC. C'est ce que j'ai fait et je peux maintenant accéder aux choses par l'intermédiaire de 10.10.0.15:9000-9001 mais tout le reste du réseau s'attend à le voir sur 10.10.0.2:9000-9001 .

Transfert de port traditionnel par l'intermédiaire de iptables ne semble pas fonctionner. J'ai essayé :

-A PREROUTING -i em1 -p tcp --dport 9000 -j DNAT --to 10.10.0.15:9000
-A PREROUTING -i em1 -p tcp --dport 9001 -j DNAT --to 10.10.0.15:9001

Et j'ai essayé br0 au lieu de em1 mais aucune ne fonctionne.

Lors d'une recherche effectuée à 3 heures du matin, j'ai trouvé un grand nombre d'informations suggérant que j'avais besoin de ebtables mais je n'en avais jamais entendu parler auparavant. La moitié du problème semble résider dans le fait que la plupart des gens utilisent des lxcbrN avec LXC mais j'avais besoin de l'IP externe. Je ne suis pas sûr de ce dont j'ai besoin. Cela n'est pas aidé par le ebtables la documentation semblant définir le mot "port" comme quelque chose d'autre.

Je suis dépassé par les événements. Je ne sens plus le sol et je commence à faire du sur-place. Quelqu'un peut-il me dire avec certitude ce qu'il en est ? I doit rediriger quelques ports entre des interfaces pontées ?

6voto

Doug Smythies Points 12803

Vous pouvez utiliser iptables. Vous trouverez ci-dessous une version script d'une solution proposée. Je ne sais pas quelles règles iptables vous avez déjà, donc un travail de fusion peut être nécessaire.

#!/bin/sh
FWVER=0.02
#
# test-oli rule set 2016.01.14 Ver:0.02
#     Having tested this on my test server using port 80,
#     convert for what Oli actually wants (which I can not test).
#
# test-oli rule set 2016.01.14 Ver:0.01
#     Port forward when this computer has one nic and
#     is not a router / gateway.
#     In this case the destination is a guest VM on this
#     host but, with bridged networking and all IP addresses
#     from the main LAN, that should not be relevant.
#
#     This script may conflict with other iptables rules on the
#     host, I don't know. On my test server, clobbering the existing
#     iptables rules is O.K. because I do not use the virbr0 stuff,
#     nor the default virtual network,  anyhow.
#
#     References:
#     http://askubuntu.com/questions/720207/port-forwarding-between-bridged-interfaces
#     http://ubuntuforums.org/showthread.php?t=1855192
#     http://www.linuxquestions.org/questions/linux-networking-3/iptables-forwarding-with-one-nic-80009/
#
#     run as sudo
#
echo "test-oli rule set version $FWVER..\n"

# The location of the iptables program
#
IPTABLES=/sbin/iptables

# Setting the EXTERNAL and INTERNAL interfaces and addresses for the network
# Use br0 instead of eth0. While using eth0 seems to work fine, the packet counters
# don't work, so debugging information is better and more complete using br0.
#
#
INTIF="br0"
INTIP="10.10.0.2"
FORIP="10.10.0.15"
UNIVERSE="0.0.0.0/0"

echo " Internal Interface: $INTIF  Internal IP: $INTIP  Forward IP $FORIP"

# CRITICAL:  Enable IP forwarding since it is disabled by default
#
echo Enabling forwarding...
echo "1" > /proc/sys/net/ipv4/ip_forward

# Clearing any previous configuration
#
echo " Clearing any existing rules and setting default policy to ACCEPT.."
$IPTABLES -P INPUT ACCEPT
$IPTABLES -F INPUT
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -F OUTPUT
$IPTABLES -P FORWARD ACCEPT
$IPTABLES -F FORWARD
$IPTABLES -t nat -F
# Delete user defined chains
$IPTABLES -X
# Reset all IPTABLES counters
$IPTABLES -Z
# While my references do not have it, I think this is needed.
$IPTABLES -t nat -Z

# First we change the destination of any incoming port 80 traffic
#
$IPTABLES -t nat -A PREROUTING -p tcp -i $INTIF --dport 9000 -j DNAT --to-destination $FORIP:9000
$IPTABLES -t nat -A PREROUTING -p tcp -i $INTIF --dport 9001 -j DNAT --to-destination $FORIP:9001

# And then we do the actual forward
# FORWARD rules would only be needed if the default policy is not ACCEPT
# (Shown here for completeness)
#
$IPTABLES -A FORWARD -p tcp -i $INTIF -d $FORIP --dport 9000 -j ACCEPT
$IPTABLES -A FORWARD -p tcp -i $INTIF -d $FORIP --dport 9001 -j ACCEPT

# Now, we need to change the source address, otherwise the reply packets
# would be sent directly to the client, causing confusion.
$IPTABLES -t nat -A POSTROUTING -o $INTIF -j SNAT --to-source $INTIP

echo "test-oli rule set version $FWVER done."

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X