「VyOS と Tailscale で高速・冗長化された VPN を作る方法」の版間の差分

提供:hkatou_Lab
編集の要約なし
 
(同じ利用者による、間の4版が非表示)
30行目: 30行目:
[[ファイル:Tailscale VyOS 01.png|フレームなし|800x800ピクセル]]
[[ファイル:Tailscale VyOS 01.png|フレームなし|800x800ピクセル]]


West01,02 , East01,02 : VyOS 1.4
=== 試験環境 ===
West01,02 , East01,02 : '''VyOS 1.4'''


West_vSwitch , East_vSwitch : ESXi vSwitch
West_vSwitch , East_vSwitch : '''ESXi vSwitch'''


West_PC01 , East_PC01 : LAN ホスト
West_PC01 , East_PC01 : '''LAN ホスト'''


=== ポイント ===
=== ポイント ===
BGP は Tailscale の 100.64.x.x/32 でピアを張らず、広報する集約ルートから切り出したサブネットを使用し、Loopback (以下 Lo) インターフェースで BGP セッションを張る
BGP は Tailscale の 100.64.x.x/32 でピアを張らず、広報する集約ルートから切り出したサブネットを使用し、Loopback (以下 Lo) インターフェースで BGP セッションを張る


* 100.64.x.x/32 で張ると、広報する内部ネットワークが通信できない場合にも BGP ピアを張り続けてしまう
* tailscale のインターフェースである 100.64.x.x/32 で張ると、広報する内部ネットワークが通信できない場合にも BGP ピアを張り続けてしまう
** 例) Tailscale の 1 アカウント内で同一サブネットを 2 つのノードで advertise-routes したとき、片方のノードで集約ルートが広報できず、通信不可になる
** 例) Tailscale の 1 アカウント内で同一サブネットを 2 つのノードで advertise-routes したとき、片方のノードでルートが広報できず、通信不可になる
** Lo を BGP ピアに使用することで、集約ルートの通信不可を検出し、切り替えることが可能
** Lo を BGP ピアに使用することで、集約ルートの通信不可を検出し、切り替えることが可能
* BGP ピアの宛先 Lo 宛 Static Route を interface Tailscale 0 に向ける + ebgp-multihop 2 を設定
* BGP ピアの宛先 Lo 宛 Static Route を interface Tailscale 0 に向ける + ebgp-multihop 2 を設定
** eBGP のデフォルトは Keepalive の IP ヘッダが TTL=1 のため、/30 サブネットを経由した時点で TTL=0 で Drop してしまい、Lo とピアできない
** eBGP のデフォルトは Keepalive の IP ヘッダが TTL=1 のため、tailscale インターフェースを経由した時点で TTL=0 で Drop してしまい、Lo とピアできない
** multihop の数を多くする場合は、IGP / iBGP の迂回経路経由で切り替わる
Tailscale 上で Lo のルート交換に OSPF を試してみたが、動作しなかった
Tailscale 上で Lo のルート交換に OSPF を試してみたが、動作しなかった


* Tailscale でマルチキャスト or OSPF IP protocol number がフィルタリングされている
* Tailscale で OSPF Hello のマルチキャスト or OSPF IP protocol number がフィルタリングされている
** neighbor 指定でも Up しないため、おそらく protocol number による


== 構築手順 ==
== 構築手順概要 ==
Tailscale のアカウントを作成する
 
=== Tailscale ===
アカウントを作成する


* 冗長化なし : 1 つ
* 冗長化なし : 1 つ
* 冗長化あり : 2 つ
* 冗長化あり : 2 つ
** アカウントが 1 つ + Free プランの場合、Tailscale subnet router は同じプレフィックスを 1 台しか広報できない
** アカウントが 1 つ + Free プランの場合、Tailscale subnet router は同じプレフィックスを 1 台しか広報できない
** アカウントを 2 つ取得し、1 アカウントを 2 ルータを別拠点に配置する


VyOS をハイパーバイザにインストール
=== VyOS ===
ハイパーバイザにデプロイする


