序章

Tinc は、オープンソースの Virtual Private Network (VPN)デーモンであり、暗号化、オプションの圧縮、自動メッシュルーティングなどの便利な機能を備えており、VPNトラフィックをサーバー間で直接ルーティングできます。 これらの機能は、tincを他のVPNソリューションと区別し、地理的に分散した多くの小規模なネットワークからVPNを作成するのに適しています。

このチュートリアルでは、tincを使用して、サーバーがローカルネットワーク上にあるかのように通信できる安全なVPNを作成する方法について説明します。 また、tincを使用してプライベートネットワークへの安全なトンネルを設定する方法についても説明します。 Ubuntu 18.04サーバーを使用しますが、構成は他のOSでの使用に適合させることができます。

目標

複数のユースケースをカバーするために、このチュートリアルでは、プライベートネットワークインターフェイスを介して1つのクライアントノードをVPNに接続し、パブリックネットワークインターフェイスを介して別のクライアントノードをVPNに接続する方法の概要を説明します。 ただし、この設定を自分のニーズに合わせて調整することはできます。 サーバーが相互にアクセスする方法を計画し、このチュートリアルで示した例を自分のニーズに適合させる必要があります。 これを独自の設定に適合させる場合は、例で強調表示されている値を独自の値に置き換えてください。 ただし、これらの手順を変更する前に、関連するコンポーネントとプロセスを確実に理解するために書かれているチュートリアルに従うことは、あなたの興味を引くかもしれません。

物事を明確にするために、このチュートリアルでは次のようなサーバーを参照します。

  • server-01 :すべてのVPNノードがこのマシンに接続します。適切なVPN機能を実現するには、接続を維持する必要があります。 必要に応じて、これと同じ方法で追加のサーバーを構成して、冗長性を提供できます。
  • client-01 privateネットワークインターフェースを使用してserver-01VPNノードに接続します
  • client-02 publicネットワークインターフェースを介してserver-01VPNノードに接続します

:Tinc自体は、サーバー(VPNサービスをホストおよび提供するマシン)とクライアント(安全なプライベートネットワークに接続して使用するマシン)を区別しませんが、理解して視覚化するのに役立ちます。このようにサーバーを考えることで、tincがどのように機能するか。

設定するVPNの図は次のとおりです。

青いボックスはVPNを表し、ピンクは基盤となるプライベートネットワークを表します。 client-02 がプライベートネットワークにアクセスできない場合でも、3つのサーバーすべてがVPNで通信できます。

前提条件

このチュートリアルを正確に実行したい場合は、同じデータセンターに2台のUbuntu 18.04サーバー(server-01client-01)をプロビジョニングし、プライベートネットワークを有効にしますそれぞれの。 次に、別のデータセンターに別のUbuntu 18.04サーバー( client-02 )を作成します。 各サーバーには、管理ユーザーとファイアウォールを構成する必要があります ufw. これを設定するには、Ubuntu18.04初期サーバー設定ガイドに従ってください。

さらに、このチュートリアルの後半では、を使用して各マシン間でいくつかのファイルを転送する必要があります scp. このため、各サーバーでSSHキーを生成し、両方 client-01client-02のSSHキーをに追加する必要があります。 server-01authorized_keys ファイルを作成し、server-01のSSHキーをclient-01client-02の両方に追加します。 authorized_keys ファイル。 これを設定するためのヘルプについては、 Ubuntu18.04でSSHキーを設定する方法に関するガイドを参照してください。

ステップ1—Tincのインストール

TincはデフォルトのUbuntuAPTリポジトリから入手できます。つまり、いくつかのコマンドでインストールできます。

最近行っていない場合は、各サーバーで次のコマンドを実行して、それぞれのパッケージインデックスを更新します。

すべてのサーバー
  1. sudo apt update

次に、次のコマンドを実行して、各サーバーにtincをインストールします。

すべてのサーバー
  1. sudo apt install tinc

これで、各サーバーにtincをインストールしました。 ただし、VPNを稼働させるには、各マシンでtincの構成にいくつかの変更を加える必要があります。 server-01の更新から始めましょう。

ステップ2—Tincサーバーの構成

