J'ai donc un tas d'interfaces de pont liées à mon périphérique Ethernet principal (em1
, blâmer HP). Ceux-ci desservent divers conteneurs LXC que j'utilise sur mon serveur et me permettent facilement d'y accéder à partir d'autres périphériques physiques du 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
Ceux-ci obtiennent tous leurs adresses IP du réseau principal DHCP (qui attribue des baux statiques).
Je souhaite déplacer un service exécuté sur l'hôte principal (em1
, 10.10.0.2
, ports 9000, 9001) vers le premier conteneur LXC. C'est ce que j'ai fait et je peux maintenant accéder à des éléments via 10.10.0.15:9000-9001
, mais tout le reste du réseau s'attend à le voir sur 10.10.0.2:9000-9001
.
La redirection de port traditionnelle via 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 ni l'un ni l'autre ne fonctionnent.
Dans une pluie de recherches de 3 heures du matin, j'ai trouvé une foule de choses suggérant que j'avais besoin de ebtables
, mais je n'avais même jamais entendu parler de cela auparavant. La moitié du problème semble être que la plupart des gens utilisent des périphériques lxcbrN
avec LXC mais j'avais besoin de l'IP externe. Je ne suis pas sûr de ce dont j'ai besoin. La ebtables
documentation semble définir le mot "port" comme quelque chose d'autre.
Je suis hors de ma profondeur. Je ne sens plus le sol et je commence à marcher sur l'eau. Quelqu'un peut-il me jeter une ligne et dire avec certitude ce dont I doit rediriger quelques ports entre des interfaces pontées?
Vous pouvez utiliser iptables. Vous trouverez ci-dessous une version de script d'une solution proposée. Je ne sais pas quelles règles iptables vous avez peut-être déjà, alors un travail de fusion pourrait ê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."