Топология сети:
топология
- Публичный IP-адрес хоста (например, 1.1.1.1) со временем меняется
- Хост подключается к Интернету через энп0. Другие интерфейсы также обеспечивают доступ в Интернет, но без общедоступных IP-адресов.
- Хост настраивает virbr0 для частной сети с виртуальными машинами со статическими IP-адресами, назначенными вручную.
- ВМ в частной сети (например, 192.168.122.154) обслуживает службу UDP через порт 4567.
- правила iptables должны обеспечивать доступ к 192.168 .122.154:4567
- Пакеты ДНКАТ из Интернета с таргетингом 1.1.1.1:4567 на VM:4567. Это исходное значение DNAT.
- Пакеты DNAT с хоста, нацеленного на 1.1.1.1:4567, на VM:456, обеспечивающие доступ к услуга с хоста через домен. Например, служба DDNS используется для записи последнего общедоступного IP-адреса хоста с доменом Host. Кто-то, работая на хосте, пытается получить доступ к службе виртуальной машины по сетевому расположению Host:4567, которое разрешается как 1.1.1.1:4567.
- Маршрут пакеты с виртуальной машины с таргетингом 1.1.1.1:4567 на виртуальную машину: 4567. Как и в предыдущем требованию, разрешите доступ к Host:4567 с виртуальных машин.
Код: Выделить всё
iptables -t nat -I PREROUTING \
-i enp0 -p udp --dport 4567 \
-j DNAT --to-destination 192.168.122.154:4567
iptables -t filter -I FORWARD \
-i enp0 -p udp -d 192.168.122.154 --dport 4567 \
-j ACCEPT
Но эта хитрость не применима к оставшимся двум требованиям. и мне придется переключиться на явный IP-адрес и столкнуться с проблемой динамического общедоступного IP-адреса хоста.
Ниже приведены мои текущие правила iptables:
Требование I:
Пакет из Интернета
Код: Выделить всё
iptables -t nat -I PREROUTING \
-d 166.111.83.86 -p udp --dport 8854 \
-j DNAT --to-destination 192.168.122.154:4567
iptables -t filter -I FORWARD \
-d 166.111.83.86 -p udp --dport 8854 \
-j ACCEPT
Пакет с хоста
Код: Выделить всё
iptables -t nat -I OUTPUT \
-p udp -d 166.111.83.86 --dport 4567 \
-j DNAT --to-destination 192.168.122.154:4567
Пакет из виртуальной машины
Код: Выделить всё
iptables -t nat -I POSTROUTING \
-s 192.168.122.154 -d 192.168.122.154 -p udp --dport 8854 \
-j SNAT --to-source 192.168.122.1
Не знаю причину, но с помощью SNAT можно обойти источник 192.168.122.1.
Что я ищу:
Расширение iptables, которое позволяет мне изменить мое правило:
Код: Выделить всё
iptables -t nat -I PREROUTING \
-d 166.111.83.86 -p udp --dport 8854 \
-j DNAT --to-destination 192.168.122.154:4567
Код: Выделить всё
iptables -t nat -I PREROUTING \
-m magic-extension --dst enp0 -p udp --dport 8854 \
-j DNAT --to-destination 192.168.122.154:4567
Итак, я могу изменить свои правила на:
Код: Выделить всё
# req I
iptables -t nat -I PREROUTING \
-m magic-extension --dst enp0 -p udp --dport 8854 \
-j DNAT --to-destination 192.168.122.154:4567
iptables -t filter -I FORWARD \
-m magic-extension --dst enp0 -p udp --dport 8854 \
-j ACCEPT
# req II
iptables -t nat -I OUTPUT \
-m magic-extension --dst enp0 -p udp --dport 4567 \
-j DNAT --to-destination 192.168.122.154:4567
# req III
iptables -t nat -I POSTROUTING \
-m magic-extension --dst enp0 -s 192.168.122.154 -p udp --dport 8854 \
-j SNAT --to-source 192.168.122.1
Я знаю, что это можно сделать с помощью ipset с помощью cron > задание по обновлению набора IP, но ищу более компактное решение.
Подробнее здесь: https://stackoverflow.com/questions/788 ... n-interfac