* WAN 側ポートグループに DHCP や PPPoE などの Vlan を割り当て、eth4 にアサイン
* WAN 側ポートグループに DHCP や PPPoE などの Vlan を割り当て、eth4 にアサイン
63行目: 68行目:
* VyOS の CD-ROM をマウントして起動、install image で VM の HDD へインストール
* VyOS の CD-ROM をマウントして起動、install image で VM の HDD へインストール


VyOS をインターネットに接続する設定を行う
インターネットに接続する設定を行う


VyOS に Tailscale をインストールする
Tailscale をインストールする


* VyOS 1.4 の場合、ベースとなる Linux<ref>2021-06-25
* VyOS 1.4 の場合、ベースとなる Linux<ref>2021-06-25
74行目: 79行目:
** VyOS 設定後に Tailscale をインストールすると、VyOS が正常に動作しなくなる場合があった
** VyOS 設定後に Tailscale をインストールすると、VyOS が正常に動作しなくなる場合があった


VyOS を再起動
再起動


VyOS で WAN 側ルーティングを設定する
WAN 側ルーティングを設定する


* PPPoE や DHCP などでインターネットに接続し、Tailscale を動作可能にする
* PPPoE や DHCP などでインターネットに接続し、Tailscale を動作可能にする


VyOS で Tailscale を起動する
Tailscale を起動する


VyOS で WAN 側 VPN にルーティングを設定する
WAN 側 にルーティングを設定する


* 冗長化しない場合は、スタティックルーティングで OK
* 冗長化しない場合は、スタティックルーティングで OK
* 冗長化する場合は、BGP でダイナミックルーティングさせる
* 冗長化する場合は、BGP でダイナミック ルーティングさせる
VyOS で LAN 側にルーティングを設定する
LAN 側にルーティングを設定する


* ホストを直接収容する場合 : VRRP で冗長化する
* ホストを直接収容する場合 : VRRP で冗長化する
143行目: 148行目:
</syntaxhighlight>
</syntaxhighlight>


==== Tailscale アカウントに機器を紐づける ====
==== Tailscale を起動、アカウントに機器を紐づける ====
<syntaxhighlight lang="diff">
<syntaxhighlight lang="diff">
vyos@West01# sudo tailscale up --advertise-routes 172.16.0.0/16 --accept-routes=true
vyos@West01# sudo tailscale up --advertise-routes 172.16.0.0/16 --accept-routes=true
149行目: 154行目:
To authenticate, visit:
To authenticate, visit:


         https://login.tailscale.com/x/accdef
         https://login.tailscale.com/x/abcdef


Success.
Success.
</syntaxhighlight>
</syntaxhighlight>
West01 なので、広報するルートに 172.16.0.0/16 を指定し、別機器から広報されたルートを受け入れるオプションを指定する
West01 の広報するルートに 172.16.0.0/16 を指定し、別機器から広報されたルートを受け入れるオプションを指定する


出てきた URL をブラウザに貼り付けて、ログインすれば OK
出てきた URL をブラウザに貼り付けて、ログインすれば OK
あとは別拠点側の East01 側も設定する
=== アカウントの紐づけ ===
* アカウント 1 : West01 , East01
* アカウント 2 : West02 , East02
同一アカウント内のホスト間で、VPN 通信が可能


= Loopback 間 疎通確認 =
= Loopback 間 疎通確認 =


=== 事前疎通不可確認 ===
=== West01 : 事前疎通不可確認 ===
<syntaxhighlight lang="diff">
<syntaxhighlight lang="diff">
vyos@West01# run ping 172.31.255.1
vyos@West01# run ping 172.31.255.1
166行目: 179行目:
</syntaxhighlight>West01 -> East01 の Loopback へ ping を打ちながら設定変更する。
</syntaxhighlight>West01 -> East01 の Loopback へ ping を打ちながら設定変更する。


=== Tailscale にログインして、広報するルートを確定 ===
=== West01 : Tailscale にログインして、広報するルートを確定 ===
対向側で集約ルートを広報させる
対向側で集約ルートを広報させる。


Subnets に "!" がついている場合、広報されていないルートが存在する。
Subnets に "!" がついている場合、広報されていないルートが存在する。


