Переадресация портов между мостовыми интерфейсами

Итак, у меня есть несколько мостовых интерфейсов, связанных с моим основным устройством 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."
Другие вопросы по тегам