カテゴリー
Linux

WireGuardとWg Gen Webで管理が簡単なVPN環境を作る

概要

シンプルでクロスプラットフォーム、しかも構成しやすいVPNソフトウェアのWireGuardでVPN環境を作ります。WireGuardの設定ファイルはWg Gen Webを使ってWeb UIで管理します。設定ファイルはsystemdで監視し、WireGuardを自動で再起動、更新を反映します。ネットワーク設定は環境によって異なるため、環境に合わせて調整してください。

以下では、Ubuntu 20.04 LTSがインストールされたサーバにDockerとDocker Composeが利用できる環境が構築されていることを前提として進めていきます。

1. WireGuard環境の構築

WireGuard自体はaptで瞬時に入ります。そのままだと設定ファイルは手動で作成になりますが、それほど難しい作業ではないので、この時点で動作確認を行います。

sudo apt update
sudo apt install wireguard

Web UIがあってもWireGuardの設定方法は理解しておく必要があります。WireGuard自体にあまり馴染みがない場合は公式サイトのQuick Startが非常に参考になるのでおすすめです。触ってみればわかりますが、OpenVPNよりも仕組みが簡単で格段に設定しやすいです。

/etc/wireguard/wg0.conf ができたら、次のコマンドでサービスとして起動します。

sudo systemctl start wg-quick@wg0
sudo systemctl enable wg-quick@wg0

2. 管理用Web UIを用意する

管理用のWeb UIはGitHubを検索するといくつか出てきますが、少し触った感じでは、今回利用する Wg Gen Web が一番しっくり来ました。提供されている機能は設定ファイルを生成するだけとシンプルですが、必要十分です。本記事では取り扱いませんが、Keycloakとの認証連携も可能でした。SMTPサーバの設定をしておけば、クライアント用の設定ファイルを生成した後、メールの送信もできるようです。以下のスクリーンショットでは、クライアント追加したユーザ名がUnknownになっていますが、KeycloakとOpenID Connectで認証した場合はユーザの氏名が表示されました。ただし、管理者アカウント / 一般ユーザアカウントの区別はなさそうでした。

次の内容で docker-compose.yml を用意します。サーバのプライベートIPは適宜置き換えてください。また、以下は認証なしでWeb UIにログインできる構成なので、必要に応じてポート設定を 192.168.1.201:8080:8080 などプライベートIPにバインドするなど調整してください。

version: '3.6'
services:

  wg-gen-web:
    image: vx3r/wg-gen-web:latest
    container_name: wg-gen-web
    restart: unless-stopped
    environment:
      WG_STATS_API: http://<サーバのプライベートIP>:8182
      WG_CONF_DIR: /data
      WG_INTERFACE_NAME: wg0.conf
      OAUTH2_PROVIDER_NAME: fake
    volumes:
      - /etc/wireguard:/data
    ports:
      - 8080:8080

  wg-json-api:
    image: james/wg-api:latest
    container_name: wg-json-api
    restart: unless-stopped
    cap_add:
      - NET_ADMIN
    network_mode: host
    command: wg-api --device wg0 --listen <サーバのプライベートIP>:8182

用意できたらコンテナを起動します。/etc/wireguard 以下にある設定ファイルは新しいものに置き換えられるため注意してください。

docker-compose up -d

http://<サーバのIPアドレス>:8080/ にアクセスするとWebUIが表示されます。ここで作業すると設定ファイルが /etc/wireguard に保存されますが、Wg-Gen-Web自体はWireGuardを操作しないため、設定反映には後述の自動反映設定が必要です。

Web UIにアクセスできてしまえば、あとは難しいところはなく設定できると思います。WireGuardをCUIで設定できる程度の前提知識は求められます。

登録されているクライアント一覧画面
サーバ設定画面
接続中のクライアント一覧画面

3. 設定ファイルの自動反映設定

/etc/wireguard に設定ファイルを置いただけでは設定は反映されないので、Systemdで設定ファイルの更新を監視し、変更があれば自動で再起動するよう設定します。なお、WireGuardではreloadがないため、接続中のクライアントがいた場合は一時的に切断されます。クライアント側の設定ファイルでKeepAlive設定を短くしておけば、切断時間を短縮することができます。

[Unit]
Description=Watch /etc/wireguard for changes

[Path]
PathModified=/etc/wireguard

[Install]
WantedBy=multi-user.target
[Unit]
Description=Restart WireGuard
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/bin/systemctl restart wg-quick@wg0.service

[Install]
WantedBy=multi-user.target

上記2つのファイルを配置したら、サービスを起動 / 有効化します。

sudo systemctl start wg-quick-wg0.path
sudo systemctl enable wg-quick-wg0.path

これ以降、Web UIで設定を変更すると /etc/wireguard/wg0.conf が更新され、それを監視しているSystemdがWireGuardが自動で再起動、設定が反映されます。

4. VPN接続のテスト

WireGuardは、Windows、Mac、Linux、FreeBSD、 iOS、Androidなど様々なプラットフォームで接続可能です。手元の環境では、以下について接続できることを確認しています。

  • Windows 10 Pro (20H2)
  • macOS (11.2.3 Big Sur)
  • Gentoo / Linux (Kernel 5.10.27)
  • FreeBSD 12.2-RELEASE
  • iPhone 12 (iOS 14.4.2)

WireGuard接続用のアプリケーションが各プラットフォーム用に用意されているので、Web UIで作成した設定ファイルをダウンロードして読み込ませるだけで利用可能になります。

