VPSでOpenVPNサーバーを立てて、VPN外へのアクセスはそのサーバーをゲートウェイにする(2020年版)
前書きという名の愚痴
マンションのインターネット環境が、NAT越えなきゃインターネットにアクセスできない環境で、これじゃあ自宅のPCに外からアクセスできないじゃない、ということで、VPS借りてVPNでも構築して、ついでにインターネットへのアクセスはそこからのみにするかと思って色々調べるも、なんかiptablesとか使ってやる2010年の記事しか見当たらないし。
というわけで、自分でまとめて書く。が、これもすぐ陳腐化するんだろうな。
VPSを借りる。
とりあえずConohaでメモリ1GBのVPSを借りる。
- 何でConoha?: すみぺ好きだから。
CentOSの一番新しいやつ(CentOS8.2)入れる
なんで仕事でもないのに古いやつ使わにゃならんのじゃ、ということで一番新しいやつにする。
(ここで古いやつ選んでれば過去の記事が参考になったんだろうけど。)
SSHやらの設定
ここらへんはそれこそググれば山ほど説明が出てくるので省略。
OpenVPNとeasy-rsaのインストール
OpenVPNはともかくなんでeasy-rsaとか入れにゃならんのか、と思うけど、複数台VPNに参加させるためには必要らしい。
で、なんかソースコードをビルドするとか、EPELを有効化しなきゃだめとかいう情報があって惑わされたけど、普通に
yum install openvpn easy-rsa
でインストールできました。
easy-rsaで認証局の設定
cd /usr/share/easy-rsa/3/
./easyrsa init-pki
./easyrsa build-ca
./easyrsa gen-dh
./easyrsa build-server-full server nopass
./easyrsa build-client-full client0 nopass
cd /etc/openvpn/server
openvpn --genkey --secret ta.key
はい、これで必要なファイルが7つできます。
- /usr/share/easy-rsa/3/pki/dh.pem……サーバー側でのみ必要なやつ。何なのかよくわからん。
- /usr/share/easy-rsa/3/pki/ca.crt……サーバーとクライアントの両方で必要な証明書
- /etc/openvpn/server/ta.key……サーバーとクライアントの両方で必要な秘密鍵
- /usr/share/easy-rsa/3/pki/issued/server.crt……サーバー側証明書。サーバー側に保存
- /usr/share/easy-rsa/3/pki/private/server.key……サーバー側秘密鍵。サーバー側に保存
- /usr/share/easy-rsa/3/pki/issued/client0.crt……クライアント側証明書。クライアント側に保存
- /usr/share/easy-rsa/3/pki/private/client0.key……クライアント側秘密鍵。クライアント側に保存
サーバー側設定
touch /etc/openvpn/server/server.conf
vi /etc/openvpn/server/server.conf
面倒だから設定ファイルそのまま書いちゃえ。
port 1194
proto udp
dev tun
ca /usr/share/easy-rsa/3/pki/ca.crt
cert /usr/share/easy-rsa/3/pki/issued/server.crt
key /usr/share/easy-rsa/3/pki/private/server.key
dh /usr/share/easy-rsa/3/pki/dh.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist /etc/openvpn/server/ipp.txt
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8" # ここはお好きなDNSを
push "dhcp-option DNS 8.8.4.4"
client-to-client
keepalive 10 120
tls-auth /etc/openvpn/server/ta.key 0
cipher AES-256-CBC
persist-key
persist-tun
status openvpn-status.log
verb 3
explicit-exit-notify 1
OpenVPN起動
systemctl enable openvpn-server@server.service
systemctl start openvpn-server@server.service
server.serviceのserver部分で、/etc/openvpn/server/にあるconfファイルの名前を指定している。
IPマスカレード設定
VPN内からVPN外へのアクセスをルーティング。ついでにファイヤーウォールがOpenVPNを通すように。
nmcli connection modify eth0 connection.zone external
nmcli connection modify tun0 connection.zone trusted
firewall-cmd --zone=external --add-service=openvpn --permanent
firewall-cmd --reload
externalは最初からIPマスカレードがyesになってるので、インターネット接続するeth0をそこに割り当てれば、特別なことしなくてもマスカレード設定は完了するらしい。
クライアント側設定
これも設定ファイル書いちゃえ。
client
dev tun
proto udp
remote [VPSのIPアドレス] 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca [ca.crtのクライアントでの保存先]
cert [client0.crtのクライアントでの保存先]
key [client0.keyのクライアントでの保存先]
remote-cert-tls server
tls-auth [ta.keyのクライアントでの保存先] 1
cipher AES-256-CBC
verb 3
あとはTunnelbrickなりでこの設定ファイル読み込ませれば、接続して、VPNの外へのアクセスも自動でVPSをゲートウェイにするはず。
Discussion