実践Linux
RockyLinux8 RockyLinux8 目次へ TOP(HOME)へ
OpenVPNサーバー 2021年8月
openVPN (2.4.11-1)のインストール
OpenVPNは、SSL/TLSプロトコルを使用したSSL VPN=証明書と秘密鍵を生成し、公開鍵認証を行う。
サーバーとの接続はtunデバイスを経由して行う(すなわちレイヤ3のルーティング方式で行う。tapはレイヤ2でブリッジ方式の場合使用する。一般には、ルーティング方式が推奨されているようだ)。
●必要なもの
・OpenSSL
・LZO圧縮(リアルタイムでデータを圧縮・展開)
・pam
以上は、インストール済み。
確認
# dnf list installed | grep openssl
# dnf list installed | grep lzo
# dnf list installed | grep pam
・TUN/TAPデバイス これもインストール済み。
TUN/TAPデバイスがカーネルモジュールとしてインストールされていれば(/dev/net/tun)、わざわざカーネルを作り直す必要はない。
# modprobe tun として、エラーが出なければカーネルモジュールが入っているので、それを使えばよい。
# modprobe tun 自身の実行は、openvpnの起動スクリプトで自動的になされるようになっているので、通常はあえて実行する必要はない。
●EPELリポジトリの追加(これはすでに導入済:AWStats参照)
OpenVPNの入手には、外部レポジトリの追加(EPEL)が必要となる。
●OpenVPNのインストール
EPELからOpenVPNをインストール
# dnf --enablerepo=epel -y install openvpn easy-rsa net-tools
net-toolsはすでにインストールされていた。
認証局の構築と鍵の生成
# cd /usr/share/easy-rsa/3 バージョン3で動かす
# ./easyrsa init-pki 初期化
# ./easyrsa build-ca 認証局の設立
任意のパスフレーズを設定 適当なパスワードを設定
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:Server-CA (認証局の名前を設定)
認証局用の秘密鍵「ca.key」と証明書「ca.crt」が作成される。
鍵と証明書を生成して署名(鍵にパスワードはつけない)
「vpnserver1」「vpnclient1」等の箇所は任意の名称でOK(証明書のファイル名や commonName 等に設定される)
OpenVPNサーバ用の証明書と秘密鍵を作成
# ./easyrsa build-server-full vpnserver1 nopass
認証局の作成で設定したパスフレーズで応答
「nopass」を設定することでサーバの秘密鍵からパスワードを削除することができる。
vpnserver1.crtとvpnserver1.keyができる。
クライアント用秘密鍵と証明書を作成
# ./easyrsa build-client-full vpnclient1 nopass
vpnclient1.crtとvpnclient1.keyができる。
Diffie Hellman(DH)パラメーター生成
# ./easyrsa gen-dh DH鍵交換用の素数を生成=./pki/dh.pemができる。
tls-authを使用するために共有鍵ta.keyを生成
# openvpn --genkey --secret ./pki/ta.key
各証明書類を/etc/openvpn/server/にコピー
# cp -pR /usr/share/easy-rsa/3/pki/{issued,private,ca.crt,dh.pem,ta.key}
/etc/openvpn/server/
サーバーの設定
サンプル設定ファイルをコピーしておく。
# cp /usr/share/doc/openvpn/sample/sample-config-files/server.conf /etc/openvpn/server/
/etc/openvpn/server/server.conf (OpenVPN設定ファイルの編集)
port 1194 32行目 リスンするポート proto udp プロトコルは基本的にUDPを使用(TCPは使わない) dev tun tunモードで動かす ca ca.crt 78行目 認証局証明書のパス cert issued/vpnserver1.crt 変更 サーバー証明書のパス key private/vpnserver1.key 変更 サーバー鍵の場所 dh dh.pem 85行目 変更 DH鍵交換用のファイルを指定 server 10.8.0.0 255.255.255.0 101行目 VPNで使用するネットワークを指定(ローカルネットワークと重複しなければ何でもOK) push "route 192.168.7.0 255.255.255.0" 142行目 変更 コメント解除してローカルネットワークに変更 client-to-client クライアント間の通信を許可(必要に応じてコメントアウト) keepalive 10 120 231行目:キープアライブ (10秒毎に生存確認, 120秒無応答でダウンと判断) tls-auth ta.key 0 244行目 TLS-Authキーを指定 cipher AES-256-CBC 252行目 暗号化に使用するアルゴリズム comp-lzo 263行目 コメント解除 (圧縮を有効) persist-key 281行目〜(persistオプション有効) 最初に読み込んだ鍵ファイルを保持しておく persist-tun 再起動後にtunデバイスを再起動させない status /var/log/openvpn-status.log 287行目 ログの保管場所変更 log /var/log/openvpn.log 296行目〜 コメント解除してログの保管場所変更 log-append /var/log/openvpn.log verb 3 306行目 ログレベルを指定 (0 は fatal errors のみ, 9 は軽微なログまで全て出力) |
サービスの起動と自動起動の有効化
# systemctl start openvpn-server@server (一時的)
# systemctl enable openvpn-server@server (自動起動)
# systemctl status openvpn-server@server
Firewalld
# firewall-cmd --add-service=openvpn --zone=external (一時的)
# firewall-cmd --list-ports --zone=external 確認
恒常的に設定するには
# firewall-cmd --add-service=openvpn --zone=external --permanent
# firewall-cmd --reload
VPNクライアントからの全アクセスを許可
# firewall-cmd --add-interface=tun+ --zone=trusted
# firewall-cmd --add-source=10.8.0.0/24 --zone=trusted
IPフォワード(外部からの192.168.7.0/24に対するアクセスとそれに対する対応)
ここではenp0s29は、内部LANへのインターフェイスとする
# firewall-cmd --direct --add-rule ipv4 filter FORWARD 0 -i tun+ -o enp0s29 -d 192.168.7.0/24 -j ACCEPT
# firewall-cmd --direct --add-rule ipv4 filter FORWARD 0 -i enp0s29 -o tun+ -j ACCEPT
IPマスカレードの設定
# firewall-cmd --direct --add-rule ipv4 nat POSTROUTING 0 -s 10.8.0.0/24 -o enp0s29 -j MASQUERADE
なお、内部LAN側インターフェイスにはすでにZONE=trustedが設定済み
VPNクライアントからSamba(ここではVPNと同じサーバーに設置している)へアクセスしたい場合
Samba設定ファイル/etc/samba/smb.confを編集
interfaces = 10.8.0.0/24 ← 10.8.0.0/24のサブネットのTUNインターフェイスもリッスンするようにする
hosts allow = 192.168.7. 127. 10.8.0. ← アクセス許可アドレスにVPNを追加
以下のファイルを VPN 接続したいクライアントコンピュータへ
・/etc/openvpn/server/ca.crt CA証明書
・/etc/openvpn/server/ta.key TLS認証鍵
・/etc/openvpn/server/issued/vpnclient1.crt クライアント証明書
・/etc/openvpn/server/private/vpnclient1.key クライアント秘密鍵
↑ アクセスしたい内部PCについては、サーバーからpingが通っているか必ず確認しておくこと。
接続したいwindows10(図では\\192.168.7.20)があったとします。しかし、時間がたてばスリープ状態になりアクセスできなくなります。これを防ぐには、ネットワークアダプターを常にアクティブにしておく必要があります。
デバイスマネージャー > ネットワークアダプター > 当該ネットワークアダプターを右クリックして[プロパティ] > 電源の管理
> [電力節約のために、コンピューターでこのデバイスの電源をオフにできるようにする]のチェックを外し、常にネットワークアダプターを有効にします。
windowsクライアント
●VPNクライアント(vpnux Client)のインストール
https://www.openvpn.jp/download/よりをダウンロード/インストールする。
windows10では「vpnux Client Standard Edition 2.3」、windows7は旧バージョンのvpnux Client
1.4.6をインストール。(2021.8現在)
あらかじめ、サーバーで作成したCA証明書(ca.crt)、クライアント証明書(vpnclient1.crt)、クライアント秘密鍵(vpnclient1.key)、TLS認証鍵(ta.key)をUSBメモリなどにコピーしておく。それぞれ次の設定で読み込むことになる。
●設定
vpnux Clientを起動。
「プロファイル → 編集」で設定をする。
一般設定
プロファイル名 適当に「vpnclient1」
VPNサーバー サーバーのIPアドレス
ポート 1194
デバイス TUN (ルーティング方式)
プロトコル UDP
拡張設定 圧縮を有効にする/LZOを選択
TLS-Auth HMAC署名を使用 ta.keyを読み込む。(旧バージョンでは詳細設定より)
認証 CA証明書 ca.crtを読み込む。
証明書認証(PKI)を使用
証明書 vpnclient1.crtを読み込む。
秘密鍵 vpnclient1.keyを読み込む。
●VPNクライアントを起動してSamba(ここではVPNと同じサーバーに設置している)に接続してみる
ネットワークを開いて、「\\10.8.0.1」を入力する。
●ファイル共有もテスト
ネットワークを開いて、「\\192.168.7.20」にアクセスしてみる。
切断するには
右下の∧印より「隠されているインジケータを表示」させ、当該アイコンをダブルクリックする。
TOP(HOME)へ