転載・引用について

ユーザ用ツール

サイト用ツール


サイドバー

Site Contents Index

転載・引用について

RSS

tweet:2020:0327_01

FreeBSDでMultiFIBとNATでpolicy route

とあるところでgre tunnelを使ってsource addressベースの経路制御をしなければならなくなった。

pfでroute-toを使う手もあるにはあったが、制御しくった時にかなり痛い思いをすることがわかっているので、物は試して。

これに関しては、最終的に1本の記事にするつもりなので、ここには簡単なメモ書きだけ。

構成

                     +---ProxyB---+
Dest ---(Internet)---+------------+---(ISP)---Router---Source
                     +---ProxyC---+
  • Router - ProxyB間はGRE Tunnel(gre0)で接続
  • Router - ProxyC間はGRE Tunnel(gre1)で接続
  • Sourceには、IP Addressが3つ付いている
    • Src(A)は直接Destに接続する際に利用する
    • Src(B)はProxyB経由でDestに接続する際に利用する
      • Routerを出ていく時に、source addressをgre0のlocal側のaddressにNATする
    • Src(C)はProxyC経由でDestに接続する際に利用する
      • Routerを出ていく時に、source addressをgre1のlocal側のaddressにNATする
    • Src(A),Src(B),Src(C)は、同一Segmentに属しているとする
      • そうしないと、Routerでstatic routeを切らなければならない

Sourceの設定

  • rc.confの設定
    • ifconfig_xn0="inet Src(A)/24"
      ifconfig_xn0_alias0="inet Src(B)/24"
      ifconfig_xn0_alias1="inet Src(C)/24"

Roouterの設定

  • loader.confの設定
    • if_gre_load="YES"
      net.fibs=4
  • rc.confの設定
    • cloned_interfaces="gre0 gre1"
      ifconfig_xn0="inet Addr(Global)/masklen"
      ifconfig_xn1="inet Src(Router)/masklen"
      ifconfig_gre0="inet tun(Router) tun(ProxyB) netmask 255.255.255.252 tunnel Addr(Global) Addr(ProxyB) mtu 1436 fib 1"
      ifconfig_gre1="inet tun(Router) tun(ProxyC) netmask 255.255.255.252 tunnel Addr(Global) Addr(ProxyC) mtu 1436 fib 1"
      
      route_0="-fib 0 default Addr(ISP)"
      route_1="-fib 1 default tun(ProxyB)"
      route_2="-fib 2 default tun(ProxyC)"
      static_routes="0 1 2"
  • pf.confの設定
    • 全部書くと細かすぎるので、必要部分のみ記載する
    • ...(snip)...
      nat pass on xn0  from Src(A) to any -> (xn0)
      nat pass on gre0 from Src(B) to any -> tun(ProxyB)
      nat pass on gre0 from Src(C) to any -> tun(ProxyC)
      ...(snip)...
      pass in from any    to any rtable 0
      pass in from Src(B) to any rtable 1
      pass in from Src(C) to any rtable 2

Test

Sourceにloginして、

  • ping -S Src(A) Address(Dest)
  • traceroute -n -w 2 -s Src(A) Address(Dest)
  • ping -S Src(B) Address(Dest)
  • traceroute -n -w 2 -s Src(B) Address(Dest)
  • ping -S Src(C) Address(Dest)
  • traceroute -n -w 2 -s Src© Address(Dest)

で確認できるはず。

注意点

  • pass in from any to any rtable 0 を記載する場所に気をつけること
    • pfは、何も設定しなければ、defaultで rtable 0 を利用するので、なくても良い。
    • 複雑な設定をする場合、この部分だけは、Genericな部分から記載し、Specificなものほど後ろに書くこと
  • GRE tunnelを張る際に、ifconfigで必ずFIBを指定すること
    • 指定しない場合、FIB 0のみにgreのlocal側Addressが載る。つまり、他のFIBを使わなくなる。
      • ここでどハマりぶっこいて、相当悩んだ。
tweet/2020/0327_01.txt · 最終更新: 2020/03/27 19:24 by seirios