linux@VPN構築
はじめに
在宅勤務になってから、ほぼ外出することが無くなり、外出先から自宅ネットワークに繋ぐことも無くなっていた。久しぶりに繋いでみたら、繋がらない。どうやら使っていたDDNSサービス(ieserver)が終了したらしく、他にも色々と理由があってダメだったので、見直すことにした。
ネットワーク構成は下記の通り。
VPN serverは、Debian GNU/Linux 9 (stretch)
VPNClientは、WindowsだったりAndroidだったり。
ドメイン名設定
私の自宅インターネット接続環境は固定IPアドレスではなく、再接続なんかの度にコロコロIPアドレスが変わるので、外出先からはvpn.mochi.cоm(仮)みたいなドメイン名を使ったアクセスをできるようにする必要がある。
これは、どこかのDDNSサービスを使ってドメイン名を取得し、自宅サーバから定期的に自分のグローバルIPアドレスを更新してあげることで実現できる。
DDNSサービスの選択
今回、適当に検索して色々出てくるなか、下記サービスを使うことにした。
簡単に説明すると、
- 無料
- ホスト名:アカウント名.f5.si ※siはスロベニアらしい
- Aレコード設定可
- AAAAレコード設定可
- TXTレコード設定可
こんな素晴らしいサービスを無料で提供して頂けることに感謝。
そして、もともと使っていたieserver並みにシンプルに使える。
crondでIPを自動更新する
自宅のIPアドレスはインターネット再接続の度に変わってしまい、その都度手動でDDNSサービスに再登録するのは面倒な上に、外出先からはIPアドレスが判らず再登録できないので、VPNサーバを使って自動的にIPをDDNSサービスに再登録する様にする。
- crontabを開く
crontab -e
- 10分毎に実行するコマンドを追加する
0,10,20,30,40,50 * * * * wget -O DDNSNow_update.log "https://f5.si/update.php?domain=ユーザ名&password=パスワード"
パスワードはAPIトークンでもOK。というかAPIトークンがいいかな。
この設定だと、ログ(DDNSNow_update.log)はホームディレクトリに吐かれる。
PPPoE接続設定
以前の私のインターネットはPPPoE接続だったのだが、FTTHなのに通信速度が遅く、在宅勤務となった際に安定したビデオ会議が出来なかったため、IPoE・IPv4 over IPv6接続に切り替えていた。
ただし、この接続はIKEv2のVPNで使用する500番や4500番などの特定ポートが使用できないため、ここでも外出先からVPN接続できない要因となっていた。
これまでの環境は維持しながらVPN接続できるようにもしたいため、ルータでIPoE接続しつつPPPoEパススルーさせ、VPNサーバから直接PPPoE接続させることで、通常のインターネット通信は高速のまま外部からのVPN接続を可能にさせる。
(これは通信事業者・プロバイダによって出来たり出来なかったりするかも)
基本的なファイアウォール設定
VPNサーバもグローバルIPアドレスを獲得したわけなので、直接攻撃されることができて超危険。ファイアウォールを設定する。
- ufw(ファイアウォール)インストール
sudo apt-get install ufw
- 全アクセスの拒否
sudo ufw default deny
- ローカルLAN(192.168.1.*)からの全アクセスを全許可
sudo ufw allow in from 192.168.1.0/24
- ファイアウォール有効化
sudo ufw enable
- ログレベルの設定
お好みで。フラッシュメモリを温存したいので、ログを無効にする。
sudo ufw logging off
出したい場合はoffをonに、またはlowに。
pppoeconf設定
- pppoeconfインストール
sudo apt-get install pppoeconf
- 接続設定
pppoeconf
色々質問されるが、大体は「はい」を選択すれば問題ない。
PPPoE接続
pon dsl-provider
接続状況確認
ip address show
(参考)PPPoE切断
poff dsl-provider
VPNサーバ構築
認証方式の選択
VPNのサーバ/ユーザ認証方式は、相互に証明書を使った認証(EAP-TLS)にする。
下記のような鍵構成にする。
ユーザ証明書とサーバ証明書は、オレオレ認証局の個人鍵によって署名し、オレオレ認証局の公開鍵(ルート証明書)によって正しさを検証することができる。
VPN接続時、VPNサーバはクライアントにサーバ証明書を送信し、クライアントは事前配布済のルート証明書を使ってサーバを認証する。同様にクライアントはVPNサーバにクライアント証明書を送信し、ルート証明書を使ってクライアントを認証する。
(なお、VPNサーバにクライアント証明書を事前登録しておく理由は、失効済証明書で認証を防ぐため)
VPNサーバ設定
StrongSwanを使ってlinux上にVPNサーバを構築する。
StrongSwanインストール
sudo apt-get install strongswan
ipsecを設定する
/etc/ipsec.confを修正し、VPN構成を設定する。
conn ikev2-vpn
# 基本設定
auto=add
keyingtries=1
keyexchange=ikev2
# VPNサーバ設定
left=%any
leftsubnet=0.0.0.0/0
leftcert=server-cert.pem
leftid=vpn.mochi.com
leftsendcert=always
# VPNクライアント設定
right=%any
rightauth=eap-tls
rightcert=mochi-cert.pem
rightca="CN=vpn.mochi.com"
rightid=mochi
rightsourceip=192.168.1.192/26
rightdns=8.8.8.8,8.8.4.4
# VPNクライアント生存確認設定
dpddelay=60s
dpdtimeout=20s
dpdaction=clear
項目 | 説明 |
---|---|
auto | connのロード方法と接続タイミング。「add」は、ロードだけで接続しない(サーバ設定なので接続も何もない)設定 |
keyingtries | 接続試行回数 |
keyexchange | 鍵交換方法 |
left | VPNサーバのローカルIPアドレス |
leftcert | VPNサーバ証明書のパス(絶対パスまたは/etc/ipsec.d/certsからの相対パス) |
leftid | VPNサーバ証明書のsubject(公開鍵の発行者)の識別名 |
leftsendcert | VPNサーバ証明書をVPNクライアントに渡す方法 |
right | VPNクライアント側のエンドポイントIPアドレス |
rightauth | VPNクライアントの認証方法 |
rightcert | VPNクライアント証明書のパス(絶対パスまたは/etc/ipsec.d/certsからの相対パス) |
rightca | VPNクライアント証明書の検証に使用する認証局のDN(Distingished Name)。(/etc/ipsec.d/cacertsの中から該当するDNのルート証明書を使って検証される) |
rightsourceip | VPNクライアントに割り当てるIPアドレスの範囲 |
rightdns | VPNクライアントに伝えるDNSアドレス |
dpddelay | 通信の生存確認間隔(デフォルトは30s) |
dpdtimeout | 生存確認応答待ちタイムアウト(デフォルトは150s) |
dpdaction | 生存確認できなかった場合のアクション。clearは接続終了を意味する。 |
ユーザ認証情報を設定する
サーバの秘密鍵もここに設定しておく。
/etc/ipsec.secretsを修正する
: RSA "server-key.pem"
鍵・証明書作成
作業ディレクトリ作成
下記の通り作業ディレクトリを作成して、そのディレクトリ内で作成する。
mkdir ~/pki
mkdir ~/pki/cacerts
mkdir ~/pki/certs
mkdir ~/pki/private
chmod go-rwx ~/pki/private
ディレクトリ | 概要 |
---|---|
cacerts | ルート証明書を格納 |
certs | 証明書を格納 |
private | 個人鍵(秘密鍵)を格納 |
オレオレ認証局の個人鍵・証明書作成
- オレオレ認証局の個人鍵を作成する
pki --gen --type rsa --size 4096 --outform pem > ~/pki/private/ca-key.pem
- オレオレ認証局の公開鍵証明書(ルート証明書)を作成する
pki --self --ca --lifetime 3650 --in ~/pki/private/ca-key.pem --type rsa --dn "CN=ca.mochi.com" --outform pem > ~/pki/cacerts/ca-cert.pem
※CNの値は適切に変更すること。
VPNサーバの個人鍵・証明書作成
- サーバの個人鍵を作成する
pki --gen --type rsa --size 4096 --outform pem > ~/pki/private/server-key.pem
- サーバの公開鍵証明書(サーバ証明書)を作る
pki --pub --in ~/pki/private/server-key.pem --type rsa | pki --issue --lifetime 1825 --cacert ~/pki/cacerts/ca-cert.pem --cakey ~/pki/private/ca-key.pem --dn "CN=vpn.mochi.com" --san vpn.mochi.com --flag serverAuth --flag ikeIntermediate --outform pem > ~/pki/certs/server-cert.pem
※CNと-sanの値はDDNSサービスで取得したドメイン名に変更すること。
クライアントの個人鍵・証明書作成
- クライアントの個人鍵を作成する
pki --gen --type rsa --size 4096 --outform pem > ~/pki/private/mochi-key.pem
- クライアントの公開鍵証明書(クライアント証明書)を作る
pki --pub --in ~/pki/private/mochi-key.pem --type rsa | pki --issue --lifetime 1825 --cacert ~/pki/cacerts/ca-cert.pem --cakey ~/pki/private/ca-key.pem --dn "CN=mochi" --san mochi --outform pem > ~/pki/certs/mochi-cert.pem
※ファイル名は適切に変更すること。
※CNと-sanの値は適切に変更すること。
- pkcs12(pfx)形式に証明書を変換
openssl pkcs12 -export -inkey ~/pki/private/mochi-key.pem -in ~/pki/certs/mochi-cert.pem -certfile ~/pki/cacerts/ca-cert.pem -caname "ca.mochi.com" -name "mochi" -out ~/mochi.p12
これは、クライアント側で証明書をインストールする際に使用する。
作業ディレクトリコピー
/etc/ipsec.dに作業ディレクトリ内容をそのままコピーする
sudo cp -r ~/pki/* /etc/ipsec.d/
IPsec再起動
sudo ipsec restart
VPN用ファイアウォール設定
IKEv2の鍵交換でUDP500番と4500番を使用するため、下記を用いてそのポートを解放する。
sudo ufw allow 500,4500/udp
コメント
コメントを投稿