ロック結果
RTはしばらくの間、IPではなくURLによってHTTPサイトをブロックしてきました。
ブロック時に、 95.167.13.50 /?st = 0&dt = < IP> &rs = <URL>の形式のリダイレクト。ここで、<IP>はブラウザーが接続されているIP、<URL>は要求したURLです。 送信されたトラフィックを見ると、サーバー応答の先頭のみが上書きされ、残りはそのままであることが明らかになります。
こんな感じ
HTTP / 1.1 302が見つかりました 接続:閉じる 場所:http://95.167.13.50/?st=0&dt=192.237.142.117&rs=grani.ru/ f-8 転送エンコード:チャンク 接続:キープアライブ 6d7 <!DOCTYPE HTML> <html lang = "ru" xmlns:fb = "http://www.facebook.com/2008/fbml"> <head> <メタ文字セット= "utf-8"> <タイトル> Grani.ru: 主なもの </ title> ...
サイトの本当の答え
つまり ヘッダーを復元する方法を見つけた場合、ロックをバイパスできます。 明らかに、これは最も手頃な方法ではありません。
HTTP / 1.1 200 OK サーバー:nginx / 1.2.1 日付:日曜日、2015年2月1日17:34:03 GMT Content-Type:テキスト/ html; 文字セット= utf-8 転送エンコード:チャンク 接続:キープアライブ 6d7 <!DOCTYPE HTML> <html lang = "ru" xmlns:fb = "http://www.facebook.com/2008/fbml"> <head> <メタ文字セット= "utf-8"> <タイトル> Grani.ru: 主なもの </ title> ...
ブロックされるものと方法
RTサイトのブロックが手動制御であることは明らかです。
レジストリのすべてのサイトがブロックされるわけではありません。 少なくとも、まったくブロックされていないHTTPSサイトがいくつかあります。
通常、HTTPSサイトはIPによってブロックされます。プロバイダーが証明書に代わってHTTPSにクロールする場合があり、この場合はURLによってブロックされます。
レジストリからのHTTPSサイトは、HTTPによってのみ(IPではなくURLによって)ブロックされ、HTTPS経由で簡単にアクセスできる場合があります。
より深く探る
一連の実験の過程で、次のロックの原則が特定されました。
- クエリの最初の行では、HTTPメソッドの名前、スペース、URL、スペース、または? または/。
GET、POST、HEAD、DELETE、OPTIONS、TRACEメソッドに反応します。 PUTメソッドは明らかに忘れられていますが、スキップします。 他のメソッド名もスキップされます。 大文字と小文字が変更されたメソッドの名前も欠落しています。
チェックは最初の行でのみ発生します。リクエストの先頭に空の行を挿入すると、リクエストは成功します。
URLが「/」の場合、メソッドの名前のみが検索されます。
メソッド名の後に余分なスペースを追加すると、URLが「/」と等しくない場合でも、リクエストは問題なく通過します。
どうやら、URLはスペース文字「?」があると終了したと見なされます。 または「/」。 URLに他の文字を追加すると、リクエストは成功します。 含む、改行文字を追加する場合、すなわち リクエストから「HTTP / 1.1」を削除します。 - URLエンコード(urlencode)は、異なるレジスタを含む検閲の克服には役立ちません。 最初のスラッシュ(%2F)をエンコードしても、リクエストはブロックされますが、Webサーバーはこれをもう理解しません。
- 次に、Hostヘッダーが検索されます。
そして、同じパッケージで検索されます。
そして、「Host:<HOST>」という形式の必須一致で検索されます。 ヘッダー名(ホスト、HOST)の余分な文字または大文字と小文字の変更により、要求を渡すことができます。
ただし、ドメイン自体の文字の大文字小文字を変更しても効果はありません。ロックがトリガーされます。
回避策
したがって、次の回避策があります。
- クエリの先頭に空白行を追加します。 すべてのWebサーバーが理解できるわけではありません。特に、nginxは理解できません。
- URLの前にスペースを追加します。 一般的なWebサーバーはこれを理解しています。 ただし、まれに( ここなど)問題が発生する場合があります
- URLの後に文字を追加します。 明らかに、これはWebサーバーが無視するシンボルの一種でなければなりませんが、検閲部門はこれがURLの一部であると判断します。 私はそのようなシンボルを見つけることができませんでした。
- プロトコル名とバージョン(「HTTP / 1.1」)を削除します。 この場合、要求はWebサーバーによってHTTP / 1.0として認識され、このバージョンのプロトコルにはHostヘッダーがなかったため、多くのサイトでは機能しません。
- URLとホストを異なるパッケージで送信します。
リクエストの最初の行(HTTPメソッドとURL)でsendを呼び出すだけで、残りのリクエストを通常の方法で送信できます。
これらの行の間に十分な大きさのヘッダー(パッケージ全体を確実に埋めるために約1530バイト)を追加できます。
このような場合、Webサーバーに問題はありませんでした。 - Hostヘッダーの変更。
大文字小文字を変更し、ドメインの前後にスペースを追加できます。
このような場合、Webサーバーに問題はありませんでした。
実用的な実装
3proxyに基づく実装を選択しました。 正規表現に基づいて送信されたすべてのデータを変更できるプラグインが含まれています。 同時に、プロキシは非常に軽量で要求が厳しくなく、通常のルーターにインストールできます。
前述のとおり、実際の最も便利なオプションは、ホストの前に追加のヘッダーを追加し、ホストヘッダーを変更することです。 明らかに、ホストの変更が望ましいのは、 要求のサイズは増加しません。 私は定期的にこの方法を使用して、どの情報を消費できるかを自分で決定します。
ただし、一般的に、両方のオプションは簡単にカスタマイズできます。
追加の見出しを追加する
pcre_rewrite cliheader dunno "Host:" "X-Something:\ r \ nHost:"
ヘッダーの変更
pcre_rewrite cliheader dunno "ホスト:" "ホスト:"
基本設定
#DNSサーバー nserver 77.88.8.8 nserver 8.8.8.8 #キャッシュDNS nscache 65536 #バックグラウンドで作業する デーモン #プラグイン接続、フルパスを指定する価値があります プラグインPCREPlugin.ld.so pcre_plugin #上記のルールの1つ pcre_rewrite ... #プロキシを起動し、オプション-aを使用すると、Forwarded-ForおよびViaヘッダーを削除できます プロキシ-a -p8080
UPD:
@ValdikSSは非常に興味深いコメントを述べました。
Rostelecomからインターフェイスに着信するトラフィックを見るとすぐに。 DPIはおそらく直列ではなく並列に接続されており、そこにはクライアントトラフィックのみが入ります。 なぜなら DPIはWebサイトよりも明らかに近く、DPIからのロケーションを持つパッケージはサイトからの実際の最初のパッケージよりも早く到着し、サイトからのパッケージはOSカーネルによって再送信としてすでに破棄されているため、Linuxを使用している場合、iptablesの1行でロックをバイパスできます:
iptables -A INPUT -p tcp --sport 80 -m string --algo bm --string "http://95.167.13.50/?st" -j DROP
私から:
実際、再送信があります。 私はトラフィックを見ましたが、明らかに十分に慎重ではありませんでした。
最初にHTTP 302とロケーションのみを含むパケットが送信され、次に通常のサイト応答を含むパケットが送信されます。
ただし、システムは2番目のパケットを破棄せず、1番目のパケットと統合します。
つまり パッケージが来る
1HTTP / 1.1 302が見つかりました 接続:閉じる 場所:http://95.167.13.50/?st=0&dt=192.237.142.117&rs=grani.ru/2そして、アプリケーションはこれを見ますHTTP / 1.1 200 OK サーバー:nginx / 1.2.1 日付:日曜日、2015年2月1日17:34:03 GMT Content-Type:テキスト/ html; 文字セット= utf-8 転送エンコード:チャンク 接続:キープアライブ 6d7 <!DOCTYPE HTML> ...
だからHTTP / 1.1 302が見つかりました 接続:閉じる 場所:http://95.167.13.50/?st=0&dt=192.237.142.117&rs=grani.ru/ f-8 転送エンコード:チャンク 接続:キープアライブ 6d7 <!DOCTYPE HTML> ...
これは、WindowsとLinuxの両方で見られます。
しかし、上記のiptablesルールは実際に問題を解決します。
+1回避策。
この方法は、ゲートウェイ/ルーターでも使用できます。 もちろん、ルールはFORWARDチェーンに追加する必要があります。