No Such Blog or Diary

«Prev || 1 | 2 | 3 | 4 |...| 59 | 60 | 61 || Next»

Ubuntu 20.04.3 LTS を OpenVPN サーバにしてみた

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 ""
}
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 じゃなくてブリッジにするのはまた今度.

Ubuntu 20.04 で 確認ダイアログのポップアップが遅い問題

最近 Ubuntu 20.04 に do-release-upgrade してから発生してた問題で,編集したファイルを保存せずエディタを閉じるときとかに出る確認ダイアログのポップアップが結構遅かった.ダイアログが出るまで待たされるだけだったのでしばらく放置してたけど,やっぱり我慢してられんと思ったのでどうにかしてみることにした.

で,とりあえず日本語でググっだけど同じ症状の情報はうまく見つからなかった.残念.そして次に "ubuntu dialogue slow pop up" でぐぐってみたら,まんま同じ症状が見つかった:https://askubuntu.com/questions/1254787/pop-up-dialogs-very-slow-on-ubuntu-20-04

結局,PulseAudio が音を準備するのに時間食ってたかなんかが原因だったらしい.そこに書いてある解決策のとおり,~/.config/pulse/default.pa を作って .include /etc/pulse/default.pa と unload-module module-suspend-on-idle の2行を書き込んで再起動したら直った.

めでたし.

LVM の容量拡張

VM のルートパーティションが狭くなってきたのでディスク追加してファイルシステム拡張.LVM だとここらが楽でいい.

以下,具体的な操作を忘れるのでメモ.

まず,VM に仮想ディスクを追加して,パーティションタイプを LVM (8e) にしたパーティション作成./dev/vdb1 とか.

次に LVM に物理ボリューム追加:sudo pvcreate /dev/vdb1

そしてボリュームグループにそれを追加:sudo vgextend hoge-vg /dev/vdb1

そしてルートパーティションの論理ボリュームにそのボリュームグループの空き(=上で拡張した分)を追加:sudo lvextend -l +100%FREE /dev/hoge-vg/root

そしたらファイルシステム拡張(ext4 だったので resize2fs で):sudo resize2fs /dev/hoge-vg/root

あとは念の為 reboot でもして終わり.

Emacs の正規表現置換でキャプチャした内容に関数を適用して置き換えたい

という需要があったのでぐぐってみたら,Emacs: regular expression replacing to change case とか Shiny and New: Emacs 22 で答えが見つかった.

置き換え文字中に \,(hoge \1) とかあると hoge を1つ目のキャプチャ(\1)に適用した結果に置き換わるらしい.より正確には,\, で後続のS式を評価できるらしい.なので \,(substitute ?_ ? (downcase \1)) とかすると,キャプチャした内容を小文字にしたうえで空白をアンダースコアで置き換えたものにできる.

超便利.だいぶ大昔からある機能のようだけど全然知らんかったのは残念.他にも連番を生成できる \# とかもあったりしてちゃんと勉強しとかんと時間を損するね.

VM が遅いと思ったら

新しい VM 母艦に virt-install で新しい VM を作って OS インストールしてたら異常に遅い.何でだろうと思って virt-install の出力をよく見てみたら kvm が使えてないっぽい感じのエラーが:

ERROR    Host does not support domain type kvm for virtualization type 'hvm' arch 'x86_64'

CPU 古くないし cat /proc/cpuinfo して vmx も出てるので CPU は問題ないはず,とか思いながら lsmod | grep kvm してみると……

kvm                   548864  0
irqbypass              16384  1 kvm

うん,kvm_intel が欠けてる.試しに sudo modprobe kvm_intel してみるもエラーを食らう:

modprobe: ERROR: could not insert 'kvm_intel': Operation not supported

CPU が大丈夫だけどこんな文句を言われるならあとは BIOS で無効化されているというオチだけど,試しに sudo /usr/sbin/kvm-ok してみる:

INFO: /dev/kvm does not exist
HINT:   sudo modprobe kvm_intel
INFO: Your CPU supports KVM extensions
INFO: KVM (vmx) is disabled by your BIOS
HINT: Enter your BIOS setup and enable Virtualization Technology (VT),
      and then hard poweroff/poweron your system
KVM acceleration can NOT be used 

ということで,VT が BIOS で無効化されてた.誰だそんな設定にしたのは…… たぶん誰もいじってないだろうからデフォルトなんだろうけど,何で VT 無効がデフォルトなんだか理解できん.

そんな状況で VM のインストールが終わるまでまったり止まってて時間無駄にした.残念.

Chainer のインストールに手こずる

Chainer というより CuPy のインストールに四苦八苦.最初に CUDA 9 を入れたらダメっぽいので CUDA 8 に入れ直してみたり,その後に cuDNN が有効になってないとか warning が出ているので cuDNN を入れて諸々して pip install --no-cache-dir -I で何度か再コンパイルするも cuDNN が全然認識されなかったり.結局 cuDNN は無くても動くことがわかったので諦めた.

んで,Chainr のサンプル train_mnist.py を time で測ってみたら CPU(8コアx2)で 6分,GPU(1080)で 50秒.GPU のが 7倍くらい速い.cuDNN 有効にしたらもっと速くなるのだろうか?

とりあえずこれで DL で遊べる環境が出来たので,何かネタ学習をやらせてみようかね.

«Prev || 1 | 2 | 3 | 4 |...| 59 | 60 | 61 || Next»
Search
Feeds

Page Top