VyOSでNATする時に同一セグメント内へのDNATではまった件


はじめに

  • VyOSでNAT設定やろうとした時にはまった点のメモ

環境構成

  • 環境概要は以下の通り

VyOSのNIC設定

NIC IPアドレス
eth0 10.10.10.1
eth1 192.168.179.1
eth2 128.7.56.1

検証環境のマシン

名称 IPアドレス デフォルトGW
マシン① 10.10.10.100 10.10.10.1
マシン② 192.168.179.100 192.168.179.1

構成図

やりたいこと

  • 「128.7.56.1:80」にアクセスした時、「10.10.10.100:80」に転送されるようにしたい

DNAT設定

  • VyOS側にて以下設定を実施
    • rule1はeth0で受付したリクエストの転送
    • rule2はeth1で受付したリクエストの転送
set nat destination rule 1 destination address 128.7.56.1
set nat destination rule 1 destination port 80
set nat destination rule 1 inbound-interface eth0
set nat destination rule 1 protocol tcp
set nat destination rule 1 translation address 10.10.10.100
set nat destination rule 1 translation port 80

set nat destination rule 2 destination address 128.7.56.1
set nat destination rule 2 destination port 80
set nat destination rule 2 inbound-interface eth1
set nat destination rule 2 protocol tcp
set nat destination rule 2 translation address 10.10.10.100
set nat destination rule 2 translation port 80

DNAT設定後の疎通結果

  • マシン①から「128.7.56.1:80」にアクセスしても、「10.10.10.100:80」には転送されずエラーとなる
  • マシン②からの疎通は問題なし
マシン名 疎通結果
マシン①
マシン② ×

マシン①の疎通結果がNGだった理由

  • SNAT変換がされていないため、マシン①への戻りパケットのsource IPアドレスが「10.10.10.100」のままになっている
  • source IPアドレスが「10.10.10.100」のため、マシン①はdestination IPアドレスに「10.10.10.100」を設定して自分自身に対し通信を行なおうとするが、最初のSYNパケットのdestination IPアドレスは「128.7.56.1」であるため齟齬が発生しTCPコネクションを確立できずエラーとなる

解決方法

  • SNAT設定を入れて、送信元が同一セグメント内からの場合も別セグメントからアクセスが来たように見せかける
  • VyOSを経由してくれればNAT変換後のIPアドレスでいい感じに通信してくれる
  • translation addressは10.10.10.0とは別セグメントで使えるやつなら多分なんでもいいはず
  • outbound-interfaceはsource addressのデフォルトGWとなっているNICを指定する
set nat source rule 1000 source address '10.10.10.0/24'
set nat source rule 1000 translation address 128.7.56.1
set nat source rule 1000 outbound-interface eth0

まとめ

  • DNAT設定時、同一セグメント(同一アドレス含む)からもアクセスがある場合はSNAT設定も忘れずにやる