buhikechi

自宅サーバーを Proxmox で作り直す

Cisco ルーターとスイッチで VLAN を切り、Web・写真保存・監視の VM を立てた記録。 · 2026/06

自宅サーバーを Proxmox で作り直す

概要

これまで1台の Linux サーバーでマイクラ鯖やWebサイトを動かしていましたが、一度解体して作り直すことにしました。 動機は、ciscoの機器を実際に触ってみたかった。VLANを切ってみたかったというものです。 新しい構成では、仮想化基盤の Proxmox VE を入れ、用途ごとにVMを分けています。ネットワークも中古の Cisco ルーターとスイッチで VLAN を切り、管理・Web・immich を別々のセグメントに置きました。

購入したもの

Cisco 891fj

Cisco 891FJ(ルーター)

Cisco Catalyst 2960

Cisco Catalyst 2960(スイッチ)

コンソールケーブル

付属品なしと書いてあったのにも関わらず、電源ケーブルが付いてきた。そのため、amazonで購入した電源ケーブルが1本余ってしまう事態に。 あと数字がついたテープが貼ってた。数字の書き方が海外のもので、テンション上がった。

構成

論理構成の図

VLAN は 3 つに分けました。

物理構成の図

ONU が別の部屋にあって距離があるためそこは妥協して中継機で部屋まで Wi-Fi を引いています。

内側のアドレスは 172.16.{VLAN番号}.0/24 とし、各 VLAN のゲートウェイをルーターの .1 にしています。

Cisco ルーターの設定

Cisco 機器を CLI で触るのは初めてでした。

起動でつまずく

コンソールケーブルを繋いで、電源を入れても何も表示されませんでした。コンソールケーブルは電源を入れる前に挿しておく必要があり、起動後に挿しても何も出てきません。気をつけましょう。

基本設定と SSH

enable で特権モード、conf t でグローバルコンフィグレーションモードに入り、ホスト名やパスワード、ユーザーアカウントを設定します。パスワードは username … algorithm-type scrypt secret … の形で暗号化して保存し、service password-encryption で全体の暗号化も有効にしました。

続いて SSH でログインできるようにします。

ip domain-name <ドメイン名>
crypto key generate rsa
line vty 0 1
 login local
 transport input ssh

ポートや回線の設定モードにコマンドで移り、その対象にコマンドで設定を足していくという Cisco の操作のイメージがなんとなくつかめてきました。

WAN 側と NAT

WAN 側のポートにアドレスを振ろうとしたところ、このルーターのポートは L2(スイッチポート)として動いていて、そのままではアドレスを持てませんでした。L3 にする no switchport もこの機種では使えなかったため、VLAN を作って SVI(VLAN インターフェース)にアドレスを持たせる方法を取りました。

vlan 99
 name WAN_OUTSIDE

interface GigabitEthernet0
 switchport mode access
 switchport access vlan 99
 no shutdown

interface Vlan99
 ip address <親ルーターから見た固定アドレス> 255.255.255.0
 ip nat outside

ip route 0.0.0.0 0.0.0.0 <親ルーターのアドレス>

Cisco ルーターはインターフェースが初期状態で無効になっているので、no shutdown を忘れないようにします。

内側は VLAN 10・20・30 を作り、それぞれの SVI に 172.16.xx.1 を割り当てて ip nat inside を設定。スイッチにつながるポートはトランクにして、3 つの VLAN を通します。

interface GigabitEthernet1
 switchport mode trunk
 switchport trunk allowed vlan 10,20,30

access-list 1 permit 172.16.0.0 0.0.255.255
ip nat inside source list 1 interface Vlan99 overload

最後の行は「ACL 1 に当てはまる送信元を、Vlan99 のアドレスに変換する。overload で複数の端末が 1 つのアドレスを共有できる」という意味らしいです。

物理ポートにはアドレスを持たせず、VLAN インターフェースにアドレスを持たせることで、1 本のケーブルで複数の VLAN を扱えるのだと理解できました。

VLAN 間の通信を絞る

VLAN を分けても、ルーターは初期状態では VLAN 同士の通信をすべて通してしまいます。これでは、たとえば外に公開している Web サーバーが乗っ取られたとき、そこから管理用の VLAN 20 まで届いてしまいます。

そこで ACL を作り、各 VLAN の SVI に ip access-group で適用して、VLAN 間で必要な通信だけを通すようにしました。

設定は copy running-config startup-config(短縮形は wr)で保存します。

スイッチの設定

ルーターからは外へ ping が通るのに、設定用 PC からゲートウェイへの ping が通りません。考えてみれば、まだスイッチの設定をしていませんでした。

スイッチ起動時に出る Would you like to terminate autoinstall? は「設定ファイルを自動で探すのをやめていいか」という意味なので、yes を選びます。

ルーターと同じく VLAN 10・20・30 を作り、ルーターにつながるポートをトランクに。設定用 PC のポートは VLAN 20 のアクセスポートにしました。

