#author("2018-08-17T15:42:05+09:00","","") [[CentOS7]] *OpenVPNブリッジモード [#rb19f9ab] ''VPS''環境やレンタルサーバー環境に''OpenVPN''をセットアップする場合について。 **以下の環境が前提 [#da94a5ef] +NICが1枚しか装備されていない(構成されていない) +IPアドレスはグローバルアドレスが1個のみ +上記①②の理由からLAN側IPアドレスが無い *Firewallの設定変更 [#g9f1607c] ''firewall''へ''TCP 1194''の通信許可を設定 |BGCOLOR(black):COLOR(white):|c |[root@localhost ~]# firewall-cmd --add-port=1194/tcp --zone=public --permanent| |[root@localhost ~]# firewall-cmd --reload| *OpenVPNインストール [#ve80b5aa] ''OpenVPN''と''easy-rsa''を''epel''リポジトリからインストールします。 |BGCOLOR(black):COLOR(white):|c |[root@localhost ~]# yum -y install openssl-devel lzo-devel pam-devel &color(lime){← OpenVPNインストールに必要なパッケージをインストール};| |[root@localhost ~]# wget http://swupdate.openvpn.org/community/releases/openvpn-2.4.6.tar.gz| |&color(lightpink){※最新版のURLは[[ダウンロードページ>http://openvpn.net/index.php/download/community-downloads.html]]};| |[root@localhost ~]# rpmbuild -tb --clean openvpn-2.4.6.tar.gz &color(lime){← OpenVPNのRPMパッケージ生成};| |[root@localhost ~]# yum -y localinstall ~/rpmbuild/RPMS/x86_64/openvpn-2.4.6-1.x86_64.rpm &color(lime){← 生成したOpenVPNのRPMパッケージをインストール};| |[root@localhost ~]# rm -f ~/rpmbuild/RPMS/x86_64/openvpn-* &color(lime){← 生成したOpenVPNのRPMパッケージを削除};| |[root@localhost ~]# rm -f openvpn-2.4.6.tar.gz &color(lime){← ダウンロードしたファイルを削除};| |[root@localhost ~]# wget https://github.com/OpenVPN/easy-rsa/archive/master.zip &color(lime){← easy-rsaダウンロード};| |[root@localhost ~]# unzip master.zip &color(lime){← easy-rsa解凍};| |[root@localhost ~]# cp -r easy-rsa-master/easyrsa3/* /etc/openvpn/ &color(lime){← easyrsa3を所定のディレクトリへコピー};| |[root@localhost ~]# rm -rf easy-rsa-master/ &color(lime){← 解凍先ディレクトリを削除};| |[root@localhost ~]# rm -f master.zip &color(lime){← ダウンロードしたファイルを削除};| *認証局の設置 [#j70832ca] バージョンアップで設定ファイルや証明書が変更されるのを防ぐために新しいディレクトリを作り、そこに設定ファイルなどを保存する運用を行う。 **認証局(CA)情報の初期化とディレクトリ作成 [#h6f95cef] |BGCOLOR(black):COLOR(white):|c |[root@localhost ~]# cd /etc/openvpn &color(lime){←ディレクトリ移動};| |[root@localhost openvpn]# ./easyrsa init-pki &color(lime){←初期化};| **認証局(CA)の作成 [#z4d27d64] |BGCOLOR(black):COLOR(white):|c |[root@localhost openvpn]# ./easyrsa build-ca &color(lime){← CA証明書・秘密鍵作成};| |Enter New CA Key Passphrase: &color(lime){←任意のパスフレーズを入力}; &br; Re-Enter New CA Key Passphrase: &color(lime){←もう一度入力}; &br; Generating RSA private key, 2048 bit long modulus &br; ..........................................................................................................................+++ &br; ................................+++ &br; e is 65537 (0x10001) &br; You are about to be asked to enter information that will be incorporated &br; into your certificate request. &br; What you are about to enter is what is called a Distinguished Name or a DN. &br; There are quite a few fields but you can leave some blank &br; For some fields there will be a default value, &br; If you enter '.', the field will be left blank. &br; ----- &br; Common Name (eg: your user, host, or server name) [Easy-RSA CA]: &color(lime){←VPN接続時のホスト名(FQDN)を入力(例:hogehoge.com)}; &br; &br; CA creation complete and you may now import and sign cert requests. &br; Your new CA certificate file for publishing is at: &br; /etc/openvpn/pki/ca.crt| -CA証明書(''ca.crt'')およびCA秘密鍵(''ca.key'')が作成されます -入力したパスフレーズは、CA秘密鍵(''ca.key'')のパスフレーズになります **DHパラメータ作成 [#pf8739d3] |BGCOLOR(black):COLOR(white):|c |[root@localhost openvpn]# ./easyrsa gen-dh| |&color(lightpink){時間が掛かる(2分~3分)ので、しばし待機};| |DH parameters of size 2048 created at /etc/openvpn/pki/dh.pem| DHパラメータ(''dh.pem'')が作成されます。 **ta.key作成 [#m4d82b5f] ''tls-auth''を設定しておくと、VPNセッション開始時のパケットを''HMAC''で認証し、認可されないパケットは破棄されるため、''DDoS''攻撃を防ぐことができる。オープンなVPNサーバーを建てる時には設定しておくことがオススメらしい。''ta.key''は静的共有鍵なので、安全な方法で配送される必要がある。 |BGCOLOR(black):COLOR(white):|c |[root@localhost openvpn]# openvpn --genkey --secret ./ta.key| **サーバー用の証明書と秘密鍵の作成 [#qab9f682] VPNサーバー「hogehoge.com」用の証明書と秘密鍵をパスフレーズ無しで作成します。 |BGCOLOR(black):COLOR(white):|c |[root@localhost openvpn]# ./easyrsa build-server-full hogehoge.com nopass| |Generating a 2048 bit RSA private key &br; ....+++ &br; .......................................................+++ &br; writing new private key to '/etc/openvpn/easy-rsa/pki/private/hogehoge.com.key.O3l2ARzsse' &br; ----- &br; Using configuration from ./openssl-1.0.cnf &br; Enter pass phrase for /etc/openvpn/easy-rsa/pki/private/ca.key: &color(lime){←CA秘密鍵(ca.key)のパスフレーズを入力}; &br; Check that the request matches the signature &br; Signature ok &br; The Subject's Distinguished Name is as follows &br; commonName :ASN.1 12:'hogehoge.com' &br; Certificate is to be certified until Mar 28 17:05:59 2028 GMT (3650 days) &br; &br; Write out database with 1 new entries &br; Data Base Updated| サーバー用の証明書(hogehoge.com.crt)および秘密鍵(hogehoge.com.key)が作成されます **クライアント用の証明書と秘密鍵の作成 [#xf02ccb1] クライアント「client01」用の証明書と秘密鍵をパスフレーズ無しで作成します。 |BGCOLOR(black):COLOR(white):|c |[root@localhost openvpn]# ./easyrsa build-client-full client01 nopass &br; Generating a 2048 bit RSA private key &br; ................+++ &br; ..............................................................................................................+++ &br; writing new private key to '/etc/openvpn/easy-rsa/pki/private/client01.key.MY2YPyBgBr' &br; ----- &br; Using configuration from ./openssl-1.0.cnf &br; Enter pass phrase for /etc/openvpn/easy-rsa/pki/private/ca.key: &color(lime){←CA秘密鍵(ca.key)のパスフレーズを入力}; &br; Check that the request matches the signature &br; Signature ok &br; The Subject's Distinguished Name is as follows &br; commonName :ASN.1 12:'client01' &br; Certificate is to be certified until Mar 28 17:17:18 2028 GMT (3650 days) &br; Write out database with 1 new entries &br; Data Base Updated| クライアント用の証明書(client01.crt)および秘密鍵(client01.key)が作成されます *OpenVPNの設定 [#ped09565] ***サーバー設定 [#z08362e9] ''証明書のコピー'' |BGCOLOR(black):COLOR(white):|c |[root@localhost openvpn]# cp /etc/openvpn/pki/ca.crt .| |[root@localhost openvpn]# cp /etc/openvpn/pki/dh.pem .| |[root@localhost openvpn]# cp /etc/openvpn/pki/issued/hogehoge.com.crt .| |[root@localhost openvpn]# cp /etc/openvpn/pki/private/hogehoge.com.key .| ''サーバーのコンフィグファイルのひな型をコピー'' |BGCOLOR(black):COLOR(white):|c |[root@localhost openvpn]# cp /usr/share/doc/openvpn*/sample/sample-config-files/server.conf /etc/openvpn/server.conf| ''コンフィグファイル(server.conf)の編集'' |BGCOLOR(black):COLOR(white):|c |[root@localhost openvpn]# vi /etc/openvpn/server.conf| |port 1194 &color(lime){←使用するポート番号}; &br; proto tcp &color(lime){←使用するプロトコル}; &br; dev tap0 &color(lime){←TAP/TUNデバイス指定 ([[VPNのtapとtunの違い]])}; &br; ca ca.crt &color(lime){←ca証明書}; &br; cert hogehoge.com.crt &color(lime){←サーバ証明書}; &br; key hogehoge.com.key # This file should be kept secret &color(lime){←秘密鍵の指定}; &br; dh dh.pem &color(lime){←乱数(DH)パラメータの指定}; &br; ifconfig-pool-persist ipp.txt &color(lime){←配布用IPアドレスのテーブル(固定IPを使用する場合、ipp.txtを編集)}; &br; server-bridge 10.8.0.10 255.255.255.0 10.8.0.201 10.8.0.210 &color(lime){←コメント解除して変更 [ブリッジに割り当てるIPアドレス・ネットマスク・クライアントに割り当てるIPアドレスの範囲}; &br; client-to-client &color(lime){←クライアント間通信の許可}; &br; keepalive 10 120 &color(lime){←キープアライブ設定(10秒ごとに生存確認、120秒無応答でダウン)}; &br; tls-auth ta.key 0 # This file is secret &color(lime){←TLS認証キーの指定}; &br; cipher AES-256-CBC &color(lime){←キーの強度を指定}; &br; comp-lzo &color(lime){←圧縮の有効可}; &br; user nobody &color(lime){←ユーザ権限の設定}; &br; group nobody &br; persist-key &br; persist-tun &br; status /var/log/openvpn-status.log &color(lime){←ステータスログ}; &br; log /var/log/openvpn.log &color(lime){←稼働ログ}; &br; log-append /var/log/openvpn.log &br; verb 3 &color(lime){←ログレベル}; &br; ;explicit-exit-notify 1 &color(lime){←tcpを使う場合はコメントアウトする};| **ipp.txtの記述方法 [#n97f63bd] |BGCOLOR(black):COLOR(white):|c |[root@localhost ~]# vi /etc/openvpn/ipp.txt| |client01,10.8.0.201 &br; client02,10.8.0.202| ここで固定指定されていないユーザーについては、サーバー設定ファイルに記載された範囲内で、使用されていないものが順番に使用される。 *起動テスト [#kd62729e] ''設定中のターミナルで起動テストを実行'' |BGCOLOR(black):COLOR(white):|c |[root@localhost openvpn]# openvpn server.conf| ''別ターミナルを起動してログイン後にログを表示させる'' |BGCOLOR(black):COLOR(white):|c |[root@localhost ~]# tail -f /var/log/openvpn.log| |Sun Apr 1 03:28:46 2018 OpenVPN 2.4.5 x86_64-redhat-linux-gnu [Fedora EPEL patched] [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on Mar 1 2018 &br; &br; (省略) &br; &br; Sun Apr 1 03:28:46 2018 &color(red){Initialization Sequence Completed};| &color(red){''※↑こんな感じのログが出ればOK''}; *bridge-utilsパッケージのインストール [#k6d731c9] ''bridge-utils'' がインストールされていなければインストールします。 |BGCOLOR(black):COLOR(white):|c |[root@localhost ~]# yum list installed | grep bridge-utils| ''bridge-utils'' インストール |BGCOLOR(black):COLOR(white):|c |[root@localhost ~]# yum -y install bridge-utils| *ブリッジ起動・終了スクリプトの設置 [#gf5df791] |BGCOLOR(black):COLOR(white):|c |[root@localhost ~]# cp /usr/share/doc/openvpn-2.4.6/sample/sample-scripts/bridge-start /etc/openvpn/bridge-start| |[root@localhost ~]# cp /usr/share/doc/openvpn-2.4.6/sample/sample-scripts/bridge-stop /etc/openvpn/bridge-stop| |[root@localhost ~]# chmod 755 /etc/openvpn/bridge-start /etc/openvpn/bridge-stop| **ブリッジ起動用スクリプトを編集 [#ofcb56e5] |BGCOLOR(black):COLOR(white):|c |[root@localhost ~]# vi /etc/openvpn/bridge-start| |#!/bin/sh &br; &br; ################################# &br; # Set up Ethernet bridge on Linux &br; # Requires: bridge-utils &br; ################################# &br; &br; # Define Bridge Interface &br; br=“br0” &br; &br; # Define list of TAP interfaces to be bridged, &br; # for example tap=”tap0 tap1 tap2″. &br; tap=“&color(lime){tap0};” &br; &br; # Define physical ethernet interface to be bridged &br; # with TAP interface(s) above. &br; eth=“&color(lime){dummy0};” &br; eth_ip=“&color(lime){10.8.0.10};” &br; eth_netmask=“&color(lime){255.255.255.0};” &br; eth_broadcast=“&color(lime){10.8.0.255};” &br; gw=”&color(lime){10.8.0.1};″ &color(lime){# Default Gateway抹消対策}; &br; &br; for t in $tap; do &br; openvpn -mktun -dev $t &br; done &br; &br; brctl addbr $br &br; brctl addif $br $eth &br; &br; for t in $tap; do &br; brctl addif $br $t &br; done &br; &br; sleep 1 &color(lime){# eth0 リアップ待機処理追加}; &br; &br; for t in $tap; do &br; ifconfig $t 0.0.0.0 promisc up &br; done &br; &br; sleep 1 &color(lime){# eth0 リアップ待機処理追加}; &br; &br; ifconfig $eth 0.0.0.0 promisc up &br; &br; ifconfig $br $eth_ip netmask $eth_netmask broadcast $eth_broadcast &br; &br; route add default gw $gw &color(lime){# Default Gateway抹消対策};| **ブリッジ停止用スクリプトを編集 [#hc1941fa] |BGCOLOR(black):COLOR(white):|c |[root@localhost ~]# vi /etc/openvpn/bridge-stop| |#!/bin/sh &br; &br; #################################### &br; # Tear Down Ethernet bridge on Linux &br; #################################### &br; &br; # Define Bridge Interface &br; br=“br0” &br; &br; # Define list of TAP interfaces to be bridged together &br; tap=“&color(lime){tap0};” &br; &br; ifconfig $br down &br; brctl delbr $br &br; &br; for t in $tap; do &br; openvpn -rmtun -dev $t &br; done &br; &br; systemctl restart network &color(lime){# ブリッジダウン後すべてのIPが消される対策};| **OpenVPNの起動プロセスにブリッジ起動・停止スクリプトを埋め込む [#v73858cf] 起動は「ブリッジの起動→OpenVPNの起動」、停止は「OpenVPNの停止→ブリッジの停止」である必要がある。 ***パターン①「''/etc/init.d/openvpn''」が&color(red){存在する};場合 [#ofac13b8] |BGCOLOR(black):COLOR(white):|c |[root@localhost ~]# vi /etc/init.d/openvpn| |case “$1″ in &br; start) &br; echo -n $”Starting openvpn: ” &br; &color(lime){/etc/openvpn/bridge-start}; &br; /sbin/modprobe tun >/dev/null 2>&1 &br; echo 1 > /proc/sys/net/ipv4/ip_forward &color(lime){# 転送を有効にする}; &br; &br; ~略~ &br; &br; stop) &br; &br; ~略~ &br; &br; # Run shutdown script, if defined &br; if [ -f $work/openvpn-shutdown ]; then &br; $work/openvpn-shutdown &br; fi &br; &color(lime){/etc/openvpn/bridge-stop}; &br; echo 0 > /proc/sys/net/ipv4/ip_forward &color(lime){# 転送を無効にする};| ***パターン②「''/etc/init.d/openvpn''」が&color(red){無い};場合 [#taf2b593] |BGCOLOR(black):COLOR(white):|c |[root@localhost ~]# cp /usr/lib/systemd/system/openvpn@.service /usr/lib/systemd/system/openvpn-bridge.service| |[root@localhost ~]# vi /usr/lib/systemd/system/openvpn-bridge.service| |[Unit] &br; Description=OpenVPN Robust And Highly Flexible Tunneling Application On %I &br; After=network.target &br; &br; [Service] &br; Type=&color(lime){forking}; &br; PrivateTmp=true &br; PIDFile=&color(lime){/var/run/openvpn-server/openvpn.pid}; &br; &color(lime){ExecStartPre=/bin/echo 1 > /proc/sys/net/ipv4/ip_forward}; &br; &color(lime){ExecStartPre=/etc/openvpn/bridge-start}; &br; &color(lime){ExecStart=/usr/sbin/openvpn --daemon --writepid /var/run/openvpn-server/openvpn.pid --cd /etc/openvpn/ --config server.conf}; &br; &color(lime){ExecStopPost=/etc/openvpn/bridge-stop}; &br; &color(lime){ExecStopPost=/bin/echo 0 > /proc/sys/net/ipv4/ip_forward}; &br; &br; [Install] &br; WantedBy=multi-user.target| *ダミー(dummy)インターフェースを作成する [#o2563863] |BGCOLOR(black):COLOR(white):|c |[root@localhost ~]# vi /etc/modprobe.d/dummy.conf| |install dummy /sbin/modprobe --ignore-install dummy; /sbin/ip link set name dummy0 dev dummy0| |[root@localhost ~]# vi /etc/modules-load.d/dummy.conf| |# Load dummy.ko at boot &br; dummy| |[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-dummy0| |NAME=dummy0 &br; DEVICE=dummy0 &br; ONBOOT=yes &br; TYPE=Ethernet &br; IPADDR="10.8.0.10" &br; PREFIX="24" &br; NM_CONTROLLED=no| **再起動後、ダミーインターフェースの存在確認 [#u8b09314] ''再起動'' |BGCOLOR(black):COLOR(white):|c |[root@localhost ~]# reboot| ''確認'' |BGCOLOR(black):COLOR(white):|c |[root@localhost ~]# ifconfig dummy0| |dummy0: flags=195<UP,BROADCAST,RUNNING,NOARP> mtu 1500 &br; inet 10.8.0.10 netmask 255.255.255.0 broadcast 10.8.0.255 &br; ether 00:22:22:ff:ff:ff txqueuelen 0 (Ethernet)| |[root@localhost ~]# ip addr show| |[root@localhost ~]# route -n| **サービスとして起動 [#h64f9b94] ***パターン①「''/etc/init.d/openvpn''」が&color(red){存在する};場合 [#rdfd8232] ''サービスとして起動'' |BGCOLOR(black):COLOR(white):|c |[root@localhost ~]# systemctl start openvpn@server| ''サービス状態確認'' |BGCOLOR(black):COLOR(white):|c |[root@localhost ~]# systemctl starus openvpn@server| ''サービス自動起動'' |BGCOLOR(black):COLOR(white):|c |[root@localhost ~]# systemctl enable openvpn@server| ***パターン②「''/etc/init.d/openvpn''」が&color(red){無い};場合 [#bbd16a11] ''サービスとして起動'' |BGCOLOR(black):COLOR(white):|c |[root@localhost ~]# systemctl start openvpn-bridge| ''サービス自動起動'' |BGCOLOR(black):COLOR(white):|c |[root@localhost ~]# systemctl enable openvpn-bridge|