それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

OpenWrtでヘアピンNAT(NATループバック)

ヘアピンNAT(ループバック)

OpenWrtでときどき、接続できないポートがあって、不思議だなと思ってたらNATがループバックしてなかった。

設定→ネットワーク

ネットワーク→ファイアウォール→ポートフォワーディングの順にたどって該当のport forwarding についての、詳細(Advance)を見るとチェックボックスがある。このチェックボックスのチェックをするだけでオッケ。(よく忘れる)

f:id:takuya_1st:20211101223129p:plain

ヘアピンNATをiptablesで実現するとしたら

ヘアピンNAT( loopback NAT/ redirect NAT) を実現するとしたら。

PPPoEのデバイスに、DNATとSNATを噛ましてあげれば動く。

iptables -t nat -D PREROUTING -i $LAN_DEV -s $LAN_NETWORK_ADDR/24 -d $PPPOE_IPADDR -p tcp -m tcp --dport 443 -j DNAT --to-destination $TARGET

ルーターの場合SNATはマスカレードで入っていることが多いのでそのままで通る。 マスカレードしていいなら記述は不要。

LANをMASQURADE(NAPT)してないなら、SNATを書いてルーターからのパケットとしてあげる。などで対応が可能。

iptables -t nat -A POSTROUTING -o $LAN_DEV -s $LAN_NET_ADDR/24 -d $TARGET -p tcp -m tcp --dport 443 -j SNAT --to-source $ROUTER_IP

Before

たとえば、wireguard VPN経由( 172.16.4.0/24 ) のパケットがNATループバックをしてない。

root@OpenWrt:/etc/config# iptables -t nat -L  | grep 443
DNAT       tcp  --  192.168.10.0/24       ""ISP v4***  tcp dpt:https /* !fw3: atom-https (reflection) */ to:192.168.10.24:443
DNAT       udp  --  192.168.10.0/24       ""ISP v4***  udp dpt:https /* !fw3: atom-https (reflection) */ to:192.168.10.24:443
DNAT       tcp  --  172.16.4.1           ""ISP v4***  tcp dpt:https /* !fw3: atom-https (reflection) */ to:192.168.10.24:443
DNAT       udp  --  172.16.4.1           ""ISP v4***  udp dpt:https /* !fw3: atom-https (reflection) */ to:192.168.10.24:443
DNAT       tcp  --  anywhere             anywhere             tcp dpt:https /* !fw3: atom-https */ to:192.168.10.24:443
DNAT       udp  --  anywhere             anywhere             udp dpt:https /* !fw3: atom-https */ to:192.168.10.24:443

After

VPN経由( 172.16.4.0/24 )のパケットも443 でループバックするようになった。

root@OpenWrt:~# iptables -t nat -L  | grep 443
DNAT       tcp  --  192.168.10.0/24       ""ISP v4***  tcp dpt:https /* !fw3: atom-https (reflection) */ to:192.168.10.24:443
DNAT       udp  --  192.168.10.0/24       ""ISP v4***  udp dpt:https /* !fw3: atom-https (reflection) */ to:192.168.10.24:443
DNAT       tcp  --  172.16.4.0/24        ""ISP v4***  tcp dpt:https /* !fw3: atom-https (reflection) */ to:192.168.10.24:443
DNAT       udp  --  172.16.4.0/24        ""ISP v4***  udp dpt:https /* !fw3: atom-https (reflection) */ to:192.168.10.24:443
DNAT       tcp  --  172.16.4.1           ""ISP v4***  tcp dpt:https /* !fw3: atom-https (reflection) */ to:192.168.10.24:443
DNAT       udp  --  172.16.4.1           ""ISP v4***  udp dpt:https /* !fw3: atom-https (reflection) */ to:192.168.10.24:443
DNAT       tcp  --  anywhere             anywhere             tcp dpt:https /* !fw3: atom-https */ to:192.168.10.24:443
DNAT       udp  --  anywhere             anywhere             udp dpt:https /* !fw3: atom-https */ to:192.168.10.24:443

ループバックの設定

ループバックの設定は、config でも行える。