VPN 構築
今回は、ラズパイでVPN構築をしようと思います。今回構築しようとしているネットワークの大まかな図はこちらです。
[Internet]
|
192.168.100.1/24
|
[ VPN server ]
| 192.168.1.2 |
| 192.168.2.2 |
-----------------
|
192.168.2.1/24 [My LAN]
材料
ハードウェア
- 落ちていたRaspberry pi 3と、その電源ケーブル
- 落ちていたLANケーブル * 2
- USBネットワークアダプタ BUFFALO LUA4-U3-AGTE
ソフトウェア
- Ubuntu 20.04 LTS
- pritunl
手順
初期設定
OSの初期設定をします。主にSSHとip固定の設定です。ラズパイについているLANポートを192.168.1.0/24のルーターに接続してipを固定します。
ネットワークアダプタの接続
つなぐだけです。192.168.2.1/24側のルーターに接続し、ipを固定します。
pritunlのインストール
pritunlにはarm64のバイナリがありません。ですので、ソースからインストールします。いくつか問題がありますので、修正しながらやっていきます。READMEを見ながらやります。
mongodbのインストール
READMEを見ると、最初にmongoDBをインストールしているようです。 mongoDB公式を見ながらやります。
wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list
sudo apt-get update
sudo apt-get install -y mongodb-org
# マニュアルではsudo dpkg --set-selectionsを使っていますが、apt-markを使います
sudo apt-mark hold mongodb-org
sudo apt-mark hold mongodb-org-server
sudo apt-mark hold mongodb-org-shell
sudo apt-mark hold mongodb-org-mongos
sudo apt-mark hold mongodb-org-tools
sudo systemctl start mongod
sudo systemctl status mongod
# 動いているので有効化
sudo systemctl enable mongod
golangのインストール
pritunlをビルドするためにgolangが必要です。最新は1.16.4でした。Go公式を見ながらやります。
wget https://golang.org/dl/go1.16.4.linux-arm64.tar.gz
sudo rm -rf /usr/local/go
sudo tar -C /usr/local -xzf go1.16.4.linux-arm64.tar.gz
# goがあることを確認
ls /usr/local/go
export PATH=$PATH:/usr/local/go/bin
# pathを追加
tee -a ~/.bashrc << EOF
export GOPATH=\$HOME/go
export PATH=/usr/local/go/bin:\$PATH
EOF
source ~/.bashrc
go version
# go version go1.16.4 linux/arm64
pythonのvertualenvの設定
Ubuntuにはすでにpython3が含まれていますので、virtualenvだけ入れます
sudo apt install python3-virtualenv -y
sudo mkdir -p /usr/lib/pritunl
sudo mkdir -p /var/lib/pritunl
sudo virtualenv /usr/lib/pritunl
goソースのビルド
ビルドに必要なソースをダウンロードしてビルド、配置します
go install github.com/pritunl/pritunl-dns@latest
go install github.com/pritunl/pritunl-web@latest
sudo cp -f ~/go/bin/pritunl-dns /usr/bin/pritunl-dns
sudo cp -f ~/go/bin/pritunl-web /usr/bin/pritunl-web
pythonソースビルド
最新バージョンは1.29.2664.67ですが、これはpython3に対応しておらず、python2用だったので、masterでやってみます。
export VERSION="master"
wget https://github.com/pritunl/pritunl/archive/$VERSION.tar.gz
tar xf $VERSION.tar.gz
rm $VERSION.tar.gz
cd ./pritunl-$VERSION
/usr/lib/pritunl/bin/python setup.py build
依存関係を追加してビルドして行きます。pynaclのインストールにはかなり時間がかかります。そのため、別にインストールしたほうがいいかもしれません。
sudo /usr/lib/pritunl/bin/pip3 install --upgrade pip
sudo apt-get install python3-dev libxml2-dev libxslt-dev -y
sudo apt-get install openvpn openssl net-tools psmisc ca-certificates -y
sudo /usr/lib/pritunl/bin/pip3 install pynacl
sudo /usr/lib/pritunl/bin/pip3 install -U -r requirements.txt
sudo /usr/lib/pritunl/bin/python setup.py install
sudo ln -sf /usr/lib/pritunl/bin/pritunl /usr/bin/pritunl
起動
sudo systemctl daemon-reload
sudo systemctl start pritunl
sudo systemctl enable pritunl
sudo systemctl status pritunl
limit増加
https://docs.pritunl.com/docs/configuration-5
sudo sh -c 'echo "* hard nofile 64000" >> /etc/security/limits.conf'
sudo sh -c 'echo "* soft nofile 64000" >> /etc/security/limits.conf'
sudo sh -c 'echo "root hard nofile 64000" >> /etc/security/limits.conf'
sudo sh -c 'echo "root soft nofile 64000" >> /etc/security/limits.conf'
setup
sudo pritunl setup-key
サーバーのipをブラウザで開く。問題なければ初期設定が見れる。(https設定をしていないので証明書エラーは出る。)keyを入力してsaveしたら
sudo pritunl default-password
表示された情報でログインする。ユーザー情報を編集して、public ipなど設定すればpritunlの初期設定は終了です。
ネットワーク設定
とりあえず、WAN側のルーターで、以下の設定をします。
- 必要なファイアーウォールの穴あけ
- udp [pritunlで作ったーサーバーのポート]
- tcp 80
- tcp 443
- 必要なNAPT設定
- 80, 443, pritunlサーバーのポートを192.168.1.2へ転送
WAN側の設定ができたら、もうサーバーが外部から見えていると思うので、ドメインの設定をしたうえでpritunlの設定からドメインを入力するとよいでしょう。そうすれば、letsencryptで勝手に証明書を取ってくれます。
次に、netplanをいじります。 参考 LAN側のインターフェースのpetplanの設定に以下を追加
routes:
- to: 192.168.2.0/24
via: 192.168.2.1
sudo netplan apply
ip route
追加された。
pritunlでサーバーに192.168.2.0/24ルートを追加します。
すると、VPN接続端末から192.168.2.0/24にアクセスできました。 今回はここまでです。ありがとうございました。