Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Лучшие статьи журнала «Компьютеры+Программы»


Информационный Канал Subscribe.Ru

Здравствуйте, уважаемые читатели!

В этом выпуске рассылки публикуется статья, занявшая по результатам голосования второе место.


Арсений Чеботарёв,
ac@comizdat.com

FireWall: попытка к бегству

Когда люди говорят мне по аське, что у них нет интернета,— я понимаю, что они имеют в виду Web. Первой моей реакцией было: «а это как?», ведь инет — как бы несущая для аськи. Оказывается, админы с подачи «доброго, но справедливого» руководства прикрывают своим сотрудникам Web. Хех, чувачки, балонить юзера — это неправильно!

Работа должна быть интересной и высокооплачиваемой — и тогда люди не будут на ней заниматься глупостями (или будут — если им за это платят, вот как мне). А если «торбить» народ без денег и всякой перспективы, да еще, плюс к этому, прикрывать ему маленькие радости… ну ваще кошмар. Админы, конечно, ни при чем — они именно та «привилегированная часть» трудового пролетариата, которую буржуины использует как надсмотрщиков над остальными. Маркс об этом хорошо писал. Да ладно, бес с ним, с этим Марксом — нужно закатывать рукава и исправлять ситуацию.

Первый вопрос прост: как админ прикрывает Web (или, по-научному, HTTP-протокол)? Ну, естественно, фильтрует исходящие пакеты по номеру порта. А какие же такие порты он прикрывает? Первое приближение — все. Это, конечно, пиковая ситуация — но Большую Сеть можно получить и в этом случае :-). Например, можно прокидывать IP-пакеты в MIME-кодировке или готовые HTML-страницы через корпоративную почту. Через почту вообще много чего можно (см., к примеру).

Мы попробуем вырваться на волю простым, но действенным способом — без «манглинга» пакетов и тому подобных вещей, поскольку все это требует «друзей на воле» — то есть, например, Linux box'а, находящегося вне вашей локальной сети и подключенного к Сети напрямую, а этот вариант мало кому из пользователей доступен.

