Raspberry Pi 3にOpenVPNサーバーを構築しました。
外で、ひかり電話を使うために、Asterisk で内線設定したスマホ子機をイントラネットにつなぐ必要があったためです。
ポートに穴を開けずに安全につなぐには、VPNが一番です。
最初は、光ルーターの VPN を使っていましたが、すぐに切れて使い物になりません。
常時接続にするにはスマホの root化が必要でしたが、これは抵抗がありました。
OpenVPN なら常時接続できる、ということでこれを構築したわけです。
最終的には、認証用のファイルを dd-wrt化したルーターに転用し、現在はこのルーター上で OpenVPN は動作していますので、Raspberyy Pi 3 上の OpenVPN サーバーは未起動状態にしてあります。
dd-wrt ルーターがなければ、Raspberry Pi 3 でもかまいませんが、我が家の場合、Raspberry Pi 3 には Asteriskが構築されていて、これは単独で動作するようにしたかったので、OpenVPN は dd-wrt ルーターに移しました。
もう1台、Raspberry Pi を用意してこれに構築しても結構です。
なぜ分けたかというと、セキュリティ上、万一いずれかのサーバーに侵入を許してしまっても、ほかのサーバーへの波及を防止するためです。
1.インストール
# apt-get update
# apt-get install openvpn easy-rsa libssl-dev openssl
2.証明書作成用ディレクトリの作成
# make-cadir /etc/openvpn/easy-rsa
# cd /etc/openvpn/easy-rsa
3.証明書作成用の環境変数の書き換え
このディレクトリ内に var というファイルがありますので、この中の下記部分を
書き換えます。
EXPORT KEY_COUNTRY=”JP” # 国:適当に
EXPORT KEY_PROVINCE=”Chiba” # 都道府県:適当に
EXPORT KEY_CITY=”K-Cty” # 市町村:適当に
EXPORT KEY_ORG=”Home” # 組織:適当に
EXPORT KEY_EMAIL=”abcd@gmail.com” # メールアドレス:適当に
EXPORT KEY_OU=”PersonalUnit” # 組織単位:適当に
export KEY_NAME=”abcd” ← 任意
変更したファイルの読み込み。
# source ./var ➡ 次の ./clean-all の実行を促される。
# ./clean-all
サーバーの秘密鍵、証明書の作成。
# ./build-ca
# ./build-key-server server ➡ サーバ名を入力(任意)
途中で、入力待ちが何ヶ所かありますが、すべて空欄のまま、または [y/n] はy を入力
して「enter(return)」
次に、Diffie Hellmanパラメーターを生成します。
# ./build-dh ➡ 4〜5分かかります。
クライアント、サーバーに共通の秘密鍵を生成。
# cd ./keys
# openvpn --genkey --secret ta.key
ハイフンは2つ続けて記述 「- - g e n k e y」「- - s e c r e t」
クライアント鍵の作成。
一つ上のディレクトリに戻る。
# cd ..
# ./build-key-pass client ➡ クライアント名を入力(任意)
途中、以下のPEMパスワードの入力を促されるので、パスワード(任意)
「abcdefgh」を入力
Enter PEM pass phrase:abcdefgh
確認のため、再入力
Verifying – Enter PEM pass phrase:abcdefgh
これ以外は、すべて空欄のまま、または [y/n] はy を入力して「enter(return)」
作成したファイルを openvpn ディレクトリにコピー
# cp ./keys/ca.* client.* ta.key dh2048.pem server.* /etc/openvpn
同じく、ca.* , client.* , ta.key を端末にインストールするために、共用ディレクトリ
にもコピー。
# cp ./etc/openvpn/ca.* client.* ta.key /home/share
コピー先の /home/share のファイル群の権限属性を変えます。
# chmod 777 /home/share/*
Mac を通じて、端末側にコピーします。
次に、/etc/openvpn/server.conf を以下の内容で編集します。
port 443 ➡ 接続ポート番号(通常は 1194 ですが、443 がいいと思います)
proto udp ➡ プロトコルはudp(tcpでも可)
dev tun ➡ tun を定義
ca ca.crt ➡ 証明書の指定(ディレクトリは同じ /etc/openvpn にあれば省略可)
cert server.crt ➡ サーバ証明書
key server.key ➡ サーバの鍵
dh dh2048.pem ➡ 暗号の指定
server 10.8.0.0 255.255.255.0 ➡ サーバの仮想ip とネットマスクを指定
ifconfig-pool-persist ipp.txt ➡ クライアントに払い出したip のリストを入れておく器
push "route 192.168.xxx.0 255.255.255.0" ➡ イントラネットのアドレスとネットマスク
push "redirect-gateway def1 bypass-dhcp" ➡ トラフィックをすべて VPN 経由にする指定
push "dhcp-option DNS 192.168.xxx.yyy" ➡ DNS サーバを指定(ローカル)
push "dhcp-option DNS 8.8.8.8" ➡ DNSサーバを指定(グローバル)
tls-server ➡ TLS認証するサーバとして有効化
tls-auth ta.key 0 ➡ TLS認証の鍵と方向(0: サーバ、 1: クライアント)
cipher AES-256-CBC ➡ 暗号化の種類
user nobody ➡ 接続断時のユーザ属性を特権にしない
group nogroup ➡ 同じく、ユーザグループ属性も特権にしない
;client-to-client ➡ クライアント間の通信をOK にするなら、コメントオフにする
duplicate-cn ➡ 同じクライアント証明、鍵などを使用して複数のクライアント接続を許可
persist-key ➡
persist-tun ➡
log openvpn.log ➡ ログファイル名
log-append openvpn.log ➡ ログは追記方式
status openvpn-status.log ➡ ステータスファイル名
verb 3 ➡
keepalive 10 120 ➡ キープアライブの間隔と時間
4.サーバーのりスタート
server.conf の保存後、openvpn を再起動します。
# service openvpn restart
5.ファイヤウォールとフォワーディング
/etc/sysctl.conf の以下の行のコメントアウトを外します。
;net.ipv4.ip_forward = 1 ➡ net.ip4.ip_forward = 1
設定の反映のため、リスタートします。
# sysctl -p
次に、仮想ネットワークから実ネットワークへのマスカレードを設定します。
# iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
設定内容を保存します。
# iptables-save > /etc/iptables/my_tables
次に、IPv6を処理しない設定をします。
$ gksu gedit /etc/default/ufw
7行目の 「IPv6=yes」 を 「IPv6=no」に変更します。
下記の設定を ufw で行います。
# ufw default deny
# ufw allow in from 192.168.xxx.0/24 to 192.168.xxx.vvv ← xxx.vvvはOpenVPNサーバーのアドレス
# ufw allow out from 192.168.xxx.vvv to 192.168.xxx.0/24
# ufw allow in from any to 192.168.xxx.vvv port 443 proto udp ➡ dd-wrtでOpenVPNの場合、不要
# ufw allow in on tun0 from 10.8.0.0/24 to 10.8.0.0/24 port
5060:5070,10500:10550 proto udp
# ufw allow out on tun0 from 10.8.0.0/24 to 10.8.0.0/24 port
5060:5070,10500:10550 proto udp
# ufw allow in on tun0 from 10.8.0.0/24 to 192.168.xxx.vvv port
5060:5070,10500:10550 proto udp
# ufw allow out on tun0 from 192.168.xxx.vvv to 10.8.0.0/24 port
5060:5070,10500:10550 proto udp
# allow out from 192.168.xxx.vvv to any
ポート 5060~5070,10500~10550 は SIP/RTP を通すためです。
SIP サーバーがなければ設定不要です。
ufw のステータスで、設定を確認します。
# ufw status numbered
ufw の設定結果は /etc/ufw/user.rules に格納されています。
6.HGW(ホームゲートウェイ)の設定
外部からの443/udp宛のパケットをOpenVPNサーバーに向けるため、
静的マスカレードの設定。
宛先アドレス : 192.168.xxx.vvv
対象アドレス : 自分のWAN側アドレス
対象プロトコル : udp
宛先ポート :443
対象ポート :443
次に、内部とのパケットを openvpn をゲートウェイとして行うため、
静的IPルーティングの設定
宛先アドレス : 10.8.0.0/24
ゲートウェイ : 192.168.xxx.vvv
7.ログローテーションの設定
以下のファイルを新規に編集。
$ gksu gedit /logrotate.d/openvpn
/var/log/openvpn {
missingok
notifempty
sharedscripts
postrotate
/etc/init.d/openvpn restart 2 >&1 > /dev/null ll true
endscript
}
保存します。
8.クライアントの設定(以下は「OpenVPN クライアント」の場合、「OpenVpn for Android」は別のやり方)
sambaで共有したディレクトリに以下のファイルをコピーして、ファイル属性を解除しておく。
# cd /etc/openvpn/
# cp ca.* client* ta.key /home/share
# chmod 777 /home/share/*
これらのファイルを編集。
geditで新規に以下のファイルを作成。
tls-client
key-redirection 1
remote 12345678.dip.jp ← DDNSサービスに登録時のユーザー名
cipher AES-256-CBC
port 443
proto udp
<ca>
➡ ca.crtの BEGIN CERTIFICATE 〜〜 END CERTIFICATEをコピペ
</ca>
<cert>
➡ client.crtの BEGIN CERTIFICATE 〜〜 END CERTIFICATEをコピペ
</cert>
<key>
➡ client.keyの BEGIN CERTIFICATE 〜〜 END CERTIFICATEをコピペ
</key>
<tls-auth>
➡ ta.keyの BEGIN OpenVPN Static key V1 〜〜 END OpenVPN Static key V1をコピペ
</tls-auth>
編集したら、client.ovpn というファイル名で保存。
9.端末の設定
Macからsambaで接続して、「client.ovpn」を取り出し、Google Drive にコピペ。
端末で Google Drive を開き、このファイルをダウンロードします。
Google Drive 上のこのファイルはコピペ後にセキュリティ上、念のために削除しておきます。
端末で OpenVPN クライアントを起動し、このファイルをインポートします。
WiFi を切断してモバイル LTE にして、パスワード:abcdefgh を設定し、connect でサーバーとの接続を確認してOK。
10.Androidでの接続時
xx:xx GDG:SIOCGIFADDR(lo) failed
というエラーがでるが、これはlo がMACアドレスを持たないことからエラーになっています。
Androidのバグっぽい。
実際は無視してかまいません。
0 件のコメント:
コメントを投稿