У меня есть система со статическим IP-адресом, в которой работает несколько контейнеров LXC.
Я могу общаться с контейнерами через интерфейс, как с физической машиной.
Один из таких контейнеров - постфиксный сервер. Я перенаправляю порт 25 от хоста к контейнеру, однако в процессе исходный IP-адрес заменяется интерфейсным, что приводит к сбоям проверки rDNS postfix.
Настроить
Доступ к Интернету через интерфейс eth0
, IP 188.xxx.xxx.xxx
IP-адрес контейнера 192.168.1.12
(br2
) на сайте хостов и 192.168.1.2
(eth0
) на стороне контейнера.
Контейнер получает доступ в Интернет через хост в качестве шлюза по умолчанию и правила iptable.
Существуют и другие контейнеры с аналогичными настройками, контейнеры не общаются друг с другом напрямую, а по правилам iptable для указанных портов.
Выкладываю все правила iptable на случай, если они мешают друг другу
# Generated by iptables-save v1.4.21
*nat
:PREROUTING ACCEPT [760:48985]
:INPUT ACCEPT [707:45761]
:OUTPUT ACCEPT [114:7445]
:POSTROUTING ACCEPT [50:2740]
# Route HTTP & HTTPS to web container
-A PREROUTING -i eth0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.1.1:80
-A PREROUTING -i eth0 -p tcp -m tcp --dport 443 -j DNAT --to-destination 192.168.1.1:443
# Route internal mysql request to mysql container
-A PREROUTING -i br1 -p tcp -m tcp --dport 3306 -j DNAT --to-destination 192.168.1.3:3306
-A PREROUTING -i br2 -p tcp -m tcp --dport 3306 -j DNAT --to-destination 192.168.1.3:3306
# Route mail from outside to mail container
-A PREROUTING -i eth0 -p tcp -m tcp --dport 25 -j DNAT --to-destination 192.168.1.2:25
-A PREROUTING -i eth0 -p tcp -m tcp --dport 143 -j DNAT --to-destination 192.168.1.2:143
-A PREROUTING -i eth0 -p tcp -m tcp --dport 587 -j DNAT --to-destination 192.168.1.2:587
-A PREROUTING -i eth0 -p tcp -m tcp --dport 993 -j DNAT --to-destination 192.168.1.2:993
-A PREROUTING -i eth0 -p tcp -m tcp --dport 4190 -j DNAT --to-destination 192.168.1.2:4190
# Route mail from web container to mail container
-A PREROUTING -i br1 -p tcp -m tcp --dport 25 -j DNAT --to-destination 192.168.1.2:25
-A PREROUTING -i br1 -p tcp -m tcp --dport 143 -j DNAT --to-destination 192.168.1.2:143
-A PREROUTING -i br1 -p tcp -m tcp --dport 587 -j DNAT --to-destination 192.168.1.2:587
-A PREROUTING -i br1 -p tcp -m tcp --dport 993 -j DNAT --to-destination 192.168.1.2:993
-A PREROUTING -i br1 -p tcp -m tcp --dport 4190 -j DNAT --to-destination 192.168.1.2:4190
# Mark packages
-A POSTROUTING -o eth0 -j MASQUERADE
-A POSTROUTING -o br1 -j MASQUERADE
-A POSTROUTING -o br2 -j MASQUERADE
-A POSTROUTING -o br3 -j MASQUERADE
COMMIT
# Completed
# Generated by iptables-save v1.4.21
*filter
:INPUT ACCEPT [35371:3912708]
:FORWARD ACCEPT [48:2620]
:OUTPUT ACCEPT [29159:6870938]
# All containers are allowed to place calls from inside to outside
-A FORWARD -i eth0 -o br1 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth0 -o br2 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth0 -o br3 -m state --state RELATED,ESTABLISHED -j ACCEPT
COMMIT
# Completed
IP-маршрут в случае необходимости
192.168.1.1 * 255.255.255.255 UH 0 0 0 br1
192.168.1.2 * 255.255.255.255 UH 0 0 0 br2
192.168.1.3 * 255.255.255.255 UH 0 0 0 br3
Как мне изменить эти правила, чтобы сохранить исходный IP-адрес или подойти к этому по-другому?
Отбросьте эти правила:
-A POSTROUTING -o br1 -j MASQUERADE
-A POSTROUTING -o br2 -j MASQUERADE
Они выполняют SNAT для всего трафика, идущего в br1
и br2
. Обычно вам нужно иметь только одно правило MASQUERADE на интерфейсе, подключенном к Интернету.
Если каждый контейнер находится на отдельном мосту, я бы поместил контейнеры в разные подсети. Они не должны быть полными / 24 секунды. A / 30 будет достаточно для маршрутизации одного IP-адреса.