STUNのP2P技術、TURN、ICEは詳細

  ほとんどのコンピュータは現在、ファイアウォールやNATの背後にあるホストの後、少しインターネットに直接コンピュータへのアクセスがあります。通常、人々は、コンピュータが(直接通信できる2日間のネットワークにしたいP2P通信を、むしろ他のパブリックサーバに転送する必要性よりも、)。

  NATやファイアウォール以来ホストした後、P2P通信、P2P通信とどのようにそれらの間の通信かどうかを確認するためにテストするための必要性を実行する前に。この技術は一般に呼ばれているNATトラバーサル(NATトラバーサル)最も一般的なは、次のようなUDP NATトラバーサル技術に基づいているRFC3489に定義STUNプロトコル。

  UDPの実装のNAT処理:

    • フルコーンNAT:
      外部ネットワークIPとポート番号と同じであり、同じIPネットワークとポート番号を介して送信される要求からすべてのマッピングからフルコーンNAT、およびネットワーク外のホストのいずれかが外部ネットワークでマッピングされていますこの内部ホストへのIPパケットのポート番号。
    • 制限付きコーンNAT:
      要求が全てから送信された制限付きコーンNATは、同じIPネットワークとポート番号にマッピングされ、外部ネットワークIPとポート番号と同じです。テーパーとは完全に異なるだけ外部ホストすることができますが、以前にその前にパケットを送信したネットワークパケットの伝送中にホスト。
    • ポート制限付きコーンNAT:
      ポートコーンNATの制約、および制限は、NATは、ポート番号が含まれていることを除いて、非常によく似ているコーン。言い換えれば、XおよびPは、ネットワーク内のホストにパケットを送信したいネットワークのホストポート外のIPアドレスで、これはネットワークホストをしなければならない内以前にIPアドレスXとポートを与えられているPは、パケットを送りました。
    • 対称型NAT:
      対称型NAT、特定の宛先IPポート番号と同一のIPネットワークとポート番号への送信からのすべての要求が、同一のIP及びポート番号にマッピングされます。同じホストがパケットの同じ送信元アドレスとポート番号を使用しますが、別の宛先に送信した場合、NATは異なるマッピングを使用します。さらに、のみ受信したデータの外部ホストは、内側に順番にパケットネットワークサーバを送ることができます。

詳細A、STUN

  最初でSTUN、RFC3489の完全なNATトラバーサルソリューションとして定義は、すなわち、NATを通じ英語名のシンプルなUDPのトラバーサルであるだけでNATを通じてUDPを使用します完全なソリューションのNAT経由のUDPに基づいて軽量なプロトコルです。これは、アプリケーションがそれらと公共のインターネットとNATやファイアウォールの他のタイプとの間に存在することを発見することができます。また、アプリケーションが自分のパブリックIPアドレスとポート番号に割り当てられたNATを決定することができます。

  RFC5389のに新しいリビジョンではSTUNプロトコルように配置されている伝統的なNATのためのツールを提供していないが、完全なソリューション、NATセッション貫通ユーティリティ(NATのセッショントラバーサルユーティリティ)。RFC5389RFC3489名前の変更に加えて、最大の違いは、TCPの浸透のためのサポート

1、RFC3489 / STUN

  STUNは、プロトコル/サーバのクライアントである、また/応答プロトコル要求、デフォルトのポート番号は3478です。

 (1)パケット構造

O [ヘッダ]

   

 

   すべてのSTUNメッセージはメッセージヘッダバイト20含む16ビットのメッセージタイプ(のMessageType)を、16ビットのメッセージ長(MessageLength)、128ビットのトランザクションID(トランザクションID)

  メッセージタイプ許容値:0x0001に(同梱リクエスト)、0x0101(結合応答)、0x0111(バンドルされたエラー応答)、0×0002(共有秘密リクエスト)、0x0102(共有秘密応答)は、0x0112(エラー応答は、共有秘密)。

  メッセージ長:メッセージのサイズが20バイトのヘッダーを含まない、バイト。

  トランザクションID:128ビットの識別子は、ランダムな要求に応じて、要求応答は、同じ識別子を持つすべてに対応します。

