「VyOS と Tailscale で高速・冗長化された VPN を作る方法」の版間の差分
提供:hkatou_Lab
編集の要約なし |
細 Hkatou がページ「VyOS と TailScale で高速・冗長化された VPN を作る方法」を「VyOS と Tailscale で高速・冗長化された VPN を作る方法」に移動しました |
||
(同じ利用者による、間の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 | ** eBGP のデフォルトは Keepalive の IP ヘッダが TTL=1 のため、tailscale インターフェースを経由した時点で TTL=0 で Drop してしまい、Lo とピアできない | ||
Tailscale 上で Lo のルート交換に OSPF を試してみたが、動作しなかった | Tailscale 上で Lo のルート交換に OSPF を試してみたが、動作しなかった | ||
* Tailscale | * 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 へインストール | ||
インターネットに接続する設定を行う | |||
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 が正常に動作しなくなる場合があった | ||
再起動 | |||
WAN 側ルーティングを設定する | |||
* PPPoE や DHCP などでインターネットに接続し、Tailscale を動作可能にする | * PPPoE や DHCP などでインターネットに接続し、Tailscale を動作可能にする | ||
Tailscale を起動する | |||
WAN 側 にルーティングを設定する | |||
* 冗長化しない場合は、スタティックルーティングで OK | * 冗長化しない場合は、スタティックルーティングで OK | ||
* 冗長化する場合は、BGP | * 冗長化する場合は、BGP でダイナミック ルーティングさせる | ||
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/ | https://login.tailscale.com/x/abcdef | ||
Success. | Success. | ||
</syntaxhighlight> | </syntaxhighlight> | ||
West01 | 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 宛ルートが存在せず、デフォルトルートに向いてしまっており、 | ||
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行目: | ||
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 でダイナミックルーティングとした場合について記載する。 | |||
=== | === 上位 eBGP ピア Down 時 === | ||
わたり eth2 の OSPF + iBGP で迂回するか、下位 OSPF に対向拠点宛のルート広報をやめて、下位側で迂回させる | |||
BGP で受信するルートを死活監視 + tracking して、Down 時に VRRP の優先度を下げる | |||
== | === わたりレス構成で下位 OSPF Down 時 === | ||
下位 OSPF Down 時に、BGP で集約ルートの広報をやめるように設計する | |||
* 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 | * Free プランの 1 アカウント内に 2 台のルータで、同じプレフィックスを advetise-routes すると、片方は通信できない | ||
** subnet router 冗長化は有料プランのため、Free プランだとこの動作となる模様 | ** subnet router 冗長化は有料プランのため、Free プランだとこの動作となる模様 | ||
** LAN 側の OSPF も止まる | ** 副作用で LAN 側の OSPF も止まる | ||
299行目: | 372行目: | ||
== 引用 == | == 引用 == | ||
<references /> | |||
[[カテゴリ:VyOS]] | |||
[[カテゴリ:Tailscale]] |