yujilow's note

技術ブログを目指すも、技術ブログになりきれてない雑記ブログ

pfsenseで自宅ネットワークを構築した

仮想サーバ用のルータとして、pfsenseを利用したらとても具合がよかったです。

pfsense

pfsenseは、ESF License で配布されているOSSのファイアウォールOSです。
ベースはFreeBSDで、最新安定版である2.3.4はFreeBSD 10.3-RELEASE-p19 を利用しています。
https://www.pfsense.org/

“ファイアウォール” OSなんですが、ルータとしての機能は一通り装備しており、仮想ルータとしても利用可能です。
GUIが充実しているので、open-wrtやvyOSは敷居が高いという人でも設定ができます。

ネットワーク構成

f:id:yjee:20170922195223p:plain

構成は上記の図のとおりです。図を書くのは苦手。
ESXi内部でサブネットを切り、自宅のローカルネットワークとツーツーで通信できます。*1

pfsenseが一本WANを持ち、WANが上流ルータのアドレスを持ちます。
pfsenseが作成するLANにすべての仮想マシンがぶら下がり、NATで外部と通信する仕組みです。

利点

この構成の利点は、以下のとおりだと思います。

仮想マシンの通信を監視できる

仮想マシンのすべてのUp/Down通信を監視できます。
pfsenseのトラフィックモニタが結構優秀で、src, dst別の通信量を表示できちゃったりします。
仮想ルータにまとめたかった理由は主にここだったので、実現できて良かったです。

ESXi内部の通信で上流ルータに負荷をかけない

LANで通信を完結させることで、無駄な負荷をかけないようにできます。
また、ESXiのvSwitch経由のみの通信となるため、実行速度が速くなります。
iperfで計測した結果が以下です。

user@server:~$ iperf -c x.x.0.1
------------------------------------------------------------
Client connecting to x.x.0.1, TCP port 5001
TCP window size: 85.0 KByte (default)
------------------------------------------------------------
[  3] local x.x.0.12 port 53736 connected with x.x.0.1 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec  3.16 GBytes  2.71 Gbits/sec
owner@home-server:~$

チューニングなしで、実測約3Gbpsでした。
MTUの調整できっともっと速くなります。

ACLをかけられる

ファイアウォールOSなので、アクセス制御がし易いです。
たとえば、外部と疎通する必要のある仮想マシンは内部のアクセスはホワイトリスト制御するなど。
大事なデータをしまっているNASにアクセス出来ないように絞れるので必要ですね!

いろいろな機能を利用できる

OpenVPNやBINDなど、結構いろいろな機能を利用できるので便利です。
haproxy pluginに対応しており、リバースプロキシとしても利用できます!(利用するかは別として)

帯域制限

帯域を絞れます。
ISPの制限で、Up30GB/dayなど縛られている場合はとても有効です。
うちは府中インターネットなので気にしてないですが。。

スクリーンショット

ダッシュボードはこんな感じです。

f:id:yjee:20170922192643p:plain

CPU、メモリなどのリソース利用率、トラフィック量、ファイアウォールのログ、OpenVPNの接続状態などが見られるようになっています。
UIは、一昔前のモダンっぽい感じです。bootstrapですね。サクサク動いて使いやすいです。

まとめ

自宅で仮想マシンを飼ってる人は仮想ルータを導入すると結構幸せになれます。
余裕ができたら、設定方法とか共有します。

*1:この構成だとセキュリティ面ではあまりよろしくないので、IP制限とか掛ける必要がありますが。。。

Ubuntu on VMWare ESXi + PCIe USB Controller passthroughを成功させるまでにハマったこと

以前にVDIを構築しようとして、PCIe USB Controllerのパススルーがどうしても成功しなくて諦めた過去がありました。

再度チャレンジしたところ、なんとか無事に成功したので忘備録として残しておきます。

検証環境

ホスト
CPU: Core i5-4460
マザーボード: Z87 Extreme6
OS: VMWare ESXi 6.0.0 Update 2 (Build 3620759)

ゲスト
Ubuntu Desktop 16.04 LTS
uPD720201 USB 3.0 Host Controller搭載の USB3.0増設ボード (型番忘れた)

懸念

構築する上で懸念となりそうなことについて書いていきます。

PCIeレーン数に注意

今となっては検証できないんですが、PCIeレーンが足りなくて、PCIeデバイスたちがI/Oできなかったんじゃないかと思ってます。

コンシューマ向けCPUは、PCIeレーン数が16しかなく、グラフィックボードを利用すると使い切ってしまいます。

最近のマザーボードだと、グラボをx8駆動にするなどよしなにレーン数を調節してくれるかもしれませんが、自分の所有するPCではその設定が見当たりませんでした。

グラボと一緒にパススルーした場合でも、lspciした結果には出てきていたのが謎ですが。。余裕ができたら検証します。

UbuntuのKernel Versionに注意

まず、lspciをしたら以下のデバイスが見えている状態であるとします。

03:00.0 USB controller: Renesas Technology Corp. uPD720201 USB 3.0 Host Controller (rev 03)

もちろん環境や利用しているデバイスによって値は異なるので、VMから見えているかどうかを確認します。

おもむろに “uPD720201 ubuntu"で検索をかけたら、以下のページがヒットしました。

https://askubuntu.com/questions/583626/trouble-with-usb3-chipset-upd720201

どうやら xhci という、USB3.0 に利用されているコントローラの規格にLinux が正式に対応したのは、kernel 4.4-4.6からだそうです。

Ubuntu 16.04 LTSの標準カーネルは4.4.0-21であるので、ちょっと古いですね。

おもむろに dist-upgradeします。

すると、4.4.0-96 まで上がりました。これでも少し古いですね。

user@ubuntu:~$ uname -r
4.4.0-96-generic

とりあえずリブートして様子を見ると、無事に xhciが有効になっていることが確認できました。

[    2.048489] xhci_hcd 0000:03:00.0: xHCI Host Controller
[    2.048494] xhci_hcd 0000:03:00.0: new USB bus registered, assigned bus number 3
[    2.053892] xhci_hcd 0000:03:00.0: hcc params 0x014051cf hci version 0x100 quirks 0x00000010
[    2.054577] usb usb3: Manufacturer: Linux 4.4.0-96-generic xhci-hcd
[    2.054736] xhci_hcd 0000:03:00.0: xHCI Host Controller
[    2.054739] xhci_hcd 0000:03:00.0: new USB bus registered, assigned bus number 4
[    2.057514] usb usb4: Manufacturer: Linux 4.4.0-96-generic xhci-hcd
[    2.699351] usb 3-4: new full-speed USB device number 2 using xhci_hcd
[  295.598597] usb 3-4: new full-speed USB device number 3 using xhci_hcd
[  315.672347] usb 3-3: new full-speed USB device number 4 using xhci_hcd
[  343.226731] usb 3-3: new full-speed USB device number 5 using xhci_hcd

この状態で USB Bluetooth Adapterを挿入すると、無事にBTが有効になりました。ぱちぱち👏

まとめ

  • PCIeレーンは全然足りないから気を使おう
    • できれば、レーンを制御できるマザボ (or x16の形をしたx8を積んだマザボ)を買おう
  • LinuxのUSB3.0対応は想像よりも遅かったので気をつけよう