ЛОР, побудь моим личным LARTC[2].
Вообще всё перерыл, даже на serverfault спросил, бестолку.
Есть линуксовый роутер (4.14), интерфейсы wan0
и lan0
, адреса 1.2.3.4
и 10.0.0.1
соответственно.
# ip -4 addr
11: lan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 34:ce:00:66:f0:56 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.1/24 brd 10.0.0.255 scope global lan0
valid_lft forever preferred_lft forever
13: wan0@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc cake state UP group default qlen 1000
link/ether 78:11:dc:01:32:70 brd ff:ff:ff:ff:ff:ff
inet 1.2.3.4/24 brd 1.2.3.255 scope global wan0
valid_lft forever preferred_lft forever
Внутри сети есть машина 10.0.0.2
с веб-сервером, который слушает на 10.0.0.2:443
. Есть доменное имя domain.tld
, которое ресолвится в 1.2.3.4
. На роутере настроен DNAT (порт форвардинг) 1.2.3.4:443
в 10.0.0.2:443
:
# iptables -t nat -S | egrep 'wan0|lan0|443'
-A PREROUTING -i wan0 -j zone_wan_prerouting
-A POSTROUTING -o lan0 -j zone_lan_postrouting
-A zone_lan_postrouting -s 10.0.0.0/24 -d 10.0.0.2/32 -p tcp -m tcp --dport 443 -j SNAT --to-source 10.0.0.1
-A zone_lan_prerouting -s 10.0.0.0/24 -d 1.2.3.4/32 -p tcp -m tcp --dport 443 -j DNAT --to-destination 10.0.0.2:443
-A zone_wan_prerouting -p tcp -m tcp --dport 443 -j DNAT --to-destination 10.0.0.2:443
Проблема: если с роутера сделать curl https://domain.tld
, то DNAT его не поймает.
Попробовал написать правило в OUTPUT, но это не сработало:
iptables -t nat -A OUTPUT -p tcp -d 1.2.3.4 --dport 443 -j DNAT --to-destination 10.0.0.2:443
Судя по tcpdump, DNAT срабатывает, но пакет (с подменённым адресом назначения) продолжает уходить с внешнего интерфейса.
Куда копать?
P. S.: без использования split DNS и прочих хаков (настоящий сетап гораздо более сложный, вкорячивать туда ещё и split DNS я хочу в последнюю очередь)