=== 疎通可能を確認 ===
=== West01 : 疎通可能を確認 ===
<syntaxhighlight lang="diff">
<syntaxhighlight lang="diff">
vyos@West01# run show ip route 172.31.255.1
vyos@West01# run show ip route 172.31.255.1
191行目: 204行目:
traceroute to 172.31.255.1 (172.31.255.1), 30 hops max, 60 byte packets
traceroute to 172.31.255.1 (172.31.255.1), 30 hops max, 60 byte packets
  1  172.31.255.1 (172.31.255.1)  11.104 ms  13.310 ms  12.934 ms
  1  172.31.255.1 (172.31.255.1)  11.104 ms  13.310 ms  12.934 ms
</syntaxhighlight>対向側 East01 Loopback 宛ルートが存在せず、デフォルトルートに向いてしまっているが、
</syntaxhighlight>対向側 East01 Loopback 宛ルートが存在せず、デフォルトルートに向いてしまっており、


ping / traceroute は成功してしまう。VyOS 上でルートが見えないのは好ましくない。
VyOS 上でルートが見えないのは好ましくない。


=== 対向拠点 Loopback 宛スタティックルートを設定 ===
=== West01 : 対向拠点 Loopback 宛スタティックルートを設定 ===
<syntaxhighlight lang="diff">
<syntaxhighlight lang="diff">
vyos@West01# set protocols static route 172.31.255.1/32 interface tailscale0
vyos@West01# set protocols static route 172.31.255.1/32 interface tailscale0
216行目: 229行目:
   Last update 00:00:36 ago
   Last update 00:00:36 ago
   * directly connected, tailscale0, weight 1
   * directly connected, tailscale0, weight 1
</syntaxhighlight>VyOS 上でスタティックルートの見え方が実際の動作と一緒になった。
</syntaxhighlight>VyOS 上でスタティックルートが正常に見えるようになった。


=== 疎通確認を実施 ===
=== West01 : 疎通確認を実施 ===
<syntaxhighlight lang="diff">
<syntaxhighlight lang="diff">
vyos@West01# run ping 172.31.255.1
vyos@West01# run ping 172.31.255.1
245行目: 258行目:




ローカル側拠点でもルート広報、対向側拠点でもスタティックルートを設定する。<syntaxhighlight lang="diff">
East01 でもスタティックルートを設定する。<syntaxhighlight lang="diff">
vyos@East01# set protocols static route 172.16.255.1/32 interface tailscale0
vyos@East01# set protocols static route 172.16.255.1/32 interface tailscale0
[edit]
[edit]
277行目: 290行目:
</syntaxhighlight>BGP ピアの前提条件となる、Loopback 間で疎通可能となった。
</syntaxhighlight>BGP ピアの前提条件となる、Loopback 間で疎通可能となった。


= 各プロトコルの設定 =
= 各プロトコルの設定例 =
 
=== West01 : BGP ===
<syntaxhighlight lang="diff">
vyos@West01:~$ show configuration commands | match "bgp|route-map|prefix-list"
set policy prefix-list PL_out rule 10 action 'permit'
set policy prefix-list PL_out rule 10 prefix '172.16.0.0/16'
set policy route-map RMAP_out rule 10 action 'permit'
set policy route-map RMAP_out rule 10 match ip address prefix-list 'PL_out'
set protocols bgp address-family ipv4-unicast aggregate-address 172.16.0.0/16 summary-only
set protocols bgp address-family ipv4-unicast redistribute connected
set protocols bgp local-as '64512'
set protocols bgp neighbor 172.16.255.2 address-family ipv4-unicast nexthop-self
set protocols bgp neighbor 172.16.255.2 address-family ipv4-unicast soft-reconfiguration inbound
set protocols bgp neighbor 172.16.255.2 remote-as '64512'
set protocols bgp neighbor 172.16.255.2 update-source 'lo'
set protocols bgp neighbor 172.31.255.1 address-family ipv4-unicast route-map export 'RMAP_out'
set protocols bgp neighbor 172.31.255.1 address-family ipv4-unicast soft-reconfiguration inbound
set protocols bgp neighbor 172.31.255.1 ebgp-multihop '2'
set protocols bgp neighbor 172.31.255.1 remote-as '65552'
set protocols bgp neighbor 172.31.255.1 update-source 'lo'
set protocols bgp parameters router-id '172.16.255.1'
set protocols bgp timers holdtime '30'
set protocols bgp timers keepalive '10'
</syntaxhighlight>
 