interface GigabitEthernet0/3
 switchport mode access
 switchport access vlan 20
 spanning-tree portfast
 no shutdown

spanning-tree portfast は、端末をつなぐポートで STP の待ち時間を飛ばし、すぐ通信できるようにする設定です。

ここで設定用 PC がインターネットにつながりました。

Proxmox と VLAN

ところが、サーバー PC につながるポートをトランクにすると、今度は設定用 PC から Proxmox の管理画面に入れなくなりました。Proxmox 本体を VLAN 20 に入れていなかったためです。

Proxmox 側でブリッジを VLAN aware にし、VLAN 20 用のインターフェースにアドレスを持たせるよう /etc/network/interfaces を書き換えました。

auto vmbr0
iface vmbr0 inet manual
    bridge-ports nic0
    bridge-stp off
    bridge-fd 0
    bridge-vlan-aware yes
    bridge-vids 2-4094

auto vmbr0.20
iface vmbr0.20 inet static
    address 172.16.20.10/24
    gateway 172.16.20.1

再起動後、Proxmox からも VM からも外に ping が通るようになりました。あわせて無償リポジトリに切り替えてアップデートしています。

VM 作成で出てきた言葉

VM の設定画面で知らない項目があったので調べました。 もっと色々調べた気がするけど、メモに残っていたのはこれだけでした。

  • QEMU Guest Agent:VM の中で動く、ホストとやり取りするためのエージェント。Proxmox からの正しいシャットダウン指示や、スナップショット時のファイルシステムの整合性確保、IP アドレスの取得などに使う。
  • SCSI コントローラ:OS のデバイスドライバとディスクの間に立ち、I/O 要求をディスクへのコマンドに変換して実行する装置。複数のデバイスを 1 系統で扱い、I/O の制御や最適化も担う。VM では仮想的なものを選ぶ。

Web サーバー(VLAN 30)

Ubuntu Server の VM を立て、Docker で nginx と Cloudflare Tunnel(cloudflared)を動かしています。

Proxmox 標準のコンソール(noVNC)はコピー&ペーストができないので、SSH で入って作業しました(最初は手打ちしようとしたのですが挫折しました)。

docker-compose は初めてで、インデントをタブで書いてしまうミスをするなど細かいところで苦労しました。YAML のインデントはスペースでなければいけません。(n敗)

起動はしたものの、ページが表示されません。原因は Cloudflare Tunnel 側の転送先の指定でした。cloudflared もコンテナの中で動いているので、http://localhost:80 だと自分自身を指してしまいます。compose ではサービス名でほかのコンテナに届くので、http://web:80 に変えると表示されました。

写真の保存場所(VLAN 10)

家族の写真を置く場所として、Google フォトに近い使い心地の Immich を入れました。VM には SSD 350GB、HDD 650GB、メモリ 6GB を割り当てています。

ローカルからは開けたものの、ストレージが認識されていませんでした。VM 側でディスクをフォーマットしていなかったためです。フォーマットして compose で保存先を指定すると、今度は Immich 自体が起動しなくなりました。保存先に .immich というファイルが必要だったようで、作成すると無事起動し、ストレージも認識されました。

外から安全に使う

外出先からも見られるよう、Cloudflare Tunnel でサブドメインを割り当て、Cloudflare Access でメール認証をかけました。あらかじめ登録したメールアドレス以外はログインできません。

Web サーバーの nginx をリバースプロキシにして、サブドメインへのアクセスを VLAN 10 の Immich へ転送しています。家族のメールアドレスを登録してテストし、外からアクセスでき、認証もきちんと効いていることを確かめました。

監視(VLAN 20)

Zabbix

VLAN 20 に Zabbix サーバーを立て、各 VM に zabbix-agent2 を入れました。

Web サーバー内の Docker コンテナの情報が取れませんでしたが、zabbix ユーザーを docker グループに追加すると取れるようになりました。

discordbotでアラートを通知するようにしました。

Discord に届いた Zabbix のアラート

ルーターとスイッチは SNMP で監視しています。SNMP は高校生のときに応用情報技術者試験の勉強や『マスタリング TCP/IP』で見て、いつか実際に使ってみたいと思っていたので、ここで使えて嬉しかったです。

Cisco 側でコミュニティを定義し、ACL で Zabbix サーバーからの通信だけを受け付けるようにしました。Zabbix では「Cisco IOS by SNMP」テンプレートを使うと簡単に登録できます。

未解決:学内 Wi-Fi から開けない

学内の Wi-Fi からだとサイトが開けません。端末の DNS サーバーを 8.8.8.8 にすると開けるので、学内の DNS で何かに引っかかっているようです。DNSSEC で弾かれているのではないかと疑っています。

使用した機器・技術

  • Cisco 891fj
  • Cisco Catalyst 2960
  • Proxmox VE
  • Ubuntu Server
  • Docker / docker compose
  • nginx
  • Cloudflare Tunnel / Cloudflare Access
  • Immich
  • Zabbix / SNMP
❦