Øメッセージのプロパティ[]

  

 

 

  ヘッダは、16ビットの属性タイプ、属性の長さ、および16ビットの可変長の属性値を含む0以上の属性、各属性TLVエンコーディングされた後。

  プロパティの型の定義:

  • ADDRESSマッピングされた: MAPPED-ADDRESS属性マッピングされたIPアドレスとポートを表します。これは、8ビットのグループアドレス、ポート番号、16ビットの固定長のIPアドレスを含みます。
  • ADDRESS-RESPONSE: RESPONSE-ADDRESS属性は、応答の送信先アドレスを示しています
  • CHASNGE-REQUEST:異なるアドレスまたはポート番号を使用してサーバに応答要求を送信するためにCHANGE-REQUEST属性を使用してクライアント32。
  • ADDRESS-SOURCE:バンドル応答のソースアドレス属性が表示され、サーバーは、送信元IPアドレスとポートを表し応答を送信します。
  • CHANGED-ADDRESS: REQUEST要求属性「変更IP」と「ポート変更」フラグがセットである場合CHANGE-バンドルは、CHANGED-ADDRESS属性が応答で送信されたIPアドレスとポート番号を示します。
  • USERNAME: USERNAME属性をチェックし、メッセージの整合性、メッセージの整合性チェックは、共有秘密を特定します。USERNAME共有秘密は、通常、一緒にパスワードを使用して、応答に表示されます。ときにメッセージの整合性チェックは、必要に応じて、バンドル要求に表示される場合があります。
  • PASSWORD:一緒にUSERNAMEと応答した共有秘密とPASSWORD属性。PASSWORD値は可変長であり、共有秘密として、その長さはその境界性を確保するために整列され、4バイトの倍数でなければなりません。
  • INTEGRITY-MESSAGE: MESSAGE-INTEGRITY属性がバンドルまたはバンドルされた要求応答で発生する可能性がHMAC-SHA1のSTUNメッセージを、含まれている; MESSAGE-INTEGRITY属性は、任意のSTUNメッセージ最後の属性でなければなりません。その内容は、値HMACキー入力を決定します。
  • CODE-ERROR: ERROR-CODE属性がエラーまたはエラー応答を束ねる共有秘密鍵に対応して表示されます。数値範囲100から699からの応答数。
  • ATTRIBUTES-UNKNOWN:エラーまたはエラー応答の共有秘密に応じて420束のみ番号ERROR-CODE属性の存在に応答して、その属性をUNKNOWNはアトリビュート。
  • FROM反射:から反射結合性のみRESPONSEアドレス属性を含むその対応するバンドルに要求に応じて存在しています。属性が発行された要求の送信元IPアドレスが含まれ、そのオブジェクトは、トレーサビリティを提供することであるので、DOS攻撃STUNリフレクタとして使用することはできません。

  次のように具体的なエラーコード(レスポンス数)は、一緒にデフォルトの理由文で、現在は定義されています。

  • 400(エラー要求):要求が変形します。修正する以前の試みの前に顧客が要求を再試行してはいけません。
  • 401(無許可):要求をバンドルしてもMESSAGE-INTERITYプロパティが含まれていません。
  • 420(未知のアトリビュート):サーバーは要求必須の属性を知りません。
  • 430(期限切れの資格):バンドル要求は、MESSAGE-INTEGRITY属性が含まれていませんでしたが、それは時代遅れ使用しています
  • 共有秘密。お客様は、新しい共有秘密を取得し、再び再試行する必要があります。
  • :431(整合性チェックが失敗した)同梱要求がMESSAGE-INTEGRITYアトリビュートが含まれていますが、経験HMAC
  • 認証に失敗しました。これは、パフォーマンスの潜在的な攻撃、またはクライアントの実装のエラーの可能性があります
  • 432(損失のユーザー名):バンドル要求がMESSAGE-INTEGRITYアトリビュートが含まれていますが、ノー
  • USERNAME属性。インテグリティ検査2が存在しなければなりません。
  • 433(TLSを使用して):共有秘密鍵の要求は、TLS(トランスポート層セキュリティ、すなわちセキュリティを完了したものです
  • トランスポート層プロトコル)送信されたがTLS上で受信されません。
  • 500(サーバーエラー):一時的なエラーが発生したサーバは、顧客が再び試してみてください。
  • 600(グローバル失敗):サーバーが要求を満たすことを拒否し、クライアントが再試行するべきではありません。

  属性空間を強制部分の任意の部分に分割され、値 0x7FFFを超える属性はオプション、即ち、クライアントまたはサーバは、メッセージを処理することができ、この属性を認識しない場合でも、;値は以下では0x7FFFの属性が必須の理解、その場合を除きプロパティを理解し、それ以外の場合は、クライアントまたはサーバがメッセージを処理することはできません。