Сначала рассмотрим странного (в смысле доброго) админа, который прикрыл не все порты, а лишь те, которые были заподозрены им как имеющие отношение к HTTP-серверам и прокси: 80, 3128, 8080, редко — 81, 8000. Это очень хорошая для нас ситуация, поскольку есть (по непонятной причине существуют) анонимные HTTP-прокси, которые работают на других портах. Единственная проблема — найти их. Все происходит в четыре действия: сначала закачиваем список прокси с какого-нибудь авторитетного сайта, например с www.proxybench.com. Естественно, делать это руками никто не хочет — лучше использовать скрипт, чтобы наши данные попали сразу в БД. Я, например, использую NQL (см. «К+П» № 7/2003), мне так удобно — но вы, конечно, можете легко перенести все это на любой другой язык:
record #newproxy = number, ip, port, type, lastc
opendb "proxy": table "proxy"
for page=9,61
{
get "http://www.proxybench.com/proxy/proxylist.asp?whichpage=
{page}&format="
match "Date Last Checked</b></td>"
while (match ("<tr> <td>{number}</td><td>{ip}</td>
<td>{type}</td><td>{lastc}</td></tr>",true))
{
port=80
if (contains (ip,":"))
{
push ip
match "{ip}:{port}"
pop
}
addrecord #newproxy
}
}
closedb

Структура базы данных ясна — пять полей. Эту базу можно создать в чем угодно, хоть в Access. Два не очевидных замечания. Первое: почему мы начинаем с 9-й страницы? А потому, что первые восемь (потенциально более новые данные) — только для члено-мемберов, за деньги. Второе: при работе этой программы некоторые «кривые» данные «не пролазят» в базу данных. Вы, конечно, можете разобраться, в чем там дело — но таких данных там не много, поэтому я просто положил на это с прикладом. Третье (а я обещал два? Накладочка :-)) — это маленькая просьба закрыть БД в Access'е перед запуском этой проги. В противном случае данные по ODBC (стандартный метод доступа для NQL) не добавятся в базу.

Дальнейшее действие — отфильтровать наши прокси, поскольку там и Анонимные, и остальные, и на разных портах и так далее. Поскольку (спасибо NQL) у нас все уже в БД, то фильтровать просто:
SELECT proxy.ip, proxy.port FROM proxy
WHERE (((proxy.port)<>80 And
(proxy.port)<>3128 And
(proxy.port)<>8080 And
(proxy.port)<>81 And
(proxy.port)<>8000) AND
((proxy.type)="Anonymous"))
ORDER BY proxy.port DESC;

Конечно, вы можете представлять ситуёвину иначе и фильтровать по другим портам, если знаете что-то, чего я не знаю. Из оставшихся портов вы найдете чудеса на любой вкус — например, кто-то умный повесил Squid на 5190, что обычно может распознаваться как порт ICQ. Если аська у вас открыта — можете для начала попробовать эти порты (в смысле, эти прокси). Кроме того, некоторые открывают прокси на 1080 — это порт Socks Proxy 4/5, тоже может быть открыто. Ну и, конечно, масса всяких разных остальных — например 443, порт для SSL.

Следующее — это пробить эти прокси, чтобы понять, что у вас работает, а что нет. Тут не нужно изобретать ничего нового, есть простые способы, из которых самый простой — просто попробовать получить какую-то простую страницу из Сети через прокси. Для настройки получения через прокси можно использовать и автоматизированный браузер через тот же NQL, и Internet Transfer Control — ActiveX-компонент, чаще всего используемый в Бейсике. Немного интереснее использовать Indy-компонент InHTTP в Delphi: тривиальный пример расположен вот здесь (по-моему там ошибка —.Request.ProxyConnection обозначает что-то другое, а не настройки прокси). Мы немного модифицируем этот код (там такой копирайт смешной — чуть ли не лицензия на такой банальный код!) с тем допущением, что список наших проксей содержится в файле и что, кроме того, мы не будем делать ошибок. Еще одна переделка — исправлен URL (поскольку по новым правилам Google запросы переадресовываются на локализованные страницы — и для www.google.com мы получим исключение с кодом ошибки «Page temporary moved»). Основной код без деклараций выглядит так:
procedure TForm1.FormCreate (Sender: TObject);
begin
with OPenDialog1 do begin
Execute;
AssignFile (f,FileName);
end;
Reset (f);
end;

procedure TForm1.Button1Click (Sender: TObject);
var
s,proxy:string;
isokay:boolean;
i,port:integer;
begin
Timer1.Enabled:=false;
if (not eof (f)) then begin
Readln (f,s);
i:=Pos (#9,s);
proxy:=LeftStr (s,i-1);
port:=StrToInt (MidStr (s,i+1,Length (s)));
isokay:=true;
try
IdHTTP1.ProxyParams.ProxyServer:=proxy;
IdHTTP1.ProxyParams.ProxyPort:=port;
IdHTTP1.Get ('http://www.google.com.ua/index.html');
IdHTTP1.Disconnect;
except
on E:EIdException do
isokay:=false;
end;
if isokay then begin
Memo1.Lines.Add (proxy+':'+IntToStr (port)+' OK');
end else begin
Memo1.Lines.Add (proxy+':'+IntToStr (port)+' BAD');
end;
end else begin
CloseFile (f);
Label1.Caption:='Done';
end;
Timer1.Enabled:=true;
end;

procedure TForm1.Timer1Timer (Sender: TObject);
begin
Button1.Click;
end;

На форме лежат: таймер, диалог открытия файла и InHTTP, кнопка, окно прокрутки и лейба — одна штука.

Таймер нужен для прерывания работы закачки и отрисовки списка — поскольку InHTTP работает синхронно в режиме с блокировкой, то программа нормально находится в состоянии «не отвечает». Конечно, тут можно создать один или несколько потоков, но для нас это пока не суть важно.

Открываемый программой файл — текстовый список прокси, отобранных ранее. Имя (адрес) прокси от порта отделяется символом #9 — это штатный результат, если вы перетащите строки из Access в текстовый файл. Примерный вид файла:
10.0.0.13 3128
207.224.82.91 55303
207.224.82.91 55303
217.123.94.29 40718
…

Первая строка — гарантированно работающий прокси (в моей подсети — у вас, может, будет что-то другое или даже вообще ничего), для проверки программы.

Конечно, все перечисленное не гарантирует, что вы сможете таким путем вырваться на волю — это просто первая попытка, первое приближение. Все зависит от того, насколько плотно вас «обложили». Если вы можете выходить в Сеть, по крайней мере, по одному протоколу (например, имеете возможность получать почту по POP3) и у вас есть «внешний» комп — то задача решается сравнительно просто: на внешнем компе запускается HTTP-прокси (Squid) на нужном порту. Более сложные методы основаны на «прокапывании» туннелей (возможно даже и не через IP). Но, поскольку туннель суть палка о двух концах, то тоже подразумевается, что снаружи вас кто-то ждет.

В конце концов, если доступ в Web того стоит и с деньгами не напряг - можно поставить свою «левую» тарелку, прокинуть WiFi, радиомодем или воспользоваться GPRS. Вариант: если у вас дома подключение по кабелю и есть персональный телефон на работе, то можно дозваниваться туда модемом - как к провайдеру. (Но тогда - если вы при таких делах - кто вообще вам может указывать? Вот, короче, и получается - «счастливым без денег всегда можно стать, но лучше с деньгами, греби его мать».)

Чисто в ознакомительных целях выкладываю готовый отфильтрованный список прокси и проект Delphi — ищите на КП-диске. У меня, кстати, все получилось — хотя интернет мне никто не прикрывал, но пару обводных каналов все равно удалось найти. Вполне возможно, что это удастся и вам.

Арсений Чеботарёв,
ac@comizdat.com


Задать вопрос
Прислать свою статью для публикации в журнале
Просто поговорить

До следующего выпуска!
Елена Полонская, редактор "К+П"
www.comizdat.com

Перепечатка материалов этой рассылки разрешается только по согласованию с редакцией журнала "Компьютеры+Программы"



http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное