Quick Start: VyOS を5分で起動する
Proxmox VEで12台のVMとコンテナを管理するhomelabを運用しています。ここはproductionに投入する前にあらゆることをテストするための遊び場です。multi-VLAN・静的/動的ルーティング・IPsecトンネルなど複雑なネットワーク環境をシミュレートする必要が生じた際、VyOSを試してみることにしました。それ以来ずっと使い続けています。構文がJuniper JunOSスタイルで、これまで触れたどの仮想ルーターよりも実機に近い感覚です。
VyOSはVyattaのフォークで、無料・機能制限なし、rolling releaseとLTSの両方が提供されています。公式サイトからrolling ISO(lab環境にはこちらを推奨)をダウンロードし、最小スペックでVMを作成します:
- CPU: 1〜2 vCPU
- RAM: 512MB(VPNトンネルを多数使用する場合は1GB)
- Disk: 4GB
- Network: 最低2枚のvNIC——WAN(外部接続用)1枚とLAN(内部ネットワーク用)1枚
virt-installでKVM上にVMを作成する
virt-install \
--name vyos-lab \
--ram 1024 \
--vcpus 2 \
--disk path=/var/lib/libvirt/images/vyos-lab.qcow2,size=4 \
--cdrom /tmp/vyos-rolling.iso \
--network bridge=br0 \
--network bridge=br1 \
--os-variant debian11 \
--noautoconsole
ProxmoxではGUIで行います:VMを作成し、2つのNetwork Deviceを異なるbridgeに割り当てます(例:vmbr0をWAN、vmbr1をLAN)。
初期インストールとネットワーク設定
ISOから起動し、vyos/vyosでログインして、インストールコマンドを実行します:
install image
ウィザードに従ってrebootします。起動後、configure modeに入りinterfaceを設定します:
configure
set interfaces ethernet eth0 address dhcp
set interfaces ethernet eth0 description 'WAN'
set interfaces ethernet eth1 address 192.168.10.1/24
set interfaces ethernet eth1 description 'LAN'
set system name-server 8.8.8.8
set system name-server 8.8.4.4
commit
save
VyOSの鉄則:commitはconfigをrunning stateに適用し、saveはstartup configに書き込みます。saveを忘れてrebootするとconfigが全消去——これは痛い経験から学んだことです。
ゾーンベースFirewall:チェーンではなくフローで考える
VyOSはiptablesのようなINPUT/OUTPUT/FORWARDモデルを使いません。代わりに、各interfaceはzoneに属し、2つのzone間のトラフィックは明示的に割り当てられたrulesetを通過します。labに多数のネットワークセグメントがある場合、このアプローチはずっとすっきりしています。
WAN、LAN、LOCAL(VyOSルーター本体)の3つのzoneを使用します。
configure
# === Ruleset: WAN -> LOCAL(SSHとreturn trafficのみ許可)===
set firewall name WAN-to-LOCAL default-action drop
set firewall name WAN-to-LOCAL rule 10 action accept
set firewall name WAN-to-LOCAL rule 10 state established enable
set firewall name WAN-to-LOCAL rule 10 state related enable
set firewall name WAN-to-LOCAL rule 20 action accept
set firewall name WAN-to-LOCAL rule 20 protocol tcp
set firewall name WAN-to-LOCAL rule 20 destination port 22
# === Ruleset: WAN -> LAN(return trafficのみ、新規接続はブロック)===
set firewall name WAN-to-LAN default-action drop
set firewall name WAN-to-LAN rule 10 action accept
set firewall name WAN-to-LAN rule 10 state established enable
set firewall name WAN-to-LAN rule 10 state related enable
# === Ruleset: LAN -> WAN(LANからの外部通信をすべて許可)===
set firewall name LAN-to-WAN default-action accept
# === Ruleset: LAN -> LOCAL(LANからrouterへのSSH)===
set firewall name LAN-to-LOCAL default-action drop
set firewall name LAN-to-LOCAL rule 10 action accept
set firewall name LAN-to-LOCAL rule 10 state established enable
set firewall name LAN-to-LOCAL rule 10 state related enable
set firewall name LAN-to-LOCAL rule 20 action accept
set firewall name LAN-to-LOCAL rule 20 protocol tcp
set firewall name LAN-to-LOCAL rule 20 destination port 22
# === interfaceをzoneに割り当て ===
set zone-policy zone WAN interface eth0
set zone-policy zone LAN interface eth1
set zone-policy zone LOCAL local-zone
# === zone間にrulesetを適用 ===
set zone-policy zone LOCAL from WAN firewall name WAN-to-LOCAL
set zone-policy zone LOCAL from LAN firewall name LAN-to-LOCAL
set zone-policy zone LAN from WAN firewall name WAN-to-LAN
set zone-policy zone WAN from LAN firewall name LAN-to-WAN
commit
save
NAT:MasqueradeとPort Forwarding
Firewallを設定しても、LAN内のマシンはまだインターネットに出られません——NATが足りないためです。VyOSではこれをmasquerade translationによるSource NATと呼びます。
configure
# Masquerade: LAN 192.168.10.0/24全体をWAN IPの背後に隠す
set nat source rule 100 outbound-interface eth0
set nat source rule 100 source address 192.168.10.0/24
set nat source rule 100 translation address masquerade
commit
save
Port Forwarding(Destination NAT)——LANのwebサーバーを外部に公開する:
configure
# DNAT: port 80 WAN -> 192.168.10.100:80
set nat destination rule 10 inbound-interface eth0
set nat destination rule 10 protocol tcp
set nat destination rule 10 destination port 80
set nat destination rule 10 translation address 192.168.10.100
set nat destination rule 10 translation port 80
commit
save
IPsec IKEv2によるVPN Site-to-Site
この章こそ、labでpfSenseに戻らない主な理由です。IPsec IKEv2トンネルで接続する2サイト構成をシミュレートします——これはCisco ASAやJuniper SRXで実際に見るconfigロジックと同じです。
トポロジー:
- VyOS-A: WAN
10.0.0.1, LAN192.168.10.0/24 - VyOS-B: WAN
10.0.0.2, LAN192.168.20.0/24
VyOS-Aの設定
configure
# IKEグループ(フェーズ1)
set vpn ipsec ike-group IKE-DEFAULT key-exchange ikev2
set vpn ipsec ike-group IKE-DEFAULT lifetime 28800
set vpn ipsec ike-group IKE-DEFAULT proposal 1 dh-group 14
set vpn ipsec ike-group IKE-DEFAULT proposal 1 encryption aes256
set vpn ipsec ike-group IKE-DEFAULT proposal 1 hash sha256
# ESPグループ(フェーズ2)
set vpn ipsec esp-group ESP-DEFAULT lifetime 3600
set vpn ipsec esp-group ESP-DEFAULT mode tunnel
set vpn ipsec esp-group ESP-DEFAULT proposal 1 encryption aes256
set vpn ipsec esp-group ESP-DEFAULT proposal 1 hash sha256
# IPsecをリッスンするinterface
set vpn ipsec ipsec-interfaces interface eth0
# PeerとTunnel
set vpn ipsec site-to-site peer 10.0.0.2 authentication mode pre-shared-secret
set vpn ipsec site-to-site peer 10.0.0.2 authentication pre-shared-secret 'Lab@Secret#2024'
set vpn ipsec site-to-site peer 10.0.0.2 ike-group IKE-DEFAULT
set vpn ipsec site-to-site peer 10.0.0.2 default-esp-group ESP-DEFAULT
set vpn ipsec site-to-site peer 10.0.0.2 local-address 10.0.0.1
set vpn ipsec site-to-site peer 10.0.0.2 tunnel 1 local prefix 192.168.10.0/24
set vpn ipsec site-to-site peer 10.0.0.2 tunnel 1 remote prefix 192.168.20.0/24
commit
save
VyOS-Bの設定(ミラー構成)
configure
set vpn ipsec ike-group IKE-DEFAULT key-exchange ikev2
set vpn ipsec ike-group IKE-DEFAULT lifetime 28800
set vpn ipsec ike-group IKE-DEFAULT proposal 1 dh-group 14
set vpn ipsec ike-group IKE-DEFAULT proposal 1 encryption aes256
set vpn ipsec ike-group IKE-DEFAULT proposal 1 hash sha256
set vpn ipsec esp-group ESP-DEFAULT lifetime 3600
set vpn ipsec esp-group ESP-DEFAULT mode tunnel
set vpn ipsec esp-group ESP-DEFAULT proposal 1 encryption aes256
set vpn ipsec esp-group ESP-DEFAULT proposal 1 hash sha256
set vpn ipsec ipsec-interfaces interface eth0
set vpn ipsec site-to-site peer 10.0.0.1 authentication mode pre-shared-secret
set vpn ipsec site-to-site peer 10.0.0.1 authentication pre-shared-secret 'Lab@Secret#2024'
set vpn ipsec site-to-site peer 10.0.0.1 ike-group IKE-DEFAULT
set vpn ipsec site-to-site peer 10.0.0.1 default-esp-group ESP-DEFAULT
set vpn ipsec site-to-site peer 10.0.0.1 local-address 10.0.0.2
set vpn ipsec site-to-site peer 10.0.0.1 tunnel 1 local prefix 192.168.20.0/24
set vpn ipsec site-to-site peer 10.0.0.1 tunnel 1 remote prefix 192.168.10.0/24
commit
save
トンネルの確認
# SA(Security Association)の状態を確認
show vpn ipsec sa
# VyOS-AからBサイトのLANへトンネル経由でPing
ping 192.168.20.1 source-address 192.168.10.1 count 5
出力にESTABLISHEDとbytes/packetsのカウントが表示されていればトンネルはupしています。CONNECTINGのままいつまでも変わらない場合は、ほぼ確実にFirewallがUDP 500またはESP(プロトコル50)をブロックしています——まずそちらを確認してください。
VyOS運用の実践Tips
変更前には必ずconfigをバックアップ
# タイムスタンプ付きバックアップを保存
save /config/backup-$(date +%Y%m%d-%H%M).conf
# 外部にコピー
scp [email protected]:/config/backup-20240620-1430.conf ./
誤ったcommitをrollbackする
VyOSはcommit履歴を保存しているので、rollbackはとても簡単です:
# commitの一覧を表示
show system commit
# 1つ前のcommitにrollback(インデックス1)
rollback 1
commit
save
FirewallとTrafficのデバッグ
# 各ルールのhitカウンターを表示
show firewall name WAN-to-LAN statistics
# リアルタイムでトラフィックを監視
monitor traffic interface eth0
# Firewallログを表示(loggingが有効な場合)
show log firewall name WAN-to-LAN
ルーターからロックアウトされた経験から学んだこと:firewallルールをテストする際は、別のSSHセッションでmonitor trafficを起動しておきましょう。パケットが通過するか即座にdropされるかが目で確認でき、推測する必要がありません。
VyOSはBGP・OSPF・IPsec multi-tunnelが必要なlab環境に最適です——pfSenseにもこれらはありますが、構文が実機とかけ離れています。小規模ネットワークで単純なNATだけが必要なら、pfSense/OPNsenseの方がずっとユーザーフレンドリーです。しかし目標がCLI network engineeringのmuscle memoryを鍛えることなら、Proxmox/KVM上の仮想ルーターでVyOS以上の練習環境はありません。