Tincでは、VPNの一部となるすべてのマシンに、次の3つの構成コンポーネントが必要です。

  • Tinc構成ファイル:tincデーモンを構成する3つの異なるファイルがあります。
    • tinc.conf、ネット名、VPNが実行されるネットワークデバイス、およびその他のVPNオプションを定義します。
    • tinc-up、で定義されたネットワークデバイスをアクティブ化するスクリプト tinc.conf ティンクが開始された後;
    • tinc-down、tincが停止するたびにネットワークデバイスを非アクティブ化します。
  • 公開鍵と秘密鍵のペア:Tincは公開鍵と秘密鍵のペアを使用して、有効な鍵を持つユーザーのみがVPNにアクセスできるようにします。
  • ホスト構成ファイル:VPN上の各マシン(またはホスト)には、ホストの実際のIPアドレスとtincがサービスを提供するサブネットを保持する独自の構成ファイルがあります。

Tincは、 netname を使用して、あるTincVPNを別のVPNと区別します。 これは、複数のVPNを設定する場合に役立ちますが、1つのVPNのみを構成することを計画している場合でも、ネット名を使用することをお勧めします。 VPNには任意のネット名を付けることができますが、簡単にするためにVPNと呼びます。 netname.

server-01 で、VPNの構成ディレクトリ構造を作成します。

server-01
  1. sudo mkdir -p /etc/tinc/netname/hosts

お好みのテキストエディタを使用して、 tinc.conf ファイル。 ここでは、 nano:

server-01
  1. sudo nano /etc/tinc/netname/tinc.conf

空のファイルに次の行を追加します。 これらは、という名前のtincノードを構成します server_01 と呼ばれるネットワークインターフェースで tun0 IPv4を使用します:

server-01:/etc/tinc/netname/tinc.conf
Name = server_01
AddressFamily = ipv4
Interface = tun0

警告:後の値がどのようになっているのかに注意してください Name ディレクティブにはアンダースコアが含まれます(_)ハイフンではなく(-). ティンクはそれを必要とするので、これは重要です Name 値には、英数字またはアンダースコア文字のみが含まれます。 ここでハイフンを使用すると、このガイドの後半でVPNを開始しようとしたときにエラーが発生します。

これらの行を追加したら、ファイルを保存して閉じます。 使用した場合 nano、を押してそうします CTRL+X, Y、 それから ENTER.

次に、という名前のホスト構成ファイルを作成します server_01 の中に hosts サブディレクトリ。 最終的に、クライアントノードはこのファイルを使用してserver-01と通信します。

server-01
  1. sudo nano /etc/tinc/netname/hosts/server_01

繰り返しになりますが、このファイルの名前にはハイフンではなくアンダースコアが含まれていることに注意してください。 このように、それは Name のディレクティブ tinc.conf 後で生成するときに、tincがサーバーの公開RSAキーをこのファイルに自動的に追加できるようにするファイル。

次の行をファイルに追加し、server-01のパブリックIPアドレスが含まれていることを確認します。

server-01:/ etc / tinc / netname / hosts / server_01
Address = server-01_public_IP_address
Subnet = 10.0.0.1/32

The Address フィールドは、他のノードがこのサーバーに接続する方法を指定し、 Subnet このデーモンがサービスを提供するサブネットを指定します。 ファイルを保存して閉じます。

次に、次のコマンドを使用して、このホストの公開RSAキーと秘密RSAキーのペアを生成します。

server-01
  1. sudo tincd -n netname -K4096

このコマンドを実行すると、tincが公開RSAキーと秘密RSAキーを保存するファイル名を入力するように求められます。

Output
. . . Please enter a file to save private RSA key to [/etc/tinc/netname/rsa_key.priv]: Please enter a file to save public RSA key to [/etc/tinc/netname/hosts/server_01]:

プレス ENTER 各プロンプトでデフォルトの場所を受け入れる。 そうすることで、tincに秘密鍵をという名前のファイルに保存するように指示します rsa_key.priv 公開鍵をに追加します server_01 ホスト構成ファイル。

次に、作成します tinc-up、いつでも実行されるスクリプト netname VPNが開始されました:

server-01
  1. sudo nano /etc/tinc/netname/tinc-up

次の行を追加します。

server-01:/ etc / tinc / netname / tinc-up
#!/bin/sh
ip link set $INTERFACE up
ip addr add 10.0.0.1/32 dev $INTERFACE
ip route add 10.0.0.0/24 dev $INTERFACE

