序章

この記事では、コンピューターとVPSの間に安全な暗号化されたトンネルを作成する方法と、企業ネットワークの制限をバイパスする方法、NATをバイパスする方法などを学習します。

この記事では、いくつかの基本的な理論について説明します。この理論は、さらに下の例に直接進むだけで、必要に応じてスキップできます。

インターネット、ネットワークプロトコル、通信ポートでの通信

インターネットを介してデータを送受信する、コンピューターにインストールされているすべてのソフトウェアは、TCP/IPスタックからのアプリケーション層のプロトコルを使用する必要があります。 これらのプロトコルは、インターネットなどを介してホスト間で送信されるメッセージの通信方法と形式を定義します。 例えば:

  • HTTP-WebブラウザからWebサイトとファイルをダウンロードするために使用されます
  • FTP-クライアントとサーバー間でファイルを送信するために使用されます
  • DNS-ホスト名をIPアドレスに、またはその逆に変更するために使用されます
  • POP3および(または)IMAP-電子メールのダウンロード/閲覧に使用されます
  • SMTP-電子メールの送信に使用されます
  • telnet-サーバーにリモート接続するために使用されます
  • SSH-telnetに似ていますが、 secure の暗号化バージョンであるため、サーバーに送信する内容とサーバーが送信する内容を誰も見ることができません。

次に、指定されたプロトコルのメッセージをTCPセグメントまたはUDPデータグラム(トランスポート層)にパックする必要があります。 これらのプロトコルは、インターネットを介してデータを転送するために使用されます。これらのプロトコルは、トランスポート層で機能します。 TCPプロトコルはコネクション型です。つまり、データを送信する前に、リモートマシン間に接続を作成する必要があります。 TCPは常に正しい順序でデータを提供します。 ネットワークでセグメントが失われた場合、時間内に確認を受信しなければ、セグメントは再送信されます。 TCPはかなり信頼できると考えられています。

UDPプロトコルはコネクション型ではありません。 失われたデータグラムの再送信は提供しません。 パケットが正しい順序で受信されない場合でも、UDPはパケットを受信された順序でアプリケーションに渡します。 そのため、UDPは主にリアルタイムのマルチメディアデータ(VoIPトーク、ビデオ会議、オーディオ、ビデオ)の送信に使用されます。 UDPは、アプリケーション層の他のプロトコル(DNSの場合など)によって使用されることがあります。

この場合、上位層のプロトコルは、指定された時間内に回答を受信しなかった後、クエリを再送信する必要があります。 ここでは主にUDPが使用されます。これは、オーバーヘッドが少ないためです。1つのデータグラムで1つの小さなクエリを送信して回答を受信する方が、TCP接続(ホスト間で3つのセグメントを交換する)を行うよりも時間がかからず、送信する必要のあるデータも少なくて済みます。クライアント、サーバーからの確認の送信、サーバーからの応答の送信、クライアントからの確認の送信、接続の切断(4セグメント)。

