banner
二叉树树

二叉树树的xLog

Protect What You Love!
telegram
x
github
bilibili
steam_profiles
email

GFWを回避する方法について考えてみましょう。

まず、GFW がどのように私たちのトラフィックをブロックしているのかを理解する必要があります#

  1. IP ブラックホール:現在解決策はありませんが、一部のサービスに対してのみブラックホールが存在します。例えば、Google 系(Google、Twitter、YouTube など)

  2. DNS 汚染:ドメイン名に対して偽の IP を返します。hosts ファイルを使用してドメイン名に対応する IP を強制指定するか、暗号化された DNS(DoH、DNS 署名など)を使用します。

  3. HTTP ハイジャック:トラフィックが暗号化されていないため、GFW は天然の中間者として直接改ざんできます(例:404 ページへのリダイレクト、詐欺防止ページへのハイジャックなど)。HTTPS 接続を使用することで回避できますが、SNI ブロックに遭遇する可能性があります。

  4. SNI ブロック:クライアントとサーバーが暗号化接続を確立する前に、クライアントは Client Hello メッセージを送信します。このメッセージは平文であり、一般的に server_name を含んでいます。GFW は、どのウェブサイトにアクセスしようとしているかを知ることができ、ホワイトリストにない(例:discord.com)ドメイン名をブロックします。 server_name は実際には拡張機能であり、強制ではないため、送信しないことで SNI ブロックを回避できます。

では、GFW が異なるウェブサイトに対してどのようにブロックしているかを分析してみましょう#

WireShark を使用してパケットキャプチャを行います。

  • まず、 www.baidu.com にアクセスを試みます。これは GFW にブロックされていないドメイン名です。

    1. まず ping を実行します。
      2024-10-21-20-16-48-image

    2. IP を取得します: 2408:873d:22:18ac:0:ff:b021:1393

    3. Hosts を使用して強制的にバインドします。
      2024-10-21-20-18-10-image

    4. WireShark を使用してパケットキャプチャを行うと、クライアントが送信した Client Hello メッセージに Server Name フィールドが明確に表示され、正常に Server Hello を受信し、両者が通信を開始します。
      2024-10-21-20-24-03-image

    5. ブラウザを確認すると、ウェブサイトに正常にアクセスできます。
      2024-10-21-20-35-29-image

  • 次に、 discord.com にアクセスしてみましょう。

    1. まず ping を実行します。ドメイン名と解決された IP がどちらも通じないことがわかります。
      2024-10-21-20-27-57-image

    2. この時、 itdog.cn を使用して v4 ping を試み、解決されたドメイン名に対して順次 ping を実行します。
      2024-10-21-20-28-51-image

    3. 最初の IP が通じることがわかります。
      2024-10-21-20-29-40-image

    4. Hosts を強制的にバインドし、パケットキャプチャを試みます。
      2024-10-21-20-35-58-image

2024-10-21-20-31-49-image

  1. 強制 Hosts バインド後、クライアントが Client Hello を送信すると、GFW が Server Name フィールドを検出し、GFW がクライアントに RST メッセージを送信します。これはクライアント接続のリセットを要求するものです。クライアント側では ERR_CONNECTION_RESET が表示され、接続がリセットされたことを示します。ユーザーはウェブページにアクセスできません。
    2024-10-21-20-33-23-image

続いて、空の Server Name メッセージを送信してみます#

2024-10-21-20-41-37-image

2024-10-21-20-41-54-image

成功しました。WireShark では Server Name フィールドは検出されませんでした。

切り札、tcpioneer#

それは TCP パケットを魔改造することで GFW が検出できないようにし、WireShark も Client Hello メッセージをキャプチャできませんが、接続を確立することができ、サーバーが Server Hello を送信します。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。