これらの各行の機能は次のとおりです。

  • ip link …:tincの仮想ネットワークインターフェイスのステータスを次のように設定します up
  • ip addr …:IPアドレスを追加します 10.0.0.1 のネットマスク付き 32 tincの仮想ネットワークインターフェイスに接続します。これにより、VPN上の他のマシンはserver-01のIPアドレスを次のように認識します。 10.0.0.1
  • ip route …:ルートを追加します(10.0.0.0/24)tincの仮想ネットワークインターフェイスで到達できます

これらの行を追加したら、ファイルを保存して閉じます。

次に、VPNが停止したときに仮想ネットワークインターフェイスを削除するスクリプトを作成します。

server-01
  1. sudo nano /etc/tinc/netname/tinc-down

次の行を追加します。

server-01:/ etc / tinc / netname / tinc-down
#!/bin/sh
ip route del 10.0.0.0/24 dev $INTERFACE
ip addr del 10.0.0.1/32 dev $INTERFACE
ip link set $INTERFACE down

これらの線は、 tinc-up 脚本:

  • ip route …:を削除します 10.0.0.0/24 ルート
  • ip addr …:IPアドレスを削除します 10.0.0.1 tincの仮想ネットワークインターフェイスから
  • ip link …:tincの仮想ネットワークインターフェイスのステータスを次のように設定します down

ファイルを保存して閉じてから、次の新しいネットワークスクリプトの両方を実行可能にします。

server-01
  1. sudo chmod 755 /etc/tinc/netname/tinc-*

server-01 を構成する最後のステップとして、ポートを通過するトラフィックを許可するファイアウォールルールを追加します 655、tincのデフォルトポート:

server-01
  1. sudo ufw allow 655

server-01 が完全に構成され、クライアントノードのセットアップに進むことができます。

ステップ3—クライアントノードの構成

プロセスは一般的に非常に似ていますが、両方のクライアントマシンはサーバーとはわずかに異なる構成を必要とします。

このガイドで目的としているセットアップのため、client-01client-02をほぼ同じように構成しますが、わずかな違いがあります。 したがって、この手順で指定するコマンドの多くは、両方のマシンで実行する必要があります。 ただし、client-01またはclient-02で特定のコマンドまたは特別な構成が必要な場合、それらの命令はそれぞれ青または赤のコマンドブロックで表示されることに注意してください。

client-01とclient-02の両方で、server-01で作成したディレクトリ構造を複製します。

client-01&client-02
  1. sudo mkdir -p /etc/tinc/netname/hosts

次に、を作成します tinc.conf ファイル:

client-01&client-02
  1. sudo nano /etc/tinc/netname/tinc.conf

両方のマシンのファイルに次の行を追加します。

client-01&client-02 /etc/tinc/netname/tinc.conf
Name = node_name
AddressFamily = ipv4
Interface = tun0
ConnectTo = server_01

必ず代用してください node_name それぞれのクライアントノードの名前で。 繰り返しますが、この名前がアンダースコアを使用していることを確認してください(_)ハイフンではなく。

このファイルには ConnectTo を指すディレクティブ server_01server-01tinc.conf ファイルにこのディレクティブが含まれていませんでした。 含まないことによって ConnectTo server-01 のステートメントは、server-01が着信接続のみをリッスンすることを意味します。 これは、他のマシンに接続しないため、セットアップで機能します。

ファイルを保存して閉じます。

次に、各クライアントノードにホスト構成ファイルを作成します。 繰り返しになりますが、ファイル名がハイフンではなくアンダースコアで綴られていることを確認してください。

client-01&client-02
  1. sudo nano /etc/tinc/netname/hosts/node_name

client-01 の場合、次の行を追加します。

client-01:/ etc / tinc / netname / hosts / client_01
Subnet = 10.0.0.2/32

client-02 の場合、次の行を追加します。

client-02:/ etc / tinc / netname / hosts / client_02
Subnet = 10.0.0.3/32

各クライアントには、tincがサービスを提供する異なるサブネットがあることに注意してください。 ファイルを保存して閉じます。

次に、各クライアントマシンでキーペアを生成します。

