以前、CentOS 7をOpenVPNサーバーにするメモを書きましたが、今回はCentOS 8で新たにセットアップします。

この記事に書いてあること

  • 最小インストールしてあるCentOS 8.1.1911にOpenVPNをインストール・設定する
  • OpenVPNのサーバーモードはブリッジ方式
  • OpenVPNの認証は証明書認証を使用する

準備

ファイアウォール設定

( 12341/udp を使用する場合)

firewall-cmd --permanent --add-port=12341/udp
firewall-cmd --permanent --add-masquerade
firewall-cmd --reload

で、
firewall-cmd --list-all
で確認する。

IPフォワード設定

vi /etc/sysctl.conf
で、
net.ipv4.ip_forward=1
と追記してから再起動。

SELinux設定

semanage port -a -t openvpn_port_t -p udp 12341
確認は
semanage port --list | grep openvpn

インストール

epelリポジトリ追加

dnf install epel-release

OpenVPNとeasy-rsaのインストール

dnf --enablerepo=epel install openvpn easy-rsa

認証局の設定、証明書作成など

念のためコピー

mkdir /etc/openvpn/easy-rsa
cp /usr/share/easy-rsa/3/* /etc/openvpn/easy-rsa/ -R

作業ディレクトリへ移動

cd /etc/openvpn/easy-rsa

初期設定、証明書作成など

./easyrsa init-pki
./easyrsa build-ca
./easyrsa gen-dh
./easyrsa build-server-full server nopass

クライアント証明書(clientname を変えて必要な数だけ作る)
./easyrsa build-client-full clientname nopass

TLS-Auth用共通鍵作成

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

OpenVPNサーバー設定

前回の記事や、こちらの記事を参照。
設定ファイルの置き場所は
/etc/openvpn/ ではなく /etc/openvpn/server/ となる。

ブリッジの設定

ブリッジ br0 を追加
nmcli connection add type bridge con-name br0 ifname br0 stp no

IPアドレス固定(この例では192.168.9.11、マスク255.255.255.0)
nmcli connection modify br0 ipv4.method manual ipv4.addresses "192.168.9.11/24" ipv4.gateway "192.168.9.1" ipv4.dns 192.168.9.1

インターフェース名の確認
nmcli

インターフェースを(この例では enp1s0) を br0 に追加。
nmcli connection add type bridge-slave ifname enp1s0 master br0

enp1s0を削除してリブート。
nmcli connection delete enp1s0; reboot

OpenVPN 起動と自動起動設定

設定ファイルが vpn-bridge.conf として、起動するには
systemctl start openvpn-server@vpn-bridge

ブリッジに tap0 を組み込むサービスを作る。
vi /etc/systemd/system/openvpn-bridge.service

中身は↓こんな感じ(OpenVPNの設定ファイルが vpn-bridge.conf で dev tap0 になってて、ブリッジが br0)

[Unit]
Description=OpenVPN bridge service
Requires=openvpn-server@vpn-bridge.service
After=openvpn-server@vpn-bridge.service

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/sbin/ip link set dev tap0 master br0
ExecStartPost=/sbin/ip link set tap0 up
ExecReload=/bin/true
ExecStop=/sbin/ip link set dev tap0 nomaster

[Install]
WantedBy=multi-user.target

で、
systemctl start openvpn-bridge

自動起動させるには

systemctl enable openvpn-server@vpn-bridge
systemctl enable openvpn-bridge

…だと思ったんだけど、openvpn-bridge.serviceのほうが先に起動しちゃう…

とりあえず…

cp /usr/lib/systemd/system/openvpn-server@.service /etc/systemd/system/openvpn-bridge@.service

で、これをいじる。
ExecStartの後ろに

ExecStartPost=/sbin/ip link set dev tap0 master br0
ExecStartPost=/sbin/ip link set tap0 up
ExecStop=/sbin/ip link set dev tap0 nomaster

と書き足す…とりあえずこれを使うことにしました…