CentOS7

OpenVPNブリッジモード

仮想マシン環境にセットアップする場合について。

以下の環境が前提

  1. NICを1枚しか設定していない(構成していない)
  2. IPアドレスはプライベートアドレスが1個のみ
  3. VPNサーバーのインターネットとの通信は、ルーターにNAT(IPマスカレード)を設定

仮想マシンにセットアップする場合の注意点

仮想マシンにOpenVPNをセットアップする場合、仮想NICのプロミスキャスモードを有効にする必要がある。

01.jpg

プロミスキャスモードを有効にする

Hyper-Vの場合

  1. 仮想化ゲストの設定を開く
  2. プロミスキャスモードにしたいネットワークアダプターを開き、高度な機能を選択
  3. "MACアドレスのスプーフィングを有効にする"にチェックを入れる
    02.png

OpenVPNインストール

OpenVPNeasy-rsaepelリポジトリからインストールします。

[root@localhost ~]# yum -y install openssl-devel lzo-devel pam-devel ← OpenVPNインストールに必要なパッケージをインストール
[root@localhost ~]# wget http://swupdate.openvpn.org/community/releases/openvpn-2.4.6.tar.gz
※最新版のURLはダウンロードページ
[root@localhost ~]# rpmbuild -tb --clean openvpn-2.4.6.tar.gz ← OpenVPNのRPMパッケージ生成
[root@localhost ~]# yum -y localinstall ~/rpmbuild/RPMS/x86_64/openvpn-2.4.6-1.x86_64.rpm ← 生成したOpenVPNのRPMパッケージをインストール
[root@localhost ~]# rm -f ~/rpmbuild/RPMS/x86_64/openvpn-* ← 生成したOpenVPNのRPMパッケージを削除
[root@localhost ~]# rm -f openvpn-2.4.6.tar.gz ← ダウンロードしたファイルを削除
[root@localhost ~]# wget https://github.com/OpenVPN/easy-rsa/archive/master.zip ← easy-rsaダウンロード
[root@localhost ~]# unzip master.zip ← easy-rsa解凍
[root@localhost ~]# cp -r easy-rsa-master/easyrsa3/* /etc/openvpn/ ← easyrsa3を所定のディレクトリへコピー
[root@localhost ~]# rm -rf easy-rsa-master/ ← 解凍先ディレクトリを削除
[root@localhost ~]# rm -f master.zip ← ダウンロードしたファイルを削除

認証局の設置

バージョンアップで設定ファイルや証明書が変更されるのを防ぐために新しいディレクトリを作り、そこに設定ファイルなどを保存する運用を行う。

認証局(CA)情報の初期化とディレクトリ作成

[root@localhost ~]# cd /etc/openvpn ←ディレクトリ移動
[root@localhost openvpn]# ./easyrsa init-pki ←初期化

認証局(CA)の作成

[root@localhost openvpn]# ./easyrsa build-ca ← CA証明書・秘密鍵作成
Enter New CA Key Passphrase: ←任意のパスフレーズを入力
Re-Enter New CA Key Passphrase: ←もう一度入力
Generating RSA private key, 2048 bit long modulus
..........................................................................................................................+++
................................+++
e is 65537 (0x10001)
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Common Name (eg: your user, host, or server name) [Easy-RSA CA]: ←VPN接続時のホスト名(FQDN)を入力(例:hogehoge.com)

CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/etc/openvpn/pki/ca.crt

DHパラメータ作成

[root@localhost openvpn]# ./easyrsa gen-dh
時間が掛かる(2分~3分)ので、しばし待機
DH parameters of size 2048 created at /etc/openvpn/pki/dh.pem

DHパラメータ(dh.pem)が作成されます。

ta.key作成

tls-authを設定しておくと、VPNセッション開始時のパケットをHMACで認証し、認可されないパケットは破棄されるため、DDoS攻撃を防ぐことができる。オープンなVPNサーバーを建てる時には設定しておくことがオススメらしい。ta.keyは静的共有鍵なので、安全な方法で配送される必要がある。

[root@localhost openvpn]# openvpn --genkey --secret ./ta.key

サーバー用の証明書と秘密鍵の作成

VPNサーバー「hogehoge.com」用の証明書と秘密鍵をパスフレーズ無しで作成します。

