Python – как определить, будут ли входящие соединения с использованием прокси или нет

Я работаю над простой программой, написанной на Python, которая перехватывает поступающие сетевые пакеты. Затем позвольте пользователю использовать дополнительные модули, такие как обнаружение DoS или предотвращение Ping. С помощью сниффера я могу получить IP-адрес, MAC-адрес входящих подключений, флаг протокола и содержимое пакета. Теперь я хочу добавить новый модуль, который обнаруживает, использует ли отправитель прокси или нет, и делает что-то в соответствии с этим. Я искал методы, которые можно использовать с Python, но не нашел полезного. Сколько существует способов обнаружения прокси для Python?

Моя часть кода сниффера выглядит примерно так:

.....
sock = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, 8)
while True:
    packet = sock.recvfrom(2048)
    ipheader = packet[0][14:34]
    ip_hdr = struct.unpack("!8sB3s4s4s", ipheader)
    sourceIP = socket.inet_ntoa(ip_hdr[3])
    tcpheader = packet[0][34:54]
    tcp_hdr = struct.unpack("!HH9ss6s", tcpheader)
    protoFlag = binascii.hexlify(tcp_hdr[3])
    ......

person JustCode    schedule 21.07.2015    source источник


Ответы (2)


Во-первых, вы имеете в виду входящие пакеты. во-вторых,

С точки зрения TCP сервера, он подключен к прокси, а не к нисходящему клиенту.

поэтому ваш сервер не может определить, что из пакета задействован прокси-сервер. однако, если вы находитесь на уровне приложения, таком как http-прокси, может быть доступен заголовок X-forwarded-for, в котором будет исходный IP-адрес клиента. Я сказал, что это может быть связано с тем, что прокси-сервер решит, отправлять вам этот заголовок или нет. Если вы ожидаете входящие HTTP-соединения с вашим сервером, вы можете взглянуть на urllib2, хотя я не уверен, что вы можете получить доступ к X-forwarded-for с помощью этой библиотеки.

Из документов:

urllib2.urlopen (url [, данные] [, время ожидания])

...

Эта функция возвращает файлоподобный объект с двумя дополнительными методами:

geturl() — возвращает URL-адрес извлеченного ресурса, обычно используется для определения того, было ли выполнено перенаправление.

info() — возвращает метаинформацию страницы, такую ​​как заголовки, в виде экземпляра mimetools.Message (см. Краткий справочник по HTTP-заголовкам)

поэтому использование info() извлечет заголовки. надеюсь, вы найдете там то, что ищете.

person mid    schedule 21.07.2015
comment
Хорошо, тогда помимо этого сниффера есть ли другие способы, которые я могу использовать для обнаружения прокси с помощью Python? - person JustCode; 22.07.2015

Способов сделать это не так много, так как прокси/виртуальные частные сети выглядят как реальный трафик. Чтобы добавить к тому, что сказал Мид, вы можете искать заголовки и / или пользовательские агенты, которые помогут вам определить, использует ли пользователь прокси или VPN.

Единственное известное мне бесплатное решение — это getIPIntel, которое использует списки блокировки, машинное обучение и статистику, чтобы определить, является ли IP прокси/VPN или нет.

Есть и другие платные решения вроде maxmind и block.

Что вам нужно сделать, так это отправить запросы API к этим службам и проанализировать результаты.

person S W    schedule 24.07.2015
comment
Я планирую создать модуль, который сначала проверяет адрес whatismyipaddress(whatismyipaddress.com/ip), а затем в соответствии с результатом он будет проверять большие списки прокси для этого IP, но меня беспокоит только его скорость. Что вы думаете об этом? Эти проверки могут замедлить мой инструмент, даже если я использую потоки? - person JustCode; 25.07.2015
comment
Whatsmyipaddress не так точен. Например, найдите IP-адрес 104.255.227.xxx в двух разных службах. Кроме того, whatsmyipaddress может заблокировать ваши автоматические запросы, если вы делаете их слишком много по сравнению с GetIPIntel, который предназначен для автоматических запросов. Конечно, запросы к внешним службам приведут к замедлению, но оно не должно быть таким долгим. Проведите некоторое тестирование со своей стороны, чтобы увидеть, приемлемо ли это. - person S W; 26.07.2015
comment
Да, я проверил это с помощью whatismyipaddress, некоторые прокси-адреса, перечисленные в других «актуальных» базах данных прокси в Интернете, не обнаруживаются с помощью whatismyipaddress. Именно поэтому я планирую проверить все базы, которые я нашел вместе с whatismyipaddress и GetIPIntel. Я думаю, что давать баллы по этим тестам, а затем использовать этот балл будет более успешно. Например; один IP получает 0,1 от whatis... и 0,1 для каждой базы данных прокси. Общий балл, такой как; 0,7, будет баллом, который я буду изучать. Причина, по которой я хочу использовать много разных источников, состоит в том, чтобы сделать их более точными. - person JustCode; 26.07.2015
comment
В этом есть смысл. Извлечение данных из нескольких источников и указание, какой из источников перевешивает другой, если есть конфликт, — хороший выбор. Если вы добавите слишком много, возникнет проблема со скоростью, как вы упоминали ранее. Удачи вам в реализации. - person S W; 27.07.2015