同じIPアドレスとの間の異なる接続を識別するために、ポート番号を使用します。 特定のアプリケーション層プロトコルの各サーバーは、特定のポート番号にバインドし、着信接続を待ちます。 クライアントはこのポートに接続するか(TCP接続の場合)、またはデータグラムをそのポートに送信します(UDPの場合)。 最もよく使用されるよく知られたプロトコルには、予約済みのポート番号があります。 たとえば、HTTPサーバーは通常ポート80 TCPでリッスンします(または、クライアントはアドレスでポート番号自体を指定して接続する必要があります-http://example.org:1234/)、DNSサーバーは通常ポートでリッスンします53 UDP(ポート53 TCPもあります)。 クライアントもその側でポートを使用する必要があります。 それらは52044のような「ハイポート」であり、ランダムに生成されます。

ここでは、私たちが毎日使用している予約済みのポートをさらに見ることができます。

次に、セグメントとデータグラムは、ネットワーク層でIPパケットにパックされます。 パケットでは、送信元コンピューターとターゲットコンピューターはIPアドレスで識別されます。 それらはグローバルです-一度に1つのホストのみが同じアドレスを使用できます(プライベートIPアドレスを持つホームルーターで使用されるNATのような魔法を除く:192.168.xx、10.xxx、172.16-31.xx;xは1の間の数字ですおよび255)。 これらのアドレスに基づいて、ルーターはターゲットコンピューターに到達するためにパケットを送信する方法を決定できます。

次に、パケットはデータリンク層のフレーム/セルにパックされ、ケーブルまたはローカルネットワーク上の電波の形で送信されます。 データリンク層のフレームでは、コンピューターはMACアドレスで識別されます。 MACアドレスを持つフレームは、それらからパケットを抽出するルーターから完全に削除されます。 彼らは、パケットを送信するネットワークを決定し、それらを新しいフレームにパックして、途中で送信します。 両方のルーター間のネットワークがMACアドレスを使用している場合、それらのルーターのアドレスがフレームに含まれます(ソースアドレスとターゲットルーター)。 重複していない場合でも、異なるネットワーク内の2台のコンピューター間でMACアドレスのみを使用して通信することはできません。プロデューサーは、1つのアドレスのみを1つのカードに関連付けるため、製造されたカートは、別のプロデューサーが作成したカードと同じMACアドレスを持つことができます。 。

TCP/IP (DoD) model
Encapsulation

SSHについて。 理論、パート1

SSHは、アプリケーション層のプロトコルです。 これはtelnetの後継であり、テキストモードでVPSにリモート接続するために使用されます。 telnetとは異なり、SSHは暗号化されています。 ポート22TCPを使用しますが、サーバーの構成でポートを簡単に変更できます。 SSHを使用すると、ユーザーはいくつかの異なる方法で自分自身を認証できます。

例えば:

  • ユーザー名とパスワードを使用する
  • 鍵のペアを使用する-最初に秘密鍵(極秘)、次に公開鍵(サーバー上):SSHとの接続に使用するプログラムは、秘密鍵を使用して数学の問題を解決し、その解決策をに送信する必要がありますサーバー。 問題は毎回異なるため、その認証方法を使用してキーを解読することは困難です。

現在、SSHのバージョン2を使用しています。

最も人気のあるSSHサーバーの実装はOpenSSHです。 最も人気のあるクライアントは、PuTTY(Windowsの場合)とOpenSSH(Linuxの場合)です。 PuTTYとOpenSHHはどちらも、ユーザーがトンネルを作成できるようにします。

SSHを使用すると、ユーザーはサーバーとクライアントの間にTCPトンネルを作成し、そのトンネルを介してデータを送信できます。 SSHはTCPトンネルのみをサポートしますが、それを回避することができます。 SOCKSプロキシ経由。 そのようなトンネルは、サーバー上の選択されたTCPポートと選択されたローカルポートの間に確立されます。 もちろん、暗号化されていないので、誰でも私たちが何に使用するかを確認できます。

使用される概念

ループバックインターフェイス-IPアドレス127.0.0.1でシステムにインストールされた仮想ネットワークカード。 システムにインストールされているアプリケーションのみがそのアドレスにアクセスできます。 リモートアクセスはできません。 そのインターフェイスでVPSを開始し、同じシステムまたはトンネル経由でのみリモートアクセスできます。

SMTP-電子メールを送信できるようにするアプリケーション層プロトコル。 メールサーバー間の通信と、サーバーとメールクライアント間の通信の両方に使用されます。 SMTPは、暗号化されていない通信にポート25 TCPを使用し、暗号化された接続(SSL)にポート587TCPまたは465TCP(非推奨-非推奨)を使用します。

POP3-サーバーからローカルメールクライアントに新しい電子メールをダウンロードするために使用されるアプリケーション層のプロトコル。 IMAPに取って代わられたため、最近ではほとんど使用されていません。 暗号化されていない接続の場合はポート110TCPを使用し、暗号化された接続の場合はポート995TCPを使用します。

IMAP -POP3と同様のプロトコルですが、ローカルPCにすべてをダウンロードしてサーバーから削除することなく、サーバー上のフォルダー、ラベル、メッセージおよびフォルダーの読み取りと管理をサポートします。 IMAPは、暗号化されていない接続にポート143 TCPを使用し、暗号化された接続にポート993TCPを使用します。

例1:IMAPサーバーへのトンネル

ループバックインターフェイス(127.0.0.1)のローカルポート143と、同じリモートマシンでメール(暗号化されていない接続)を受信するためのIMAPサーバーとの間のトンネル。

UnixとOpenSSH:

ssh [email protected] -L 110:127.0.0.1:110
 
abc - username on server
def - server address
110: - local port that will be opened on loopback interface (127.0.0.1) on local machine
127.0.0.1 - IP address of computer that we creating a tunnel to via our SSH tunnel
:110 - port number of target machine we'll get to via tunnel

WindowsとPuTTY:

ここでは、PuTTYを使用してVPSへの接続を作成する方法を読むことができます。 その接続は、トンネルを作成するために必要です。

  • 接続を選択し、データをロードして、[接続]-> [SSH]-> [トンネル]に移動し、次のように設定します。

    Yay!

  • [追加]をクリックします。 その後、すべてのプロトコルは次のようになります。

    Yay!

  • これで、セッションを保存して、それを使用して接続できます。

これで、メールクライアントをVPSに直接接続するのではなく、ループバックインターフェイスのポート110(127.0.0.1)を使用して接続するように構成できます。 SMTP(25)、IMAP(143)など、さまざまなプロトコルで同じことを行うことができます。

例2。 Webサーバーへのトンネル

ローカルインターフェイス(127.0.0.1)のローカルポート8080とWWWサーバーの間のトンネルで、リモートマシンのポート80にバインドされています。 今回は、ループバックインターフェイスを使用して接続します。

前に述べたように、HTTPプロトコルはWWWWebサイトをブラウザにダウンロードするために使用されます。

UnixとOpenSSH:

ssh [email protected] -L 8080:11.22.33.44:80
 
    abc - username on server
    def - server address
    8080: - port on the local machine that will be opened on loopback interface (127.0.0.1)
    11.22.33.44 - IP address of the server that we'll create a tunnel to using SSH

WindowsとPuTTY:

  • 接続を選択し、設定をロードします。
  • [接続]->[SSH]->[トンネル]に移動します
  • 次のように設定します。

    it looks like this

  • [追加]をクリックします。

    it looks like that

  • これで、セッションを保存して接続できます。

理論的には、ブラウザで 127.0.0.1:8080 にアクセスすると、’接続したリモートサーバーにあるWebサイトが表示されます。

実際には、HTTP1.1はクエリにHostパラメーターを導入しました。 このパラメータは、接続しているVPSのDNSドメイン名を送信するために使用されます。 仮想ホストメカニズムを使用している場合、表示されるページはエラーページまたはサーバーのメインページのいずれかになりますが、トンネルを経由しません。

この場合、もう1つ実行する必要があります。ローカルPCの hosts ファイルに、VPSアドレスとループバックインターフェイスを追加します。

127.0.0.1 website

ウェブサイトは、接続したいサイトのアドレスです(なし最初に http:// 、最後に / )。

Hosts ファイルは、/ etc / hosts(Linux)またはC:\ Windows \ system32 \ drivers \ etc \ hosts(Windows)にあります。 このファイルを編集するには、管理者であるか、管理者権限を持っている必要があります。

重要! Unixシステムで1024未満の番号のローカルポートにトンネルを作成する場合は、root権限が必要です。

例3。 SOCKSプロキシ

SOCKSプロキシを使用すると、任意のプロトコルからトンネルを介してトラフィックを送信できます。 外部からは、単一のTCP接続のように見えます。

この例では、SSHサーバーとクライアントの間にループバックインターフェイスのポート5555でトンネルを作成します。 次に、すべての発信接続のプロキシサーバーとしてSOCKSサーバーを使用するようにブラウザーを設定します。

このソリューションは、企業ネットワークの制限を回避するのに役立つ場合があります。 SSHが使用するポートがロックされている場合、OpenSSH構成ファイル(/ etc / ssh/sshd_configまたは/etc/ openssh / sshd_config)の Listen オプションを使用して、ポート443でリッスンするようにサーバーに指示できます。 。

UnixとOpenSSH:

ssh [email protected] -D 5555
 
    abc - username
    def - server address
    5555 - local port number, where the tunnel will be created

WindowsとPuTTY:

  • 接続を選択し、設定をロードします。
  • [接続]->[SSH]->[トンネル]に移動します
  • 次のように設定します。

    noname1

  • [追加]をクリックします。

    noname2

  • セッションを保存して接続します。

ブラウザの設定で、127.0.0.1:5555で実行されるSOCKSプロキシを設定します。これから、PuTTYまたはOpenSSHで接続を閉じるまでです。

例4。 NATのバイパス

NAT(具体的にはホームルーターで使用されるNAT形式であるPAT)は、多くの人が1つのインターネット接続を使用できるようにするメカニズムです。 NATを使用するルーターには、1つのパブリックアドレスがあり、内部ネットワークから受信したパケット内のすべてのプライベートアドレスを独自のパブリックアドレスに変更して、インターネットに送信します。 パケットを受信すると、逆の処理を行います。特別なNATテーブルにIPアドレスとポート番号を記憶します。

外部からの接続は、ルーターに適切なポートフォワーディングを設定した場合にのみ可能です。 ただし、その問題を回避し、コンピューターとサーバーの間にトンネルを作成して、コンピューターとサーバーを直接接続することはできます。

パート1。

2番目の部分では、ローカルポート80(コンピューター上-ローカルHTTPサーバー)とリモートサーバー上のポート8080の間にトンネルを作成します。 ただし、セキュリティ上の理由から、リモートポート8080は、VPSのループバックインターフェイス( 127.0.0.1 )でのみ開かれます。 そのため、すべてのポートで接続を開くようにサーバーを再構成する必要があります。 今からやります。

  1. お気に入りのエディターで、rootとして/ etc / ssh / sshd_config(または/ etc / openssh / sshd_config)ファイルを開きます。
    nano /etc/ssh/sshd_config
  2. 検索:
    #GatewayPorts no
  3. その行を次のように変更します:
    GatewayPorts yes
  4. ファイルを保存して、エディターを閉じます。
  5. SSHDサーバーを再起動します:
    Debian/Ubuntu:
    service ssh restart
    

    CentOS: /etc/init.d/sshd restart

パート2。

このセクションでは、トンネルを作成します。

UnixとOpenSSH:

ssh [email protected] -R 8080:127.0.0.1:80
 
    abc - username
    def - server address
    8080 - port number that will be opened on remote server - our proxy server
    127.0.0.1 - IP address we open tunnel to
    80 - port number we open tunnel to

今回のトンネルはローカルですが、NATを使用して同じネットワーク内の他のコンピューターにトンネル接続することができます。

WindowsとPuTTY:

  • 接続を選択し、設定をロードします。
  • [接続]->[SSH]->[トンネル]に移動します
  • 次のように設定します。

    It looks like that

  • [追加]をクリックします。

    noname3

  • セッションを保存して接続します。

ログイン後、パブリックIPアドレスを持つOpenSSHプロキシサーバーを介して、ネットワークの外部からローカルHTTPサーバーにアクセスできます。 ブラウザで以下を開きます。

http://IP-address-or-domain-of-our-server-change-that-for-your-name:8080/

理論は続く

ご覧のとおり、SSHトンネルには次の3つのタイプがあります。

  • ローカル--Lオプション-トンネルがローカルポートで開かれ、SSHサーバーへの保存された接続に最初にリダイレクトされ、ターゲットホストの隣にある接続をリッスンします。
  • リモート--Rオプション-SSHサーバーでトンネルが開かれます。 サーバーによる接続を受信した後、すべての送信はローカルトンネルからリダイレクトされます。
  • 動的--Dオプション-ローカルループバックインターフェイスでトンネルが開かれます。 送信はSOCKSプロトコルを介して行われます。 これを介して任意のパケットをトンネリングできます-TCP、UDP。 プロキシSSHサーバーを介してインターネット上の任意のサーバーに接続することが可能です。 SOCKSプロキシを介してすべてのシステムトラフィックをリダイレクトするには、プロキシなどのプログラムを使用できます。