5. まとめ

WireGuardでVPN環境を構築しました。また、設定ファイルを管理するWeb UIを用意し、設定ファイルの更新を検知して自動でサービスが再起動するよう調整しました。その後、手元の環境で接続確認を行いました。

カテゴリー
Linux

Google Chrome occasionally freezes with xf86-video-intel

1. Problem

I’m using Google Chrome as the default browser in my Gentoo/Linux laptop. Recently I noticed that the browser freezes all its rendering of web pages including even user interfaces. After tens of seconds it often recovers (but not always) and works normally as if there was no issue. The terminal logs say nothing before the freeze, but it always outputs “InitializeSandbox() called with multiple threads in process gpu-process.” after the recovering. It seems the issue occurs more often when the cases such as the CPU utilization is high, using the other applications in another workspace, and maybe using applications with HW-accelerations (not sure).

2. What I tried with no effect

The followings are what I tried during the freeze, but none of them works.

  • restarting window manager
  • changing to another workspace
  • moving the frozen window to another workspace
  • creating a new browser window

I also tried some general workarounds. However, the browser continued freezing.

  • restarting the browser
  • restarting the computer
  • disabling all the extensions with –disable-extensions argument
  • clear all the data in ~/.config/google-chrome and ~/.cache/google-chrome
  • reinstalling the browser

3. Workaround and Solution

(A) Disable hardware accelerations (just as a temporal workaround)

Some web pages I found encouraged to disable hardware accelerations by launching the browser with –disable-gpu flag. It indeed worked for me, but I wanted to enable hardware-accelerations for video decode (e.g. YouTube).

(B) Use modesetting as Xorg video driver instead of xf86-video-intel (the solution)

According the Gentoo Wiki, the xf86-video-intel is deprecating these years and the major Linux distributions are migrating to the modesetting driver. So I deleted xf86-video-intel package and changed the Xorg driver from intel to modesetting. Google Chrome is now working perfectly stable in Xorg environment. The below is my /etc/X11/xorg.conf.d/20-intel.conf.

Section "Device"
     Identifier  "Intel Graphics"
     Driver      "modesetting"
     Option      "AccelMethod" "glamor"
     Option      "DRI" "3"
     BusID       "PCI:0:2:0"
 EndSection

Instead, after the migration to the modesetting driver, it starts screen tearing. The issue could be solved by using compositor. After installed picom and with the following ~/.config/picom/picom.conf, screen is now smooth and everything works perfectly.

unredir-if-possible = false;
vsync = true;
backend = "glx";
glx-no-stencil = true;
glx-no-rebind-pixmap = true;
カテゴリー
Linux

LinuxでWake-on-LANのOS設定を有効化する

概要

Ubuntu / CentOS を対象に、OS側のWake-on-LAN設定を有効化します。この記事で対象とするバージョンは次の通りです。

  • Ubuntu 20.04 / 18.04
  • CentOS 7 / 8

OSによって設定方法が異なるので、以下ではそれぞれ分けて記載します。なお、BIOS/UEFIでの設定は各PC/サーバで別途設定が必要です。

カテゴリー
Linux

UEFI対応マルチOSブートUSBを作る

概要

3種類のOS(SystemRescueCD、Ubuntu、CentOS)をブートできるUSBメモリを作ります。UEFIでブートできるPCが対象です。この記事が古くなっていたので、その焼き直しです。

カテゴリー
Linux

DockerでMattermostを立てて日本語全文検索を使う

概要

DockerでOSSのチャットツールMattermostを立てます。OSSで公開されているチャットツールはいくつかありますが、私はMattermostが一番気に入っています。ただ、特に工夫せずにサービスを作ると日本語検索ができないので、MySQLにMeCabプラグインを導入し、形態素解析して日本語検索できるようにします。

カテゴリー
Linux

LinuxでUSBに直接ddできるWindows10のインストールイメージを作る

概要

次のようにでUSBメモリに直接ddすればWindows10のインストールUSBが出来上がるようなイメージを作成します。

sudo dd if=Win10_install_memstick.img of=/dev/sdX bs=1M

fallocateコマンドで空のファイルを作成してパーティションを作成すること、losetupコマンドでloopbackデバイスを割り当ててフォーマット/マウントして作業する2点がポイントです。Gentoo/Linuxで作業しましたが、特殊なツールは利用していないので、他のディストリビューションでも大枠は変わらないはずです。

カテゴリー
Linux

LinuxでWindows10のインストールUSBを作るシェルスクリプトを作った

使い方

Windows10のインストールUSBを作る記事のコマンドをシェルスクリプトにまとめました。以下のコードを適当なファイル(mkwin10usb.shとか)に保存し、chmod +x で実行権限を付与した上で、管理者権限で実行します。引数なしで実行すると使い方が表示されます。第一引数にWindows10のインストールISOのパスを、第二引数にUSBのブロックデバイス(/dev/sdbとか)を指定します。第二引数で指定したUSBメモリのデータは完全に削除されるので気をつけてください。また、パーティション操作時にキー入力が必要ですので、数回入力してください。

カテゴリー
Linux

LinuxでWindows10のインストールUSBを作る

はじめに

今回はLinuxの記事です。こちらの記事を参考に、特殊なツールやアプリケーションを使わずに、Windows10のインストール用USBメモリを作成します。作業自体はGentoo/Linux上で行いましたが、別のディストリビューションでも大枠は変わらないはずです。事前に次の2つを用意しておきます。