Я хотел бы автоматически обрабатывать пакеты в цепочке OUTPUT таблицы NAT (которые генерируются локально), как если бы они приходили извне (через PREROUTING).
Можно ли использовать правило «переадресовать все в PREROUTING» как резервное / последнее правило в цепочке OUTPUT?
Например, при следующей NAT-переадресации:
iptables -t nat -A PREROUTING -p TCP -d $EXT.IP.ADD.RESS \
--dport 80 -j DNAT --to-destination $INT.IP.ADD.RESS:80
Мне нужно настроить соответствующее правило ВЫХОДА:
iptables -t nat -A OUTPUT -p TCP -d $EXT.IP.ADD.RESS \
--dport 80 -j DNAT --to-destination $INT.IP.ADD.RESS:80
При регистрации этих пакетов (через iptables -t nat -A OUTPUT -p TCP -d $EXT.IP.ADD.RESS -j LOG
), они похожи:
IN= OUT=lo SRC=$EXT.IP.ADD.RESS DST=$EXT.IP.ADD.RESS LEN=60 \
TOS=0x00 PREC=0x00 TTL=64 ID=22348 DF PROTO=TCP SPT=59425 \
DPT=25 WINDOW=32792 RES=0x00 SYN URGP=0
Я пробовал что-то вроде следующего, но это не сработало:
iptables -t nat -A OUTPUT -p TCP -d $EXT.IP.ADD.RESS -j DNAT \
--to $EXT.IP.ADD.RESS
Сейчас я использую следующий макрос / блок для каждого сопоставления порта с внутренней машиной:
iptables -t nat -A PREROUTING -p TCP -d $EXT.IP.ADD.RESS --dport 25 \
-j DNAT --to-destination 10.122.1.25:25
iptables -t nat -A OUTPUT -p TCP -d $EXT.IP.ADD.RESS --dport 25 \
-j DNAT --to-destination 10.122.1.25:25
iptables -t nat -A POSTROUTING -p TCP -s 10.122.1.25 -d 10.122.1.25 --dport 25 \
-j SNAT --to 10.122.1.1
10.122.1.1 - это межсетевой экран, а 10.122.1.25 - контейнер (почтовый сервер).
Недавно я добавил только последнее правило («POSTROUTING»), которое позволяет контейнеру достигать самого себя.
Да, это называется NAT Loopback
и это требует, чтобы вы SNAT ваши локально сгенерированные пакеты на ваш внешний IP. Это заставит ваши пакеты возвращаться и проходить через цепочку PREROUTING.
Чего вы собираетесь достичь с помощью повторного ввода локально сгенерированных пакетов (не пересылки) в PREROUTING? Если вам не нравится существующая там избыточность, вы можете создать новую определяемую пользователем цепочку, поместить в нее правило и вызвать эту цепочку из PREROUTING и OUTPUT.