client-01&client-02
  1. sudo tincd -n netname -K4096

再びserver-01で行ったように、RSAキーを保存するファイルを選択するように求められたら、を押します。 ENTER デフォルトの選択を受け入れます。

その後、各クライアントでネットワークインターフェイス開始スクリプトを作成します。

client-01&client-02
  1. sudo nano /etc/tinc/netname/tinc-up

client-01 の場合、次の行を追加します。

client-01:/ etc / tinc / netname / tinc-up
#!/bin/sh
ip link set $INTERFACE up
ip addr add 10.0.0.2/32 dev $INTERFACE
ip route add 10.0.0.0/24 dev $INTERFACE

client-02 の場合、以下を追加します。

client-02:/ etc / tinc / netname / tinc-up
#!/bin/sh
ip link set $INTERFACE up
ip addr add 10.0.0.3/32 dev $INTERFACE
ip route add 10.0.0.0/24 dev $INTERFACE

各ファイルを保存して閉じます。

次に、各クライアントでネットワークインターフェイス停止スクリプトを作成します。

client-01&client-02
  1. sudo nano /etc/tinc/netname/tinc-down

client-01 で、次のコンテンツを空のファイルに追加します。

client-01:/ etc / tinc / netname / tinc-down
#!/bin/sh
ip route del 10.0.0.0/24 dev $INTERFACE
ip addr del 10.0.0.2/32 dev $INTERFACE
ip link set $INTERFACE down

client-02 に、以下を追加します。

client-02:/ etc / tinc / netname / tinc-down
#!/bin/sh
ip route del 10.0.0.0/24 dev $INTERFACE
ip addr del 10.0.0.3/32 dev $INTERFACE
ip link set $INTERFACE down

ファイルを保存して閉じます。

各クライアントマシンで次のコマンドを実行して、ネットワークスクリプトを実行可能にします。

client-01&client-02
  1. sudo chmod 755 /etc/tinc/netname/tinc-*

最後に、ポートを開きます 655 各クライアント

client-01&client-02
  1. sudo ufw allow 655

この時点で、クライアントノードはほぼセットアップされていますが、完全ではありません。 VPNへの接続を認証するために、前の手順でserver-01で作成した公開鍵が引き続き必要です。

ステップ4—キーの配布

別のノードと直接通信する各ノードは、ホスト構成ファイル内にある公開鍵を交換している必要があります。 この場合、server-01は他のノードと公開鍵を交換する必要があります。

server-01とclient-01の間のキーの交換

client-01 で、そのホスト構成ファイルをserver-01にコピーします。 client-01server-01の両方が同じデータセンターにあり、両方ともプライベートネットワークが有効になっているため、ここでserver01のプライベートIPアドレスを使用できます:

client-01
  1. scp /etc/tinc/netname/hosts/client_01 sammy@server-01_private_IP:/tmp

次に、 server-01 で、 client-01 ホスト構成ファイルを /etc/tinc/netname/hosts/ ディレクトリ:

server-01
  1. sudo cp /tmp/client_01 /etc/tinc/netname/hosts/

次に、 server-01 を使用したまま、そのホスト構成ファイルをclient-01にコピーします。

server-01
  1. scp /etc/tinc/netname/hosts/server_01 user@client-01_private_IP:/tmp

client-01 で、server-01のファイルを適切な場所にコピーします。

client-01
  1. sudo cp /tmp/server_01 /etc/tinc/netname/hosts/

client-01 で、server-01のホスト構成ファイルを編集して Address フィールドはserver-01のプライベートIPアドレスに設定されます。 このようにして、client-01はプライベートネットワーク経由でVPNに接続します。

client-01
  1. sudo nano /etc/tinc/netname/hosts/server_01

変更 Address server-01private IPアドレスを指すディレクティブ:

client-01:/ etc / tinc / netname / hosts / server_01
Address = server-01_private_IP
Subnet = 10.0.0.1/32

保存して終了します。 次に、残りのノードclient-02に移りましょう。

server-01とclient-02間のキーの交換

client-02 で、そのホスト構成ファイルをserver-01にコピーします。

client-02
  1. scp /etc/tinc/netname/hosts/client_02 sammy@server-01_public_IP:/tmp

次に、 server-01 で、 client_02 ホスト構成ファイルを適切な場所に配置します。

