自宅ネットワーク改善日記その7 VLAN編

Contents
  1. あらすじ
  2. やったこと
  3. 設計
  4. 物理構築
  5. VLAN構築
  6. GS308T
  7. RTX830
  8. ルータ設定
  9. ルーティング
  10. IPマスカレード
  11. フィルタリング
  12. IPv6 について
  13. 役に立ったものたち
  14. 参考サイト
  15. 調査コマンド
  16. おわりに

今回は VLAN を設定してサーバをインターネットに公開した話です。 こんなに VLAN とかルーティングとかに思いを馳せたのは 5 年以上前に IDCF(データセンター事業者)で働いていたとき以来だったので、なかなか苦労しました。 が、その分この改善日記シリーズで一番楽しく構築できました 😄

全日記:

あらすじ

前回 IPv4 over IPv6 を設定したことで、ついに快適にインターネットできる環境が整いました。

普通にインターネットを使う環境が整ったので、今回は特に困ってないけどやりたかったことをやりました。具体的には、

  • グローバル IP が手に入ったのでサーバをインターネットに公開
  • VLAN 対応 NW 機器が手に入ったのでサーバ用とそれ以外用でネットワークを分割

ということをしました。

やったこと

サーバ用のネットワークを VLAN を使って普段使いのネットワークとわけました。 以後、サーバ用でない普段使い用のネットワークをホームネットワークとします。 また、サーバ用のネットワークをインターネットに公開しました。

これらを実現するために必要なタスクは次の 4 つでした。

  • 設計 (論理・物理)
  • 物理構築
  • VLAN 構築
  • ルータ設定
    • ルーティング
    • IP マスカレード
    • フィルタリング

以下、それぞれ順に説明します。

設計

まず、雑に論理構成を設計しました。といっても、ネットワークアドレスを決めたぐらいです。

  • lan1 - 192.168.100.0/24 - ホームネットワーク
    • RTX830 のデフォルト設定をそのまま使う
  • lan1/1 (VLAN1001) - 10.0.0.0/13 - サーバネットワーク
    • 10.0.0.0/9 から切り出す感じで
    • GCP に VPN でつなげたくて、わかりやすく GCP のデフォルトの 10.128.0.0/9 を避けた
    • RTX830 の VLAN 数上限 32 の半分をサーバ用として、均等に分割して/13 になった
    • 今のところこういう使い方を想定してます
      • 10.0.0.0/15 物理機器
      • 10.2.0.0/15 Kubernetes Service
      • 10.4.0.0/14 Kubernetes Pod

VLAN1001 を無駄にでかく設計してしまって、未来永劫こんな多くの IP が必要になることがないのはわかりきってるので、そのうち小さくするかもしれません w

この段階を構成図にするとこんな感じです。

NAS はインターネットに公開しなくてもインターネット側から使うことができるのと、サーバから使わない予定なので、ホームネットワークに置いています。

次に、物理構成を設計しました。どのケーブルをどのポートにつなぐかってところですね。

この構成図にはないですが、現在は nownabe room のスイッチのポート 6 の先にもう一台スイッチがあり、Raspberry Pi 4 が 4 台接続されています。

物理構築

設計した通りに LAN ケーブルをつないでいきました。

VLAN構築

VLAN を構築するために、スイッチとルータそれぞれ設定しました。

GS308T

まず、2 台の NETGEAR GS308T に VLAN1001 の設定をしました。

GS308T は Web UI で設定するんですが、それぞれの IP アドレスは NETGEAR Insight というアプリで調べました。 同じネットワークにある NETGEAR 機器を一覧表示してくれます。 実はアプリでいろいろ設定できるんじゃないかと思ってインストールしたんですが、ほぼ IP がわかる程度でした。

IP がわかったらブラウザでその IP にアクセスして、デフォルトのパスワードである password を入力してログインしました。次の順に VLAN を設定しました。 (以下は nownabe room の GS308T の場合。ToR も同様)

  • Switching > VLAN > Advanced > VLAN Configuration
    • わかりやすいように名前をつけて VLAN 1001 を追加
  • Switching > VLAN > Advanced > VLAN Membership
    • VLAN ID で 1001 を選択
    • Ports っていうのが物理ポート
    • U は VLAN の出口ポート
    • T は Trunk (VLAN タグを付けたまま送信する) ポート
    • 空白はその VLAN に属さないポート
  • Switching > VLAN > Advanced > Port PVID Configuration
    • g5、g6、g7 を選択
    • PVID を 1001 に設定
    • PVID は VLAN の入り口

RTX830

VLAN のルーティングをするために RTX830 にも VLAN の設定をしました。 とりあえずここでは、vlan インタフェースを作って DHCP を設定しました。 また、lan1 だけでなく lan 側すべてから DNS を受け付けるようにして、lan1/1 (VLAN1001)でも DNS を使えるようにしました。

# VLANインタフェースの作成
vlan lan1/1 802.1q vid=1001

# lan1/1 のRTX830のアドレスとネットマスク
ip lan1/1 address 10.0.0.2/13

# DHCPで使うIPアドレス範囲とネットワークのネットマスク
dhcp scope 1001 10.1.255.0-10.1.255.255/13

# DNSをlanインタフェース側からはすべて許可する
dns host lan

VLAN1001 の機器は基本的に静的 IP を設定するんですが、静的 IP 設定前でもとりあえず使えると便利なので一部の IP アドレス範囲だけ DHCP を設定しています。

ルータ設定

次にルーティングとかを設定して、VLAN1001 のサーバをインターネットに公開できるように設定しました。