[root@localhost openvpn]# ./easyrsa build-server-full hogehoge.com nopass
Generating a 2048 bit RSA private key
....+++
.......................................................+++
writing new private key to '/etc/openvpn/easy-rsa/pki/private/hogehoge.com.key.O3l2ARzsse'
-----
Using configuration from ./openssl-1.0.cnf
Enter pass phrase for /etc/openvpn/easy-rsa/pki/private/ca.key: ←CA秘密鍵(ca.key)のパスフレーズを入力
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName :ASN.1 12:'hogehoge.com'
Certificate is to be certified until Mar 28 17:05:59 2028 GMT (3650 days)

Write out database with 1 new entries
Data Base Updated

サーバー用の証明書(hogehoge.com.crt)および秘密鍵(hogehoge.com.key)が作成されます

クライアント用の証明書と秘密鍵の作成

クライアント「client01」用の証明書と秘密鍵をパスフレーズ無しで作成します。

[root@localhost openvpn]# ./easyrsa build-client-full client01 nopass
Generating a 2048 bit RSA private key
................+++
..............................................................................................................+++
writing new private key to '/etc/openvpn/easy-rsa/pki/private/client01.key.MY2YPyBgBr'
-----
Using configuration from ./openssl-1.0.cnf
Enter pass phrase for /etc/openvpn/easy-rsa/pki/private/ca.key: ←CA秘密鍵(ca.key)のパスフレーズを入力
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName :ASN.1 12:'client01'
Certificate is to be certified until Mar 28 17:17:18 2028 GMT (3650 days)
Write out database with 1 new entries
Data Base Updated

クライアント用の証明書(client01.crt)および秘密鍵(client01.key)が作成されます

OpenVPNの設定

サーバー設定

証明書のコピー