(2)原則

  次のように完全な相互作用STUNプロトコルは次のとおりです。

  

 

  STUNプロトコルの特定の実装手順:

  一般情况下,客户会配置STUN服务器提供者的域名,该域名被解析为IP地址和SRV过程的端口号。

  服务器名是“stun”,使用UDP协议发送捆绑请求,使用TCP协议发送共享私密请求STUN协议缺省端口号为3478。若要提供完整性检查,STUN在客户和服务器间使用128位的共享私密,作为捆绑请求和捆绑响应中的密匙。

  首先,客户通过发现过程获得它将与之建立TCP连接的IP地址和端口号。客户打开该地址和端口的连接,开始TLS协商,验证服务器的标识。客户发送共享私密请求。该请求没有属性,只有头。服务器生成响应。客户会在该连接上生成多个请求,但在获得用户名和密码后关闭该连接。

  其次,服务器收到共享私密请求,验证从TLS连接上到达的该请求;如果不是通过TLS收到的请求,则生成共享私密错误响应,并设置ERROR-CODE属性为响应号433;这里区分两种情况:若通过TCP收到请求,则错误响应通过收到请求的相同连接发送;若通过UDP收到请求,则错误响应发送回请求送出的源IP和端口。

 

  服务器检查请求中的任何属性,当其中有不理解的小于或等于0x7fff的值,则生成共享私密错误响应,设置ERROR-CODE属性为响应号420,并包括UNKNOWN-ATTRIBUTE属性,列出它不理解的小于或等于0x7fff的属性的值。该错误响应通过TLS连接发送。

  然后,若请求正确,服务器创建共享私密响应,包含与请求中相同的事务ID,并包含USERNAME和PASSWORD属性。用户名在10分钟内有效。共享私密响应通过与收到请求的相同的TLS连接发送,服务器保持连接打开状态,由客户关闭它。

  接着,客户发送捆绑请求,携带的属性包括:

    • 可选属性:RESPONSE-ADDRESS属性和CHANGE-REQUEST属性;
    • 强制属性:MESSAGE-INTEGRITY属性和USERNAME属性。

  客户发送捆绑请求,通过客户重传来提供可靠性。客户开始用100ms的间隔重传,每次重传间隔加倍,直至1.6秒。之间间隔1.6秒的重传继续,直到收到响应或总共已经发送了9次。因此,若9500ms后,还未收到响应,客户认为传输已经失败。

  随后,服务器检查捆绑请求的MESSAGE-INTEGRITY属性,不存在则生成捆绑错误响应,设置ERROR-CODE属性为响应号401;若存在,计算请求的HMACKey值。

  服务器检查USERNAME属性,不存在则生成捆绑错误响应,设置ERROR-CODE属性为响应号432;若存在,但不认识该USERNAME的共享私密(例如,它超时了),生成捆绑错误响应,设置ERROR-CODE属性为响应号430。

  服务器如知道该共享私密,计算HMAC与请求是否相同,如果相同生成捆绑错误响应,设置ERROR-CODE属性为响应号431。

  假设消息完整性检查通过了,服务器检查请求中的任何属性的值,若遇到不理解的小于或等于0x7fff的值,生成捆绑错误响应,设置ERROR-CODE属性为响应号420,该响应包含UNKNOWN-ATTRIBUTE属性,并列出不理解的小于或等于0x7fff的属性。

  若请求正确,服务器生成单个捆绑响应,包含与捆绑请求相同的事务ID。服务器在捆绑响应中加入MAPPED-ADDRESS属性,该属性的IP地址和端口号为捆绑请求的源IP地址和端口号。

  捆绑响应的源地址和端口号取决于捆绑请求中CHANGE-REQUEST属性的值捆绑请求收到的地址和端口号相关

