妄想まとめ

研究とかWebセキュとか時事ネタとか。 @kazu1130_h

VyOSによるOpenVPN環境の構築

顔本には画像付きで出しましたが、最近買ったiPadから自宅Windowsを操作できるようにしました。
わーい


というわけで、備忘録的にその時やったこととかをメモっとく。


構成は以下のような感じ。
f:id:kazu1130_h:20180510222024p:plain


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

qiita.com