[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 .

サーバーのコンフィグファイルのひな型をコピー

[root@localhost openvpn]# cp /usr/share/doc/openvpn*/sample/sample-config-files/server.conf /etc/openvpn/server.conf

コンフィグファイル(server.conf)の編集

[root@localhost openvpn]# vi /etc/openvpn/server.conf
port 1194 ←使用するポート番号
proto tcp ←使用するプロトコル
dev tap0 ←TAP/TUNデバイス指定 (VPNのtapとtunの違い
ca ca.crt ←ca証明書
cert hogehoge.com.crt ←サーバ証明書
key hogehoge.com.key # This file should be kept secret ←秘密鍵の指定
dh dh.pem ←乱数(DH)パラメータの指定
ifconfig-pool-persist ipp.txt ←配布用IPアドレスのテーブル(固定IPを使用する場合、ipp.txtを編集)
server-bridge 10.8.0.10 255.255.255.0 10.8.0.201 10.8.0.210 ←コメント解除して変更 [ブリッジに割り当てるIPアドレス・ネットマスク・クライアントに割り当てるIPアドレスの範囲
client-to-client ←クライアント間通信の許可
keepalive 10 120 ←キープアライブ設定(10秒ごとに生存確認、120秒無応答でダウン)
tls-auth ta.key 0 # This file is secret ←TLS認証キーの指定
cipher AES-256-CBC ←キーの強度を指定
comp-lzo ←圧縮の有効可
user nobody ←ユーザ権限の設定
group nobody
persist-key
persist-tun
status /var/log/openvpn-status.log ←ステータスログ
log /var/log/openvpn.log ←稼働ログ
log-append /var/log/openvpn.log
verb 3 ←ログレベル
;explicit-exit-notify 1 ←tcpを使う場合はコメントアウトする

ipp.txtの記述方法

[root@localhost ~]# vi /etc/openvpn/ipp.txt
client01,10.8.0.201
client02,10.8.0.202

ここで固定指定されていないユーザーについては、サーバー設定ファイルに記載された範囲内で、使用されていないものが順番に使用される。

起動テスト

ターミナルで起動テストを実行

[root@localhost openvpn]# openvpn server.conf

/var/log/openvpn.log にこんな感じのログが出ればOK

[root@localhost ~]# tail /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

(省略)

Sun Apr 1 03:28:46 2018 Initialization Sequence Completed

bridge-utilsパッケージのインストール

bridge-utils がインストールされていなければインストールします。

[root@localhost ~]# yum list installed | grep bridge-utils

bridge-utils インストール

[root@localhost ~]# yum -y install bridge-utils

ブリッジ起動・終了スクリプトの設置

[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

ブリッジ起動用スクリプトを編集

[root@localhost ~]# vi /etc/openvpn/bridge-start
#!/bin/sh

#################################
# Set up Ethernet bridge on Linux
# Requires: bridge-utils
#################################

# Define Bridge Interface
br=“br0”

# Define list of TAP interfaces to be bridged,
# for example tap=”tap0 tap1 tap2″.
tap=“tap0

# Define physical ethernet interface to be bridged
# with TAP interface(s) above.
eth=“eth0
eth_ip=“10.8.0.10
eth_netmask=“255.255.255.0
eth_broadcast=“10.8.0.255
gw=”10.8.0.1# Default Gateway抹消対策

for t in $tap; do
openvpn -mktun -dev $t
done

brctl addbr $br
brctl addif $br $eth

for t in $tap; do
brctl addif $br $t
done

sleep 1 # eth0 リアップ待機処理追加

for t in $tap; do
ifconfig $t 0.0.0.0 promisc up
done

sleep 1 # eth0 リアップ待機処理追加

ifconfig $eth 0.0.0.0 promisc up

ifconfig $br $eth_ip netmask $eth_netmask broadcast $eth_broadcast

route add default gw $gw # Default Gateway抹消対策
echo 1 > /proc/sys/net/ipv4/ip_forward ←IPフォワーディングの有効化

ブリッジ停止用スクリプトを編集

[root@localhost ~]# vi /etc/openvpn/bridge-stop
#!/bin/sh

####################################
# Tear Down Ethernet bridge on Linux
####################################

# Define Bridge Interface
br=“br0”

# Define list of TAP interfaces to be bridged together
tap=“tap0

ifconfig $br down
brctl delbr $br

for t in $tap; do
openvpn -rmtun -dev $t
done

systemctl restart network # ブリッジダウン後すべてのIPが消される対策
echo 0 > /proc/sys/net/ipv4/ip_forward ←IPフォワーディングの無効化
systemctl restart network ←ネットワークを再起動

OpenVPNの起動プロセスにブリッジ起動・停止スクリプトを埋め込む

起動は「ブリッジの起動→OpenVPNの起動」、停止は「OpenVPNの停止→ブリッジの停止」である必要がある。

パターン①「/etc/init.d/openvpn」が存在する場合

[root@localhost ~]# vi /etc/init.d/openvpn
case “$1″ in
start)
echo -n $”Starting openvpn: ”
/etc/openvpn/bridge-start
/sbin/modprobe tun >/dev/null 2>&1

~略~

stop)

~略~

# Run shutdown script, if defined
if [ -f $work/openvpn-shutdown ]; then
$work/openvpn-shutdown
fi
/etc/openvpn/bridge-stop

パターン②「/etc/init.d/openvpn」が無い場合

[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]
Description=OpenVPN Robust And Highly Flexible Tunneling Application On %I
After=network.target

[Service]
Type=forking
PrivateTmp=true
PIDFile=/var/run/openvpn-server/openvpn.pid
ExecStartPre=/etc/openvpn/bridge-start
ExecStart=/usr/sbin/openvpn --daemon --writepid /var/run/openvpn-server/openvpn.pid --cd /etc/openvpn/ --config server.conf
ExecStopPost=/etc/openvpn/bridge-stop

[Install]
WantedBy=multi-user.target

サービスとして起動

パターン①「/etc/init.d/openvpn」が存在する場合

サービスとして起動

[root@localhost ~]# systemctl start openvpn@server

サービス状態確認

[root@localhost ~]# systemctl starus openvpn@server

サービス自動起動

[root@localhost ~]# systemctl enable openvpn@server

サービス停止

[root@localhost ~]# systemctl stop openvpn@server

パターン②「/etc/init.d/openvpn」が無い場合

サービスとして起動

[root@localhost ~]# systemctl start openvpn-bridge

サービス自動起動

[root@localhost ~]# systemctl enable openvpn-bridge

サービス状態確認

[root@localhost ~]# systemctl starus openvpn-bridge

サービス停止

[root@localhost ~]# systemctl stop openvpn-bridge

Firewallの設定変更

firewallへ下記の通信許可を追加

[root@localhost ~]# firewall-cmd --add-port=1194/tcp --zone=public --permanent
[root@localhost ~]# firewall-cmd --permanent --zone=trusted --add-source=10.8.0.0/24
[root@localhost ~]# firewall-cmd --reload ←設定再読み込み
[root@localhost ~]# firewall-cmd --list-all ←設定確認
[root@localhost ~]# firewall-cmd --get-active-zones ←設定確認

添付ファイル: file02.png 285件 [詳細] file01.jpg 259件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-08-21 (火) 12:43:26