web-dev-qa-db-ja.com

カスタムIPを使用したCURLリクエストの送信

それは可能ではないでしょうか?応答が不要で、リクエストを送信したいとします。私たちのコンピューターがそれを送信するので、tcp/ipヘッダーを変更することはできませんか?私はおそらく何かが足りないので、本当に興味があって、大学でそれについて学んでいます。

20
tmm

-H/--header引数:

あなたはあなたのIPアドレスを偽装することができます:

curl --header "X-Forwarded-For: 192.168.0.2" http://example.com

例:
クライアント

$ curl http://webhost.co.uk  

ウェブホスト

$ tailf access.log | grep 192.168.0.54   
192.168.0.54 - - [10/Nov/2014:15:56:09 +0000] "GET / HTTP/1.1" 200 14328 "-"   
"curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.14.0.0 zlib/1.2.3   
libidn/1.18 libssh2/1.4.2"

IPアドレスが変更されたクライアント

$ curl --header "X-Forwarded-For: 192.168.0.99" http://webhost.co.uk   

ウェブホスト

$ tailf access.log | grep 192.168.0.99  
192.168.0.99 - - [10/Nov/2014:15:56:43 +0000] "GET / HTTP/1.1" 200  
14328 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.14.0.0  
zlib/1.2.3 libidn/1.18 libssh2/1.4.2"  

man curl

 -H/--header <header>
              (HTTP)  Extra header to use when getting a web page. You may
              specify any number of extra headers. Note that if you should add
              a custom header that has the same name as one of the internal
              ones curl would use, your externally set header  will  be  used
              instead  of the internal one. This allows you to make even
              trickier stuff than curl would normally do. You should not
              replace internally set headers without knowing perfectly well
              what you’re doing. Remove an internal header by  giving  a
              replacement without content on the right side of the colon,
              as in: -H "Host:".

参照:

Modify_method_and_headers

27
geedoubleya

受け入れられた回答は、IPを完全に偽装するのに実際には役立つとは思いません。ターゲットマシンに近いルーターにアクセスできない限り、ソースIPを実際に偽装することはできません。

TCPは3ウェイハンドシェイクメカニズムで動作します。ターゲットマシンからのハンドシェイク応答は、自分のIPではなく偽装されたIPに送られるため、このハンドシェイクを完了することはできません(前述のように、近くのルーターを制御して応答を自分にリダイレクトしない限り)。

PS:UDPメッセージを送信できるかもしれませんが、私は試していません。

4
looneyGod

ローカルネットワークインターフェイスに複数のIPアドレスがある場合は、送信元IPアドレスを変更できます。

1.1.1.102.2.2.20の2つのIPアドレスを持つサーバーがあるとします。

$ ip route
default via 1.1.1.193 dev eth0 
1.1.1.192/27 via 1.1.1.193 dev eth0 
1.1.1.192/27 dev eth0  proto kernel  scope link  src 1.1.1.10
2.2.2.20 via 2.2.2.20 dev eth0  scope link

現在のパブリックIPアドレスは、すばらしい ifconfig.co Webサービスで確認できます。

$ curl -4 ifconfig.co
1.1.1.10

他のIPアドレス(2.2.2.20)を使用して ifconfig.co Webサービスにアクセスするには、ターゲットサーバーのIPアドレスに基づいてルートを作成できます。 Digを使用して、DNS AレコードからターゲットIPアドレスを見つけます。

$ Dig ifconfig.co
...
ifconfig.co.            39      IN      A       104.28.18.94
ifconfig.co.            39      IN      A       104.28.19.94
...

次に、これらのIPアドレスのカスタムルートを追加します。

$ ip route add 104.28.18.94/32 via 1.1.1.193 dev eth0 src 2.2.2.20
$ ip route add 104.28.19.94/32 via 1.1.1.193 dev eth0 src 2.2.2.20

Curlを再度実行すると、他の送信元IPアドレスを使用していることがわかります。

$ curl -4 ifconfig.co
2.2.2.20

また、ルーティング情報が更新されます。

$ ip route
default via 1.1.1.193 dev eth0 
1.1.1.192/27 via 1.1.1.193 dev eth0 
1.1.1.192/27 dev eth0  proto kernel  scope link  src 1.1.1.10
2.2.2.20 via 2.2.2.20 dev eth0  scope link
104.28.18.94 via 1.1.1.193 dev eth0  src 2.2.2.20
104.28.19.94 via 1.1.1.193 dev eth0  src 2.2.2.20

注:これは、ソースIPアドレスをサーバーに解決できる場合にのみ機能します。そうでない場合、TCP 3ウェイハンドシェイクは、指摘されているように here で失敗します。

1
pymkin