tinc で Window 10 -> CentOS 7 な VPN を作る

tinc は Windows 10 でも使えるので、Window 10 -> CentOS 7 な VPN を試してみました。Window 側の作業は基本的に管理者として実行された cmd.exe で行っています。

サーバの設定

前回作業した CentOS 7 -> CentOS 7 な VPN のサーバ設定は基本的にそのままです。

Windows の設定

tinc は Chocolatey でサクッと入れられます。

choco install tinc

C:\Program Files (x86)\tinc\my_vpn の中に以下のファイルを作成します。基本的に CentOS 7 でやったときと大差ないですが tinc.conf では Device ではなく Interface で、後で作成する仮想デバイスの名前を指定します。なぜか Device の場合はデバイスの CLSID を指定する必要がありました。

tinc.conf

Name = laptop
Interface = tinc
ConnectTo = server

hosts/server

サーバの /etc/tinc/my_vpn/hosts/server を貼り付けます。

hosts/laptop

Subnet = 192.168.255.3/32

次に、認証用の RSA 鍵を作成するために C:\Program Files (x86)\tinc で以下を実行します。

cd "C:\Program Files (x86)\tinc"
tincd -n my_vpn -K4096

C:\Program Files (x86)\tinc\my_vpn\hosts/laptop に公開鍵が追記されているので、サーバにコピーします。

type "my_vpn\hosts\laptop"

Windows で仮想アダプタを準備

Linux の TUN デバイスに代わる仮想アダプタが必要です。

C:\Program Files (x86)\tinc\tap-win64\addtap.bat を実行します。

cd "C:\Program Files (x86)\tinc\tap-win64"
addtap.bat

新たに作成されたインタフェースの名前とアドレスを設定します。

netsh interface ipv4 show interfaces
netsh interface set interface name = "イーサネット 5" newname = "tinc"
netsh interface ip set address "tinc" static 192.168.255.3 255.255.255.0

VPN の開始

サーバで tinc を開始します。

systemctl start tinc@my_vpn.service
systemctl status tinc@my_vpn.service
systemctl enable tinc@my_vpn.service

Windows で tincd をフォアグラウンドでお試し実行します。

cd "C:\Program Files (x86)\tinc"
tincd -n my_vpn -D -d3

問題無さそうなら Ctrl+C で止めてサービスとしてインストールして開始します。

cd "C:\Program Files (x86)\tinc"
tincd -n my_vpn

サービスの停止や開始は次のようにコマンドラインからできます(GUI でもできますが)

sc stop tinc.my_vpn
sc start tinc.my_vpn

相互に ping が通れば成功です。

ping -n 192.168.255.1
ping -n 192.168.255.3

サーバで NAT して VPN 経由で外に出る

サーバの設定は CentOS 7 -> CentOS 7 な VPN と特に変わりありません。

  • /etc/tinc/my_vpn/hosts/serverSubnet = 0.0.0.0/0 を追記
  • firewalld を入れて external にして 655 ポートを許可
  • /etc/tinc/my_vpn/tinc-up/etc/tinc/my_vpn/tinc-down を作る
  • 以上のことを行ってサービスをリスタートしておく

クライアント側は、まずサーバのホスト設定ファイルで Subnet = 0.0.0.0/0 を追加します。

cd "C:\Program Files (x86)\tinc"
notepad.exe "my_vpn\hosts\server"
Address = 203.0.113.100
Subnet = 192.168.255.0/24
Subnet = 0.0.0.0/0

-----BEGIN RSA PUBLIC KEY-----
...
-----END RSA PUBLIC KEY-----

サービスを再起動します。

sc stop tinc.my_vpn
sc start tinc.my_vpn

ルーティングを設定します。まずはサーバへのルートを現在のデフォルトルートに向けます。前回 CentOS -> CentOS でやったときはこれ忘れてました。サーバとクライアントが同じサブネットだったのでなくても大丈夫でしたけど。普通はそうじゃないので必要です。

203.0.113.100 がサーバのアドレスで、192.168.0.1 クライアントのデフォルトゲートウェイです。適宜読み替えが必要です。

route ADD 203.0.113.100/32 192.168.0.1

次にデフォルトルートを VPN のサーバ側アドレスに変えます。

route CHANGE 0.0.0.0/0 192.168.255.1

サーバで tcpdump とかして VPN 経由でクライアントからのトラフィックが流れているのを確認できれば成功です。

終わったら元に戻しておきます。

route CHANGE 0.0.0.0/0 192.168.0.1
route DELETE 203.0.113.100/32

接続時に自動でルーティング設定

いちおう↑の内容でバッチファイルを作ればサーバと接続したときに自動でルーティング設定とかはできますけど・・・

cd "C:\Program Files (x86)\tinc"
notepad.exe "my_vpn\hosts\server-up.bat"
route ADD 203.0.113.100/32 192.168.0.1
route CHANGE 0.0.0.0/0 192.168.255.1
notepad.exe "my_vpn\hosts\server-down.bat"
route CHANGE 0.0.0.0/0 192.168.0.1
route DELETE 203.0.113.100/32

んで、サービスをリスタート。

sc stop tinc.my_vpn
sc start tinc.my_vpn

デフォルトゲートウェイをベタ書きにするとラップトップとかで使い物にならないし、かといって Windows の route コマンドとバッチファイルでそのへんい感じにやるのはつらい。

デフォルトゲートウェイは変えずに VPN の先にあるプライベートなサブネットだけ設定するとかならまだ楽なんですけど・・・

route ADD 8.0.0.0/8 192.168.255.1
route DELETE 8.0.0.0/8

Windows からサービスやデバイスを削除

次のようにサービスやデバイスは削除できます。

sc stop tinc.my_vpn
sc delete tinc.my_vpn

cd "C:\Program Files (x86)\tinc\tap-win64"
deltapall.bat