- 2021-11-28 (Sun) 19:30
- 一般 ソフトウェア ( Linux/coLinux )
L2TP/IPsec ももう古いかなということで,OpenVPN で VPN サーバを用意してみた.とりあえず,コミュニティの How to の Installing OpenVPN を見つつテキトウに,Win と Android からつながるところまでやってみた.
まず,openvpn と easy-rsa のパッケージをインストール.easy-rsa はマシン識別のための証明書などを自前でやるために使う.バージョンはそれぞれ 2.4.7-1 と 3.0.6-1 が入った.
sudo apt install openvpn easy-rsa
次に,証明書周りのセットアップを.そのためにまずは認証局の諸々のファイルを置く場所の作成と認証局の情報を書いたファイルを用意.
sudo mkdir /etc/openvpn/easy-rsa sudo cp -r /usr/share/easy-rsa/* /etc/openvpn/easy-rsa/ cd /etc/openvpn/easy-rsa/ sudo cp vars.example vars
この vars ファイル内の変数 EASYRSA_REQ_(COUNTRY|PROVINCE|CITY|ORG|EMAIL) の辺りに自分の情報をテキトウに入れておく.
そして,認証局の初期化をして,認証局の証明書を作成.鍵のパスフレーズ(後で使う)を聞かれるのでテキトウに設定して,Common Name はテキトウに My-OpenVPN-CA とかで.
sudo ./easyrsa init-pki sudo ./easyrsa build-ca
あと,DH のパラメータと HMAC 用の鍵を生成しておく:
sudo ./easyrsa gen-dh sudo openvpn --genkey --secret /etc/openvpn/ta.key
次いで,サーバ(server)とクライアント(client1)の証明書を発行.面倒な場合は nopass をオプションにつければパスなしの証明書になる.パスをつけるならこのオプションを外す.最終的に証明書発行をするところで CA の鍵のパスフレーズを聞かれるので入れる.
sudo ./easyrsa build-server-full server nopass sudo ./easyrsa build-client-full client1 nopass
次に,openvpn サーバの設定をする.サンプルファイルに説明があるのでそれを見れば良いけれど,必要なところだけ書くのをヒアドキュメントでコマンドにすると次のような感じ.これは,サーバの外向きネットワークが 192.168.1.0/24 で,そのインターフェースが eth0 で,VPN でつなげてきた連中は 10.8.0.0/24 の仮想ネットワークにつなげて NAPT するという設定.サーバのポートはデフォルトの 1194/udp で.
sudo tee /etc/openvpn/server.conf <<'EOS' port 1194 proto udp dev tun ca /etc/openvpn/easy-rsa/pki/ca.crt cert /etc/openvpn/easy-rsa/pki/issued/server.crt key /etc/openvpn/easy-rsa/pki/private/server.key dh /etc/openvpn/easy-rsa/pki/dh.pem server 10.8.0.0 255.255.255.0 ifconfig-pool-persist /var/log/openvpn/ipp.txt push "route 192.168.1.0 255.255.255.0" push "redirect-gateway eth0 bypass-dhcp" keepalive 10 120 tls-auth /etc/openvpn/ta.key 0 cipher AES-256-GCM user nobody group nogroup persist-key persist-tun status /var/log/openvpn/openvpn-status.log verb 3 explicit-exit-notify 1 EOS
この設定だと NAPT が動いてくれないと困るので,そこらを有効化する(/etc/sysctl.conf で net.ipv4.ip_forward=1 として,iptables で 10.8.0.0/24 の IPマスカレードを有効化):
sudo sed -e 's/.*net.ipv4.ip_forward=.*/net.ipv4.ip_forward=1/' -i /etc/sysctl.conf sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j MASQUERADE
1194/udp が開いてないなら開けておく.また,iptables の内容を保存しておくなら,iptables-persistent を入れて netfilter-persistent save しておく:
sudo apt install iptables-persistent sudo service netfilter-persistent save
なお,ufw 使ってるときには /etc/ufw/sysctl.conf の方で net/ipv4/ip_forward=1 としてフォワーディングを有効化する.
これでサーバの準備ができたのでサービス起動:
sudo systemctl start openvpn
ログ確認(@server をつけないとサーバのログが見られない):
sudo journalctl -u openvpn@server
つぎに,クライアント側を準備.
Windows マシンの場合は,OpenVPN のクライアントをインストールする.https://openvpn.net/community-downloads/ から MSI installer を落として入れれば OK.32-bit 版か 64-bit 版か自分の環境にあったほうを.
そして、"C:\Program Files\OpenVPN\config\" に設定ファイルを置く.メンドイので WSL のコマンドとしてやれば次のとおり.192.168.1.132 としている部分はサーバの外側のアドレスで,FQDN でもよい.他のパラメータはサーバのパラメータと同じ感じで.
cd "/mnt/c/Program Files/OpenVPN/config" cat > client1.ovpn <<'EOS' client dev tun proto udp remote 192.168.1.132 1194 resolv-retry infinite nobind persist-key persist-tun ca ca.crt cert client1.crt key client1.key remote-cert-tls server tls-auth ta.key 1 cipher AES-256-GCM verb 3 EOS
さらに,同じディレクトリにサーバ上の以下のファイルを持ってくる(CA 証明書と,クライアント証明書と,HMAC 用鍵):
/etc/openvpn/easy-rsa/pki/ca.crt /etc/openvpn/easy-rsa/pki/issued/client1.crt /etc/openvpn/easy-rsa/pki/private/client1.key /etc/openvpn/ta.key
これで Windows のクライアントの準備完了.あとは,クライアントの GUI を起動して,タスクトレイのアイコンから右クリックで「接続」でつながる.クライアントの証明書にパスをつけていた場合は,この接続時に入力することになる.
次に Android 用の準備.Android の場合は諸々をひとつのファイルに突っ込んだ設定ファイルを作る.基本的には,設定ファイルで ca, cert, key, tls-auth にファイル名を指定していた部分を,そのパラメータ名のタグで囲って中身を書く形になる.あと,key-direction 1 という新たなオプション項目を入れる(tls-auth の第二パラメータだったのを個別に書いたもの).
色々メンドイのでサーバ上にスクリプトを用意.192.168.1.132 としてる部分はサーバの外側のアドレスで,FQDN でもよい:
cd /etc/openvpn/easy-rsa/ cat > gen_ovpn.sh <<'EOF' #!/bin/bash if test ${EUID:-${UID}} != 0; then echo "run as root" exit 0 fi if test $# -lt 1; then echo "Usage: $0 clientname" exit 0 fi name=$1 cat <<'EOS' client dev tun proto udp remote 192.168.1.132 1194 resolv-retry infinite nobind persist-key persist-tun remote-cert-tls server key-direction 1 cipher AES-256-GCM verb 3 EOS function inlining() { tag=$1 file=$2 echo "<${tag}>" cat "$file" | sed -e '/CERTIFICATE/,/CERTIFICATE/p;/PRIVATE KEY/,/PRIVATE KEY/p;/Static key/,/Static key/p;d' echo "${tag}>" } inlining ca /etc/openvpn/easy-rsa/pki/ca.crt inlining cert "/etc/openvpn/easy-rsa/pki/issued/${name}.crt" inlining key "/etc/openvpn/easy-rsa/pki/private/${name}.key" inlining tls-auth /etc/openvpn/ta.key EOF chmod 744 gen_ovpn.sh
そして,サーバでクライアント(client2)の証明書を発行して,その証明書などを含んだ設定ファイル(client2.ovpn)をスクリプトに生成させる:
sudo ./easyrsa build-client-full client2 sudo ./gen_ovpn.sh client2 > client2_full.ovpn
あとは,このファイルを google drive 経由とかで Android へ持っていって,OpenVPN のオフィシャルの OpenVPN Connect のアプリを入れてそのファイルを登録すれば OK.接続はアプリの GUI でスイッチをポチるだけ.
なお,この 1ファイルに全部突っ込んだやつは Windows でも使える.
ということで,以上で OpenVPN サーバを用意できることが確認できた.めでたし.NAPT じゃなくてブリッジにするのはまた今度.
- Newer: ことはじめ