Ubuntu18.04にTincをインストールして基本的なVPNを設定する方法
序章
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-01とclient-01)をプロビジョニングし、プライベートネットワークを有効にしますそれぞれの。 次に、別のデータセンターに別のUbuntu 18.04サーバー( client-02 )を作成します。 各サーバーには、管理ユーザーとufw
で構成されたファイアウォールが必要です。 これを設定するには、Ubuntu18.04の初期サーバー設定ガイドに従ってください。
さらに、このチュートリアルの後半で、scp
を使用して各マシン間でいくつかのファイルを転送する必要があります。 このため、各サーバーでSSHキーを生成し、両方 client-01とclient-02のSSHキーをに追加する必要があります。 server-01のauthorized_keys
ファイルを作成し、server-01のSSHキーをboth authorized_keys
ファイル。 これを設定するためのヘルプについては、 Ubuntu18.04でSSHキーを設定する方法に関するガイドを参照してください。
ステップ1—Tincのインストール
TincはデフォルトのUbuntuAPTリポジトリから入手できます。つまり、いくつかのコマンドでインストールできます。
最近行っていない場合は、各サーバーで次のコマンドを実行して、それぞれのパッケージインデックスを更新します。
- sudo apt update
次に、次のコマンドを実行して、各サーバーにtincをインストールします。
- 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の構成ディレクトリ構造を作成します。
- sudo mkdir -p /etc/tinc/netname/hosts
お好みのテキストエディタを使用して、tinc.conf
ファイルを作成します。 ここでは、nano
を使用します。
- sudo nano /etc/tinc/netname/tinc.conf
空のファイルに次の行を追加します。 これらは、IPv4を使用するtun0
と呼ばれるネットワークインターフェイスを備えたserver_01
という名前のtincノードを構成します。
Name = server_01
AddressFamily = ipv4
Interface = tun0
警告: Name
ディレクティブの後の値に、ハイフン(-
)ではなくアンダースコア(_
)が含まれていることに注意してください。 tincではName
値に英数字またはアンダースコア文字のみが含まれている必要があるため、これは重要です。 ここでハイフンを使用すると、このガイドの後半でVPNを開始しようとしたときにエラーが発生します。
これらの行を追加したら、ファイルを保存して閉じます。 nano
を使用した場合は、CTRL+X
、Y
、ENTER
の順に押してください。
次に、hosts
サブディレクトリにserver_01
という名前のホスト構成ファイルを作成します。 最終的に、クライアントノードはこのファイルを使用してserver-01と通信します。
- sudo nano /etc/tinc/netname/hosts/server_01
繰り返しになりますが、このファイルの名前にはハイフンではなくアンダースコアが含まれていることに注意してください。 このようにして、tinc.conf
ファイルのName
ディレクティブと連携します。これにより、tincは、後で生成するときに、サーバーの公開RSAキーをこのファイルに自動的に追加できます。
次の行をファイルに追加し、server-01のパブリックIPアドレスが含まれていることを確認します。
Address = server-01_public_IP_address
Subnet = 10.0.0.1/32
Address
フィールドは、他のノードがこのサーバーに接続する方法を指定し、Subnet
は、このデーモンがサービスを提供するサブネットを指定します。 ファイルを保存して閉じます。
次に、次のコマンドを使用して、このホストの公開RSAキーと秘密RSAキーのペアを生成します。
- 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が開始されるたびに実行されるスクリプトです。
- sudo nano /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が停止したときに仮想ネットワークインターフェイスを削除するスクリプトを作成します。
- sudo nano /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
として設定します
ファイルを保存して閉じてから、次の新しいネットワークスクリプトの両方を実行可能にします。
- sudo chmod 755 /etc/tinc/netname/tinc-*
server-01 を構成する最後のステップとして、tincのデフォルトポートであるポート655
を通過するトラフィックを許可するファイアウォールルールを追加します。
- sudo ufw allow 655
server-01 が完全に構成され、クライアントノードのセットアップに進むことができます。
ステップ3—クライアントノードの構成
プロセスは一般的に非常に似ていますが、両方のクライアントマシンはサーバーとはわずかに異なる構成を必要とします。
このガイドで目的としているセットアップのため、client-01とclient-02をほぼ同じように構成しますが、わずかな違いがあります。 したがって、この手順で指定するコマンドの多くは、両方のマシンで実行する必要があります。 ただし、client-01またはclient-02で特定のコマンドまたは特別な構成が必要な場合、それらの命令はそれぞれ青または赤のコマンドブロックで表示されることに注意してください。
client-01とclient-02の両方で、server-01で作成したディレクトリ構造を複製します。
- sudo mkdir -p /etc/tinc/netname/hosts
次に、tinc.conf
ファイルを作成します。
- sudo nano /etc/tinc/netname/tinc.conf
両方のマシンのファイルに次の行を追加します。
Name = node_name
AddressFamily = ipv4
Interface = tun0
ConnectTo = server_01
必ずnode_name
をそれぞれのクライアントノードの名前に置き換えてください。 繰り返しになりますが、この名前でハイフンではなくアンダースコア(_
)を使用していることを確認してください。
このファイルにはserver_01
を指すConnectTo
ディレクティブが含まれていますが、server-01のtinc.conf
ファイルにはこのディレクティブが含まれていないことに注意してください。 server-01にConnectTo
ステートメントを含めないことは、server-01が着信接続のみをリッスンすることを意味します。 これは、他のマシンに接続しないため、セットアップで機能します。
ファイルを保存して閉じます。
次に、各クライアントノードにホスト構成ファイルを作成します。 繰り返しになりますが、ファイル名のスペルがハイフンではなくアンダースコアであることを確認してください。
- sudo nano /etc/tinc/netname/hosts/node_name
client-01 の場合、次の行を追加します。
Subnet = 10.0.0.2/32
client-02 の場合、次の行を追加します。
Subnet = 10.0.0.3/32
各クライアントには、tincがサービスを提供する異なるサブネットがあることに注意してください。 ファイルを保存して閉じます。
次に、各クライアントマシンでキーペアを生成します。
- sudo tincd -n netname -K4096
server-01の場合と同様に、RSAキーを保存するファイルを選択するように求められたら、ENTER
を押してデフォルトの選択を受け入れます。
その後、各クライアントでネットワークインターフェイス開始スクリプトを作成します。
- sudo nano /etc/tinc/netname/tinc-up
client-01 の場合、次の行を追加します。
#!/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 の場合、以下を追加します。
#!/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
各ファイルを保存して閉じます。
次に、各クライアントでネットワークインターフェイス停止スクリプトを作成します。
- sudo nano /etc/tinc/netname/tinc-down
client-01 で、次のコンテンツを空のファイルに追加します。
#!/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 に、以下を追加します。
#!/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
ファイルを保存して閉じます。
各クライアントマシンで次のコマンドを実行して、ネットワークスクリプトを実行可能にします。
- sudo chmod 755 /etc/tinc/netname/tinc-*
最後に、各クライアントのポート655
を開きます。
- sudo ufw allow 655
この時点で、クライアントノードはほぼセットアップされていますが、完全ではありません。 VPNへの接続を認証するために、前の手順でserver-01で作成した公開鍵が引き続き必要です。
ステップ4—キーの配布
別のノードと直接通信する各ノードは、ホスト構成ファイル内にある公開鍵を交換している必要があります。 この場合、server-01は他のノードと公開鍵を交換する必要があります。
server-01とclient-01の間のキーの交換
client-01 で、そのホスト構成ファイルをserver-01にコピーします。 client-01とserver-01の両方が同じデータセンターにあり、両方ともプライベートネットワークが有効になっているため、ここでserver01のプライベートIPアドレスを使用できます:
- scp /etc/tinc/netname/hosts/client_01 sammy@server-01_private_IP:/tmp
次に、 server-01 で、client-01
ホスト構成ファイルを/etc/tinc/netname/hosts/
ディレクトリにコピーします。
- sudo cp /tmp/client_01 /etc/tinc/netname/hosts/
次に、 server-01 を使用したまま、そのホスト構成ファイルをclient-01にコピーします。
- scp /etc/tinc/netname/hosts/server_01 user@client-01_private_IP:/tmp
client-01 で、server-01のファイルを適切な場所にコピーします。
- sudo cp /tmp/server_01 /etc/tinc/netname/hosts/
client-01 で、 server-01 のホスト構成ファイルを編集して、Address
フィールドがserver-01のプライベートに設定されるようにします。 IPアドレス。 このようにして、client-01はプライベートネットワーク経由でVPNに接続します。
- sudo nano /etc/tinc/netname/hosts/server_01
Address
ディレクティブをserver-01のprivateIPアドレスを指すように変更します。
Address = server-01_private_IP
Subnet = 10.0.0.1/32
保存して終了します。 次に、残りのノードclient-02に移りましょう。
server-01とclient-02間のキーの交換
client-02 で、そのホスト構成ファイルをserver-01にコピーします。
- scp /etc/tinc/netname/hosts/client_02 sammy@server-01_public_IP:/tmp
次に、 server-01 で、client_02
ホスト構成ファイルを適切な場所にコピーします。
- sudo cp /tmp/client_02 /etc/tinc/netname/hosts/
次に、server-01のホスト構成ファイルをclient-02にコピーします。
- scp /etc/tinc/netname/hosts/server_01 user@client-02_public_IP:/tmp
client-02 で、server-01のファイルを適切な場所にコピーします。
- sudo cp /tmp/server_01 /etc/tinc/netname/hosts/
2つのクライアントノードのみを設定していると仮定すると、公開鍵の配布は完了です。 ただし、より大きなVPNを作成している場合は、これらの他のノード間でキーを交換する良い機会です。 2つのノードが(間に転送サーバーなしで)互いに直接通信する場合は、キー/ホスト構成ファイルを交換し、互いの実際のネットワークインターフェイスにアクセスできる必要があることに注意してください。 また、各ホストの構成ファイルをVPN内のすべてのノードにコピーするだけでも問題ありません。
ステップ5—構成をテストする
各ノードで、 server-01 から始めて、次のコマンドでtincを起動します。
- 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
に割り当てました。
- ping 10.0.0.2
pingは正しく機能し、VPNでの接続に関するデバッグ出力が他のウィンドウに表示されるはずです。 これは、client-02がserver-01からclient-01を介してVPN経由で通信できることを示しています。 CTRL+C
を押して、pingを終了します。
VPNインターフェースを使用して、アプリケーション接続、ファイルのコピー、SSHなどの他のネットワーク通信を行うこともできます。
各tincデーモンデバッグウィンドウで、CTRL+\
を押してデーモンを終了します。
ステップ6—起動時に起動するようにTincを構成する
Ubuntuサーバーは、デフォルトのシステムマネージャーとしてsystemd
を使用して、プロセスの開始と実行を制御します。 このため、1つのsystemctl
コマンドを使用して、起動時にnetname
VPNを自動的に起動できるようにすることができます。
各ノードで次のコマンドを実行して、マシンが起動するたびに起動するようにtincVPNを設定します。
- sudo systemctl enable tinc@netname
Tincは、各マシンの起動時に起動するように構成されており、systemctl
コマンドで制御できます。 今すぐ開始する場合は、各ノードで次のコマンドを実行します。
- sudo systemctl start tinc@netname
注:複数のVPNがある場合は、次のように、それぞれを一度に有効化または開始します。
- sudo systemctl start tinc@natename_01 tinc@netname_02 … tinc@netname_n
これで、tinc VPNが完全に構成され、各ノードで実行されます。
結論
このチュートリアルを終えたので、ニーズを満たすためにVPNを構築するための優れた基盤ができているはずです。 Tincは非常に柔軟性があり、任意のノードを他のノード(ネットワーク経由でアクセスできる)に接続するように構成できるため、1つの個別のノードに依存することなくメッシュVPNとして機能できます。