Переадресация портов между мостовыми интерфейсами
Итак, у меня есть несколько мостовых интерфейсов, связанных с моим основным устройством Ethernet (em1
Виноват HP). Они обслуживают различные контейнеры LXC, которые я запускаю на своем сервере, и легко позволяют мне получать к ним доступ с других физических устройств в сети.
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
Все они получают свои IP-адреса от основного сетевого DHCP (который назначает статические аренды).
Я хочу переместить сервис, который был запущен на главном хосте (em1
, 10.10.0.2
порты 9000, 9001) к первому контейнеру LXC. Я сделал это и теперь могу получить доступ к вещам через 10.10.0.15:9000-9001
, но все остальное в сети ожидает увидеть его на 10.10.0.2:9000-9001
,
Традиционная переадресация через порт iptables
не похоже на работу. Я пробовал:
-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
И я попробовал br0
вместо em1
но ни одна из них не работает
В граде исследования в 3 часа ночи я обнаружил множество вещей, предлагающих мне ebtables
но я никогда не слышал об этом раньше. Половина проблемы заключается в том, что большинство людей используют lxcbrN
устройства с LXC но мне нужен был внешний IP. Я не уверен, что мне нужно. Это не помогло ebtables
документация, по- видимому определяющая слово "порт" как нечто иное.
Я вне моей глубины. Я больше не чувствую пол, и я начинаю ходить по воде. Может кто-нибудь кинуть мне строку и сказать наверняка, что мне нужно для перенаправления пары портов между мостовыми интерфейсами?
1 ответ
Вы можете использовать iptables. Ниже приведена версия сценария предлагаемого решения. Я не знаю, какие правила iptables у вас уже есть, поэтому может потребоваться некоторая работа по слиянию.
#!/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://Ask-ubuntu.ru/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."