VyOSによるOpenVPN環境の構築
顔本には画像付きで出しましたが、最近買ったiPadから自宅Windowsを操作できるようにしました。
わーい
というわけで、備忘録的にその時やったこととかをメモっとく。
構成は以下のような感じ。
NICを共有したwindows 10マシン上のVyOS VMに対して、任意の回線からOpenVPNを張ってiPadに10.0.0.2/24のIPを振り、NATして192.168.0.0/24のNWにアクセスさせ、192.168.0.2にいるwindows 10(VyOSをホストしてるwin)に戻している感じ。
なんで一度192.168.0.0/24に出しているかというと、将来的にはVMをホスティングしているWindowsではなく別のPCに対してRDPする予定だから。
それなら受け口のひかり電話ルーターでVPNすれば良いように見えるけど、それだと443ポートを使えず、80/443しか外に出させないWifiを使えなくなってしまう(のと、色々configしたかった)ので、こんな感じ。
あと欲を出してTLSの事前共有鍵も使っている。これが無いとDOSとかオーバーフローとかでいたずらされるらしい?
OpenVPN TLS-Auth とは?
ハマりどころはクライアント(ovpnファイル)とサーバ側の設定の差。
アルゴリズムとハッシュを設定する場合は以下のようになる。
VyOS
set interfaces openvpn vtun0 encryption aes256 set interfaces openvpn vtun0 hash sha512
ovpnファイル
cipher AES-256-CBC auth sha512
またTLS事前共有鍵は以下の通り。
VyOS
set interfaces openvpn vtun0 openvpn-option '--tls-auth /config/auth/ovpn/ta.key 0'
ovpnファイル(winのOVPNの場合)
tls-auth [inline] 1 ... <tls-auth> </tls-auth>
ovpnファイル(iPadのOVPNの場合)
key-direction 1 ... <tls-auth> </tls-auth>
他の、例えば<ca>とかだと[inline]記法を使うとダメなのに対して、winだと<tls-auth>は[inline]記法を使わないとダメ。
また、iPadの場合はkey-direction 1という新パラメータをくっつけなきゃダメ。(winでも有効なのでむしろこっちのほうが良いけど、統一感あるのは[inline]の気がする)
鍵情報だけじゃなくdirectionパラメータも必要なのでこの設定方法になっているみたい。なおiPadでinlineがサポートされてない理由はよくわからない……。(歴史的経緯?)
ファイルを別に用意する場合は素直にファイル名で指定すればいいんだけど、ovpnファイル一つにまとめようとした結果死ぬほどハマった。
エラーメッセージが不親切すぎるねん……。
以下のようなエラーが出たらauthかcryptかtls-authのどれかが間違っている。(winでのテスト結果)
Fri May 11 00:15:31 2018 TCP connection established with [AF_INET]192.168.0.3:443 Fri May 11 00:15:31 2018 TCP_CLIENT link local: (not bound) Fri May 11 00:15:31 2018 TCP_CLIENT link remote: [AF_INET]192.168.0.3:443 Fri May 11 00:15:31 2018 MANAGEMENT: >STATE:1525965331,WAIT,,,,,, Fri May 11 00:15:31 2018 Connection reset, restarting [0] Fri May 11 00:15:31 2018 TCP/UDP: Closing socket
なお一応VyOS上からは/var/log/messageを見ればざっくりとしたログが見える。
grep openvpn /var/log/message
May 10 15:16:25 vyos openvpn-vtun0[6015]: XX.XX.XX.XX:62855 TLS: Initial packet from [AF_INET]XX.XX.XX.XX:62855, sid=4d06b0ed 7c24ca86 May 10 15:16:25 vyos openvpn-vtun0[6015]: XX.XX.XX.XX:62855 TLS Error: cannot locate HMAC in incoming packet from [AF_INET]XX.XX.XX.XX:62855 May 10 15:16:25 vyos openvpn-vtun0[6015]: XX.XX.XX.XX:62855 Fatal TLS error (check_tls_errors_co), restarting May 10 15:16:25 vyos openvpn-vtun0[6015]: XX.XX.XX.XX:62855 SIGUSR1[soft,tls-error] received, client-instance restarting
さて本題。
細かい説明は参考サイトに任せて、VyOSのconfigを貼る。
interfaces { ethernet eth0 { address 192.168.0.3/24 duplex auto hw-id XX:XX:XX:XX:XX:XX smp_affinity auto speed auto } loopback lo { } openvpn vtun0 { encryption aes256 hash sha512 local-port 443 mode server openvpn-option "--push route 192.168.0.0 255.255.255.0 --push dhcp-option DNS 192.168.0.1 --push redirect-gateway def1" openvpn-option "--tls-auth /config/auth/ovpn/ta.key 0" protocol tcp-passive server { client client1 { ip 10.0.0.2 } subnet 10.0.0.0/24 } tls { ca-cert-file /config/auth/ovpn/ca.crt cert-file /config/auth/ovpn/server.crt dh-file /config/auth/ovpn/dh.pem key-file /config/auth/ovpn/server.key } } } nat { source { rule 1 { outbound-interface eth0 source { address 10.0.0.0/24 } translation { address masquerade } } } }
iPadに埋め込んだOpenVPN用のconfigファイル[client.ovpn]はこんな感じ。
割と余計な設定が残っているけど(゚ε゚)キニシナイ!!
client remote vpn.urische.me port 443 proto tcp-client dev tun persist-tun persist-key resolv-retry infinite ping 10 verb 4 mute 10 cipher AES-256-CBC tls-auth [inline] 1 auth SHA512 key-direction 1 <ca> CA証明書 ca.crtの中身 </ca> <cert> クライアント証明書 client.crtの中身 </cert> <key> クライアント証明書の秘密鍵 client.keyの中身 </key> <tls-auth> TLS事前共有鍵 ta.keyの中身 </tls-auth>
VyOSの設定は、下のようなコマンドで設定。
configure set interfaces openvpn vtun0 encryption 'aes256' set interfaces openvpn vtun0 hash 'sha512' set interfaces openvpn vtun0 local-port '443' set interfaces openvpn vtun0 mode 'server' set interfaces openvpn vtun0 openvpn-option '--push route 192.168.0.0 255.255.255.0 --push dhcp-option DNS 192.168.0.1 --push redirect-gateway def1' set interfaces openvpn vtun0 openvpn-option '--tls-auth /config/auth/ovpn/ta.key 0' set interfaces openvpn vtun0 protocol 'tcp-passive' set interfaces openvpn vtun0 server client client1 ip '10.0.0.2' set interfaces openvpn vtun0 server subnet '10.0.0.0/24' set interfaces openvpn vtun0 tls ca-cert-file '/config/auth/ovpn/ca.crt' set interfaces openvpn vtun0 tls cert-file '/config/auth/ovpn/server.crt' set interfaces openvpn vtun0 tls dh-file '/config/auth/ovpn/dh.pem' set interfaces openvpn vtun0 tls key-file '/config/auth/ovpn/server.key' set nat source rule 1 outbound-interface 'eth0' set nat source rule 1 source address '10.0.0.0/24' set nat source rule 1 translation address 'masquerade'
OpenVPN関連個所のみ抜粋。
上のset interfaceでOpenVPNのvtun0に関する設定を行い、下のnatでNATの設定をしている。
もっと細かい、OpenVPNの準備の仕方とかeth0へのIP割り当てとかは参考サイトを参照。
なお、証明書関連のデータはCentOSで既に作っていたのでそれを流用している。
作り方はこちらを参照。
VPNサーバー構築(OpenVPN) - CentOSで自宅サーバー構築
余談ながら、超絶便利なことに以下のコマンドを実行すると何と現在のconfigをコマンドに落としてくれる。
/opt/vyatta/sbin/vyatta-config-gen-sets.pl /config/config.boot
参考にしたサイト:
qiita.com