Как установить IP-адрес источника для HTTP-запроса?

Мне нужно установить исходный IP-адрес (для чего-то вроде IP Spoofing) перед отправкой HTTP-запроса. Класс, используемый для настройки http-соединения, - HTTPURLConnection. Я нашел ниже ссылку на stackoverflow, которая действительно полезна.

Регистрация и использование настраиваемого протокола java.net.URL

Как и в сообщении, я уже создал 3 класса, расширяя URLConnection, URLStreamHandler и реализуя URLStreamHandlerFactory. Это выглядит нормально; однако я получаю исключение, которое, по моему мнению, связано с тем, что я не реализовал getInputStream для URLConnection, как было упомянуто выше.

У меня есть пара вопросов
1 > Я расширяю пользовательский класс URLConnection из HTTPURLConnection, так что необходимость реализации getInputStream, так или иначе, это виртуальный метод
2 > Если мне это нужно, может ли кто-то предоставить примерную реализацию этого метода?

Ответ 1

JMeter уже предоставляет функцию IP Spoofing.

В запросах по умолчанию Http выберите вкладку расширенной вкладки (в версии 3.0 JMeter):

введите описание изображения здесь

См. http://jmeter.apache.org/usermanual/component_reference.html#HTTP_Request_parms1:

Исходное поле адреса [Только для HTTP-запроса с реализацией HTTPClient] Это свойство используется для включения IP Spoofing. Он переопределяет локальный IP-адрес по умолчанию для этого образца. Хост JMeter должен иметь несколько IP-адресов (например, IP-алиасы, сетевые интерфейсы, устройства). Значение может быть именем хоста, IP-адресом или устройством сетевого интерфейса, таким как "eth0" или "lo" или "wlan0". Если определено свойство httpclient.localaddress, которое используется для всех запросов HttpClient.

Ответ 2

Чтобы выполнить другой адрес источника с помощью HTTP-запроса, вы можете использовать локальный прокси.

import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.MalformedURLException;
import java.net.Proxy;
import java.net.URL;
import java.net.URLConnection;
import java.net.UnknownHostException;

public class Huhu {
    public static void main(String[] args) throws IOException {
        URL url = new URL("http://google.com");
Proxy proxy = new Proxy(Proxy.Type.DIRECT,
    new InetSocketAddress(
        InetAddress.getByAddress(
                new byte[]{your, ip, interface, here}), yourTcpPortHere));
URLConnection conn = url.openConnection(proxy);
    }
}

Вам не нужно что-то переопределять.

Ответ 3

На основе ответа UBIK LOAD PACK. Вот такой же код, используя Aapche http client 3.x. (Переменная для установки IP-адреса источника args[1])

import org.apache.commons.httpclient.*;
import org.apache.commons.httpclient.methods.*;
import org.apache.commons.httpclient.protocol.Protocol;

public class HC3Test {  
  public static void main(String[] args) throws Exception {
    String url = args[0];
    java.net.URL uri = new java.net.URL(url);
    HostConfiguration hc = new HostConfiguration();
    hc.setHost(uri.getHost(), uri.getPort(), Protocol.getProtocol(uri.getProtocol()));
    hc.setLocalAddress(java.net.InetAddress.getByName(args[1]));//for pseudo 'ip spoofing'

    HttpClient client = new HttpClient(new SimpleHttpConnectionManager());
    client.setHostConfiguration(hc);
    GetMethod method = new GetMethod(url);
    client.executeMethod(method);
    method.releaseConnection();
  }
}

Пример кода для http client 4.x:

import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.params.ConnRoutePNames;

public class HC4Test {
  public static void main(String[] args) throws Exception {
    DefaultHttpClient httpClient = new DefaultHttpClient();
    org.apache.http.params.HttpParams params = httpClient.getParams();
    params.setParameter(ConnRoutePNames.LOCAL_ADDRESS, 
       java.net.InetAddress.getByName(args[1]));//for pseudo 'ip spoofing'
    httpClient.execute(new HttpGet(args[0]));
  }
}