server-01
  1. sudo cp /tmp/client_02 /etc/tinc/netname/hosts/

次に、server-01のホスト構成ファイルをclient-02にコピーします。

server-01
  1. scp /etc/tinc/netname/hosts/server_01 user@client-02_public_IP:/tmp

client-02 で、server-01のファイルを適切な場所にコピーします。

client-02
  1. sudo cp /tmp/server_01 /etc/tinc/netname/hosts/

2つのクライアントノードのみを設定していると仮定すると、公開鍵の配布は完了です。 ただし、より大きなVPNを作成している場合は、これらの他のノード間でキーを交換する良い機会です。 2つのノードが(間に転送サーバーなしで)互いに直接通信する場合は、キー/ホスト構成ファイルを交換し、互いの実際のネットワークインターフェイスにアクセスできる必要があることに注意してください。 また、各ホストの構成ファイルをVPN内のすべてのノードにコピーするだけでも問題ありません。

ステップ5—構成をテストする

ノードで、 server-01 から始めて、次のコマンドでtincを起動します。

すべてのサーバー
  1. sudo tincd -n netname -D -d3

このコマンドには、 -n VPNのネット名を指すフラグ、 netname. これは、複数のVPNを設定していて、開始するVPNを指定する必要がある場合に便利です。 また、 -D フラグ。tincがフォークおよびデタッチするのを防ぎ、tincの自動再起動メカニズムを無効にします。 最後に、それは含まれています -d フラグ。これは、tincにデバッグモードで実行するように指示します。デバッグレベルは 3.

注: tincデーモンに関しては、デバッグレベルは 3 認証要求、キー交換、接続リストの更新など、任意の2つのサーバー間で交換されたすべての要求が表示されます。 デバッグレベルが高いほど、ネットワークトラフィックに関するより多くの情報が表示されますが、現時点では、ノードが相互に通信できるかどうかのみに関心があるため、 3 十分であろう。 ただし、実稼働シナリオでは、ディスクがログファイルでいっぱいにならないように、より低いデバッグレベルに変更する必要があります。

公式ドキュメントを確認すると、tincのデバッグレベルについて詳しく知ることができます。

各ノードでデーモンを起動すると、server-01に接続するときに各ノードの名前が出力されます。 それでは、VPNを介した接続をテストしてみましょう。

別のウィンドウで、 client-02 で、client-01のVPNIPアドレスにpingを実行します。 これを 10.0.0.2、 ついさっき:

client-02
  1. ping 10.0.0.2

pingは正しく機能し、VPNでの接続に関するデバッグ出力が他のウィンドウに表示されるはずです。 これは、client-02server-01からclient-01を介してVPN経由で通信できることを示しています。 プレス CTRL+C pingを終了します。

VPNインターフェースを使用して、アプリケーション接続、ファイルのコピー、SSHなどの他のネットワーク通信を行うこともできます。

各tincデーモンのデバッグウィンドウで、を押してデーモンを終了します CTRL+\.

ステップ6—起動時に起動するようにTincを構成する

Ubuntuサーバーは systemd プロセスの開始と実行を制御するデフォルトのシステムマネージャとして。 このため、有効にすることができます netname 起動時に単一のVPNで自動的に起動する systemctl 指図。

各ノードで次のコマンドを実行して、マシンが起動するたびに起動するようにtincVPNを設定します。

すべてのサーバー
  1. sudo systemctl enable tinc@netname

Tincは、各マシンの起動時に開始するように構成されており、 systemctl 指図。 今すぐ開始する場合は、各ノードで次のコマンドを実行します。

すべてのサーバー
  1. sudo systemctl start tinc@netname

:複数のVPNがある場合は、次のように、それぞれを一度に有効化または開始します。

すべてのサーバー
  1. sudo systemctl start tinc@natename_01 tinc@netname_02 … tinc@netname_n

これで、tinc VPNが完全に構成され、各ノードで実行されます。

結論

このチュートリアルを終えたので、ニーズを満たすためにVPNを構築するための優れた基盤ができているはずです。 Tincは非常に柔軟性があり、任意のノードを他のノード(ネットワーク経由でアクセスできる)に接続するように構成できるため、1つの個別のノードに依存することなくメッシュVPNとして機能できます。