ルーティング

LAN 間もインターネットへも自動でルーティング設定されるんですが、このままだとインターネットに公開ができません。 というのも、その6 で IPv4 の通信は DS-Lite を使うようにしていて、DS-Lite だとルータに Global IP がつかないからです。 なので、VLAN1001 のサーバは DS-Lite ではなく PPPoE を使ってインターネットに出るようにする必要があります。

図にするとこんな感じです。

RTX830 のフィルタ型ルーティングを使ってデフォルト GW を設定して、DS-Lite と PPPoE の使い分けを実現しました。

ip filter 500001 pass 192.168.0.0/16 * udp,tcp * *
ip route default gateway tunnel 1 filter 500001 gateway pp 1

これで、500001 にマッチする通信のみが DS-Lite の tunnel 1 を使うようになります。

IPマスカレード

Global IP はサーバではなく PPPoE のインタフェースに 1 つだけついているという状態なので、静的な IP マスカレード (NAPT) を設定して、特定のポートに対する通信を、特定のローカル IP・ポートへの通信に変換する必要があります。

今回はテストということで HTTP をサーバに割り当てました。

# NAT Descriptor 1000 はmasquarade typeとする
nat descriptor type 1000 masquarade

# NAT Descriptor 1000 にHTTPポートに関する静的IPマスカレードを設定
nat descriptor masquarade static 1000 1 10.0.1.1 tcp 80=80

# pp 1に対して設定しますよ
pp select 1

 # pp 1ではNAT Descriptor 1000を使う
 ip pp nat descriptor 1000

今後、公開するポートが増えたら追加していく感じになります。

フィルタリング

初期設定だと外からの通信を許可しないようなフィルタが設定されているので、HTTP を許可する必要があります。

図にするとこんな感じです。

最初はルーティングや NAT、フィルタリングの関係性がよくわかってなくてこの図を作りました。 こう図にするとわかりやすい気がします。

当初は LAN 間もフィルタリングで通信を制御しようと考えてたんですが、まずはシンプルにやりたいことを実現するため、必要最低限のフィルタリングのみを設定しました。 lan1/1 と lan1 ではフィルタリングせず、インターネットの出入り口である pp 1 と tunnel 1 だけに対してフィルタリングを設定しました。

# PingのEcho Replyを通すフィルタ
ip filter 300000 pass * 192.168.0.0/16,10.0.0.0/9 icmp 0

# すべて拒否するフィルタ
ip filter 300099 reject * * * * *

# VLAN1001に対してのHTTPコネクション開始時の最初のパケットだけを通すフィルタ
# (3-way handshake開始のSYNパケットのみを通す)
ip filter 300001 pass * 10.0.0.0/9 tcpflag=0x0002/0x0017 * 80

# SYNパケットが通った後、そのコネクションが終了するまで通信を許可する動的フィルタ
ip filter dynamic 300001 * 10.0.0.0/9 www

pp select 1
 # PingとHTTPだけ通してあとはすべて拒否する
 ip pp secure filter in 300000 300001 300099 dynamic 300001

# すべて拒否するフィルタ
ip filter 400001 reject * * * * *

tunnel select 1
 # すべて拒否する
 ip tunnel secure filter in 400001

IP マスカレードと同様に、公開するポートが増えたら pp 1 に対して許可フィルタを追加していくことになります。

IPv6 について

今の所、サーバネットワークは IPv6 に対応していません。

もともとは、サーバネットワークもホームネットワークも VLAN で運用して IPv6 にも対応する予定でした。 というかそう設定してたけど、なかなか上手く行かず失敗しました。 最低限だけ実現するためにできるだけシンプルにしようとして、ホームネットワークの VLAN もサーバネットワークの IPv6 もなくなった感じですね。

今は失敗の原因もわかっているのでどちらも設定できる気がしているんですが、もう設定が完成してしまってめんどくさいのでしばらくこれで運用すると思います w

役に立ったものたち

試行錯誤する中でいろいろ調べたりトラブルシュートしたりするのに役立ったものたちを紹介します。

参考サイト

  • RTpro - Yamaha Network Products Home Page
    • なんといってもこのサイトです。コマンドリファレンスや技術資料が非常に参考になりました。参考になったというかここのマニュアルがなかったら設定できません。
  • SINET Pingチェックサイト
    • 確実に IPv4 で Ping が通る外部のサーバを探していて見つけました。設定が上手く行かずなかなかインターネットに繋がらなかったので確認で使わせてもらいました。
  • Cloud Shell
    • GCP が無料で提供している、Web だけでお手軽に使える VM です。外からうちのサーバにアクセスできるか確認するのに使いました。Web Console からタダで素早く簡単に使えて便利です。

調査コマンド

このあたりのコマンドが調査で役に立ちました。 実際ログからフィルタリングのミスなんかが見つかりました。

syslog debug on
syslog notice on
show log
show ip secure filter
show nat descriptor address

おわりに

これで、自宅ネットワークを改善するぞ!と考え始めてからやりたかった自宅ネットワークの改善は一通り終わりました。 やったぜ!! 🎉

インターネット速くなったし楽しかったしちゃんとやりたかったこと実現できたし非常に満足してます 😆 ただ、VLAN でこんな苦労するなら RTX830 じゃなくて RTX1210 買っとけばよかったってのは思いました 😂 最初の機器選定でどっちにするか迷ったんですよね。。。

今後は、コンフィグが汚かったりするので綺麗にしていったり、サーバで遊んだりしていこうと思います 😚