=== East01 の BGP 設定例 ===
<syntaxhighlight lang="diff">
vyos@East01:~$ show configuration commands | match "bgp|route-map|prefix-list"
set policy prefix-list PL_out rule 10 action 'permit'
set policy prefix-list PL_out rule 10 prefix '172.31.0.0/16'
set policy route-map RMAP_out rule 10 action 'permit'
set policy route-map RMAP_out rule 10 match ip address prefix-list 'PL_out'
set protocols bgp address-family ipv4-unicast aggregate-address 172.31.0.0/16 summary-only
set protocols bgp address-family ipv4-unicast redistribute connected
set protocols bgp local-as '65552'
set protocols bgp neighbor 172.16.255.1 address-family ipv4-unicast route-map export 'RMAP_out'
set protocols bgp neighbor 172.16.255.1 address-family ipv4-unicast soft-reconfiguration inbound
set protocols bgp neighbor 172.16.255.1 ebgp-multihop '2'
set protocols bgp neighbor 172.16.255.1 remote-as '64512'
set protocols bgp neighbor 172.16.255.1 update-source 'lo'
set protocols bgp neighbor 172.31.255.2 address-family ipv4-unicast soft-reconfiguration inbound
set protocols bgp neighbor 172.31.255.2 remote-as '65552'
set protocols bgp neighbor 172.31.255.2 update-source 'lo'
set protocols bgp parameters router-id '172.31.255.1'
set protocols bgp timers holdtime '30'
set protocols bgp timers keepalive '10'
</syntaxhighlight>
 
== おまけ : 冗長切替のヒント ==
下位側を connected + VRRP とした場合、HyperVisor 配下で connected の障害を検出することが難しい。
 
VRRP の切り替えは可能だが、BGP の広報を止められないため、下りトラフィックが流れ込んでしまう。
 
* bash script で peer shutdown という手もあるが・・・
 
以下に下位側を L3SW と OSPF でダイナミックルーティングとした場合について記載する。


=== BGP ===
=== 上位 eBGP ピア Down 時 ===
わたり eth2 の OSPF + iBGP で迂回するか、下位 OSPF に対向拠点宛のルート広報をやめて、下位側で迂回させる


BGP で受信するルートを死活監視 + tracking して、Down 時に VRRP の優先度を下げる


== 冗長切替のポイント ==
=== わたりレス構成で下位 OSPF Down 時 ===
BGP ピア Down 時は、わたり eth2 の OSPF + iBGP で迂回するか、下位 IGP に対抗拠点宛のルート広報をやめて、下位側で迂回させる
下位 OSPF Down 時に、BGP で集約ルートの広報をやめるように設計する


わたりレスとする場合は、下位 IGP Down 時に集約ルートの広報をやめる
* BGP で aggregate-address + redistribute ospf する
** OSPF Down で再配布が停止される
* OSPF でサブネットルートが 1 つでもあると BGP で aggregate-address が広報されるため、route-map で Lo を再配布の対象から除外するなどの工夫が必要


== Tailscale の TIPS ==
== Tailscale の TIPS ==
Tailscale の subnet router は、有効化時に VyOS の動作に影響がある
Tailscale の subnet router は、有効化時に VyOS の動作に影響がある


* 2 台のルータで同じプレフィックスを advetise-routes すると、片方は通信できない
* Free プランの 1 アカウント内に 2 台のルータで、同じプレフィックスを advetise-routes すると、片方は通信できない
** subnet router 冗長化は有料プランのため、Free プランだとこの動作となる模様
** subnet router 冗長化は有料プランのため、Free プランだとこの動作となる模様
** LAN 側の OSPF も止まる
** 副作用で LAN 側の OSPF も止まる




299行目: 372行目:


== 引用 ==
== 引用 ==
<references />
[[カテゴリ:VyOS]]
[[カテゴリ:Tailscale]]