序章

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の図は次のとおりです。

Tinc VPN Setup

青いボックスは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キーをboth client-01[に追加します。 X258X]およびclient-02authorized_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の開始後に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

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

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

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

これらの行を追加したら、ファイルを保存して閉じます。 nanoを使用した場合は、CTRL+XYENTERの順に押してください。

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

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

繰り返しになりますが、このファイルの名前にはハイフンではなくアンダースコアが含まれていることに注意してください。 このようにして、tinc.confファイルのNameディレクティブと連携します。これにより、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

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を作成します。これは、netnameVPNが開始されるたびに実行されるスクリプトです。

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 …32のネットマスクを持つIPアドレス10.0.0.1をtincの仮想ネットワークインターフェイスに追加します。これにより、VPN上の他のマシンがserver-01を認識します。 のIPアドレスは10.0.0.1
  • ip route …:tincの仮想ネットワークインターフェイスで到達できるルート(10.0.0.0/24)を追加します

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

次に、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 …:Tincの仮想ネットワークインターフェイスからIPアドレス10.0.0.1を削除します
  • ip link …:tincの仮想ネットワークインターフェイスのステータスをdownとして設定します

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

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

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

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をそれぞれのクライアントノードの名前に置き換えてください。 繰り返しになりますが、この名前でハイフンではなくアンダースコア(_)を使用していることを確認してください。

このファイルにはserver_01を指すConnectToディレクティブが含まれていますが、server-01tinc.confファイルにはこのディレクティブが含まれていないことに注意してください。 server-01ConnectToステートメントを含めないことは、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-01privateIPアドレスを指すように変更します。

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

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

注: 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を使用して、プロセスの開始と実行を制御します。 このため、1つのsystemctlコマンドを使用して、起動時にnetnameVPNを自動的に起動できるようにすることができます。

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

すべてのサーバー
  1. sudo systemctl enable [email protected]netname

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

すべてのサーバー
  1. sudo systemctl start [email protected]netname

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

すべてのサーバー
  1. sudo systemctl start [email protected]natename_01 [email protected]netname_02[email protected]netname_n

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

結論

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