環境

大学内で毎回プロキシを設定するのが面倒なのでConohaのVPSでVPNを建てようと思います。作業は一般家庭の回線から行っています。

セキュリティの一環としてVPNを自分で立てるのも有効です。HTTPS接続であってもISPには接続先が分かるので、

サーバー (VPS)

  • ArchLinux
  • OpenVPN 2.4.9
  • easyrsa 3.0.8

クライアント

  • Ubuntu 20.04 LTS Desktop
  • OpenVPN 2.4.7

鍵の作成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
sudo pacman -S openvpn easy-rsa
yay -S ovpngen # AURから

# ディレクトリを移動して作業
cd /etc/easy-rsa/

sudo easyrsa init-pki
sudo easyrsa build-ca
easyrsa build-server-full server nopass # `server` は任意
easyrsa build-client-full client nopass # `client` は任意
easyrsa gen-dh

# OpenVPNのディレクトリに鍵をコピー
mkdir -p /etc/openvpn/server
cp ca.crt dh.pem private/server.key issued/server.crt /etc/openvpn/server

cd /etc/openvpn/server
openvpn --genkey --secret ta.key

設定ファイル

iptables

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# /etc/iptables/iptables.rules(全文)
*nat
:POSTROUTING ACCEPT [0:0]
:PREROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]

-A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

COMMIT

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]

# SSH、Webサーバなど
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT

# OpenVPNへの接続
-A INPUT -p udp --dport 1194 -j ACCEPT
-A INPUT -p tcp -s 10.8.0.0/24 --dport 22 -j ACCEPT

# VPN接続後の外部への通信
-A FORWARD -i tun0 -s 10.8.0.0/24 -o eth0 -j ACCEPT
# VPN接続後の外部からの通信
-A FORWARD -i eth0 -o tun0 -d 10.8.0.0/24 -j ACCEPT

COMMIT
1
2
sudo systemctl restart iptables
sudo systemctl enable iptables

sysctl

1
2
# /etc/sysctl.conf(全文)
net.ipv4.ip_forward=1

リロード

1
sudo sysctl --system

OpenVPN

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# /etc/openvpn/server/server.conf (全文)
dev tun
port 1194
proto udp

ca ca.crt
cert server.crt
key server.key
dh dh.pem

server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 1.1.1.1"
keepalive 10 120

tls-auth ta.key 0
auth SHA512
cipher AES-256-CBC

comp-lzo

user nobody
group nobody

persist-key
persist-tun

status openvpn-status.log
verb 3
explicit-exit-notify 1

クライアント用設定ファイル作成

1
2
cd /etc/openvpn/server/
ovpngen /etc/openvpn/server/ca.crt /etc/easy-rsa/pki/issued/client.crt /etc/easy-rsa/pki/private/client.key /etc/openvpn/server/ta.key > client.ovpn

以下の設定は自動的に読み込んでくれないのでclient.ovpnからコメントアウト

1
2
3
4
5
6
7
8
### optionally uncomment and change both the cipher and auth lines to exactly
### match the values specified in /etc/openvpn/server/server.conf
cipher AES-256-CBC
auth SHA512
###
### depending on how /etc/openvpn/server/server.conf is configured, uncomment
### the following line if you are not using the compression push option therein
comp-lzo

あとはローカルにscpとかでコピーします。

デバッグ方法

verb 6にしてエラーの原因を出力させます。

サーバー

1
2
cd /etc/openvpn/server/
sudo openvpn --config server.conf --verb 6

クライアント

1
sudo openvpn --config vpn.ovpn --verb 6

デーモン化

デバッグが終わったらデーモンになるようにします

1
2
sudo systemctl start [email protected]
sudo systemctl enable [email protected]

まとめ

控えめに言って非常にだるいです。メールサーバ構築に次ぐ面倒くささだと思います。