(3)总结

  

 

  服务器在捆绑响应中加入SOURCE-ADDRESS属性,包含用于发送捆绑响应的源地址和端口号;加入CHANGED-ADDRESS属性,包含源IP地址和端口号。

  如果捆绑请求中包含了USERNAME和MESSAGE-INTEGRITY属性,则服务器在捆绑响应中加入MESSAGE-INTEGRITY属性。

  如果捆绑请求包含RESPONSE-ADDRESS属性,则服务器在捆绑响应中加入REFLECTED-FROM属性:如果捆绑请求使用从共享私密请求获得的用户名进行认证,则REFLECTED-FROM属性包含共享私密请求到达的源IP地址和端口号;若请求中的用户名不是使用共享私密分配的,则REFLECTED-FROM属性包含获得该用户名的实体的源IP地址和端口号;若请求中没有用户名,且服务器愿意处理该请求,则REFLECTED-FROM属性包含请求发出的源IP地址和端口号。

  服务器不会重传响应,可靠性通过客户周期性地重发请求来保障,每个请求都会触发服务器进行响应

  客户端判断响应的类型是捆绑错误响应还是捆绑响应。捆绑错误响应通常在请求发送的源地址和端口收到;捆绑响应通常在请求中的RESPONSE-ADDRESS属性的地址和端口收到,若没有该属性,则捆绑响应将在请求发送的源地址和端口号收到。

  • 若是捆绑错误响应,客户检查响应中的ERROR-CODE属性的响应号:400至499之间的未知属性按属性400处理,500至599之间的未知属性按500处理,600至699之间的未知属性按600处理。任何100和399之间的响应都会使请求重传中止,但其他则忽略;若客户收到响应的属性类型大于0x7fff,则忽略该属性,若小于或等于0x7fff,则请求重传停止,并忽略整个响应;
  • 若是捆绑响应,客户检查响应的MESSAGE-INTEGRITY属性:如果不存在,客户在请求中加入MESSAGE-INTEGRITY属性,并放弃该响应;如果存在,客户计算响应的HMAC。如果计算出的HMAC与响应中的不同,则放弃该响应,并警告客户可能受到了攻击;若计算出的HMAC与响应中的匹配,则过程继续;
  • 不论收到捆绑响应还是捆绑错误响应,都将中止该请求的重传。客户在第一次响应后继续监听捆绑请求的响应10秒钟,如果这期间它收到任何消息类型不同的响应或不同的MAPPED-ADDRESS属性,它将警告用户可能受到攻击;并且,如果客户收到的捆绑响应次数超过它发送的捆绑请求数的两倍,它将警告用户可能受到攻击;若捆绑响应经过认证,上述攻击并未导致客户丢弃MAPPED-ADDRESS,则客户可以使用该MAPPED-ADDRESS和SOURCE-ADDRESS属性。

(4)STUN功能举例

  客户通过带外方式获得STUN服务器信息后,就打开对应的地址和端口的连接,并开始与STUN服务器进行TLS协商。一旦打开了连接,客户就通过TCP协议发送共享私密请求,服务器生成共享私密响应。STUN在客户和服务器间使用共享私密,用作捆绑请求和捆绑响应中的密匙。之后,客户使用UDP协议向STUN服务器发送捆绑请求,当捆绑请求消息到达服务器的时候,它可能经过了一个或者多个NAT。结果是STUN服务器收到的捆绑请求消息的源IP地址被映射成最靠近STUN服务器的NAT的IP地址,STUN服务器把这个源IP地址和端口号复制到一个捆绑响应消息中,发送回拥有这个IP地址和端口号的客户端。

  当STUN客户端收到捆绑响应消息之后,它会将自己发送捆绑请求时绑定的本地IP地址和端口号同捆绑响应消息中的IP地址和端口号进行比较,如果不匹配,就表示客户端正处于一个或者多个NAT的前面

  在Full-Cone NAT的情况下,在捆绑响应消息中的IP地址和端口是属于公网的,公网上的任何主机都可以使用这个IP地址和端口号向这个应用程序发送数据包,应用程序只需要在刚才发送捆绑请求的IP地址和端口上监听即可。

  当然,客户可能并不在一个Full-Cone NAT的前面,实际上,它并不知道自己在一个什么类型的NAT的前面。为了确定NAT的类型,客户端使用附加的捆绑请求。具体过程是很灵活的,但一般都会像下面这样工作:客户端再发送一个捆绑请求,这次发往另一个IP地址,但是使用的是跟上一次同一个源IP地址和源端口号,如果返回的数据包里面的IP地址和端口号和第一次返回的数据包中的不同,客户端就会知道它是在一个对称NAT的前面。客户端为了确认自己是否在一个完全锥形NAT的前面,客户端可以发送一个带有标志的捆绑请求,这个标志告诉服务器使用另一个IP地址和端口发送捆绑响应。换句话说,如果客户端使X/Y的IP地址端口对向A/B的IP地址端口对发送捆绑请求,服务器就会使用源IP地址和源端口号为C/D的地址端口对向X/Y发送捆绑响应。如果客户端收到了这个响应,它就知道它是在一个Full-Cone NAT前面。

  STUN协议允许客户端请求服务器从收到捆绑请求的IP地址往回发捆绑响应,但是要使用不同的端口号。这可以用来检查客户端是否在Port Restricted Cone NAT的前面还是在Restricted Cone NAT的前面。

2、RFC5389/STUN

 http://www.52im.net/thread-557-1-1.html

 

 

二、TURN详解

 

 

 

 

三、ICE介绍

おすすめ

転載: www.cnblogs.com/xiugeng/p/12059714.html