NATのみ–いいえ。IPパケットには、「ソース」フィールドが1つしかありません。
(これは、実際にはLANから同じLANにポート転送しようとするのと同じ問題であり、2番目の方法は「NATヘアピニング」または「NATリフレクション」と呼ばれます。)
これを機能させるには、xxxxとyyyyの間にトンネル/ VPNが必要です– yyyyに送信される別の IPパケット内に、元のパケットを変更せずにラップします(トンネル化されたパケットをアンラップし、元のソースを表示します) 。
もちろん、これは、トンネルを設定するために両方のシステムでルート権限が必要であることを意味します。さらに、宛先(yyyy)は「ポリシールーティング」をサポートする必要があります。LinuxおよびFreeBSD pfはこれに対応しています。送信元アドレスがVPNアドレスである場合、VPNを介してすべてをルーティングするルールが必要です。
それでもiptables DNATルールが必要ですが、その「宛先」はパブリックアドレスではなくyのVPNアドレスになります。これには、基本的な「IP-in-IP」からGRE、OpenVPN、WireGuardまで、任意のトンネル/ VPNタイプを使用できます。例えば:
xxxx
トンネルを立ち上げます。
ip link add gre-y type gre local x.x.x.x remote y.y.y.y ttl 64
ip link set gre-y up
ip addr add 192.168.47.1/24 dev gre-y
LANと同様に、ポート転送ルールを追加します。
iptables -t nat -I PREROUTING -p tcp --dport 1234 -j DNAT --to-destination 192.168.47.2
yyyy
トンネルを立ち上げます。
ip link add gre-x type gre local y.y.y.y remote x.x.x.x ttl 64
ip link set gre-x up
ip addr add 192.168.47.2/24 dev gre-x
動作することを確認してください:
ping 192.168.47.1
返信(および返信のみ)がトンネルを通過するように、ポリシールーティングを設定します。
ip route add default via 192.168.47.1 dev gre-x table 1111
ip rule add pref 1000 from 192.168.47.2 lookup 1111
(別のトンネル/ VPNタイプを使用するには、「トンネルの起動」部分のみを交換します。)