книги хакеры / журнал хакер / 104_Optimized
.pdf
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
|
.c |
|
|
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>>
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
C |
E |
|
|
|||
|
|
X |
|
|
|
|
|||
|
- |
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|||
ХАКЕР.PROBUY |
|||||||||
w Click |
to |
|
|
|
|
m |
|||
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
g |
|
|
|
|
|
|
df |
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
Конфигурация ядра для работы с Iptables
Каждаяизтаблицсодержитвсебенесколькологическихцепочек,порядокпрохождениякоторыхопределяетсявекторомпакета.Вотдефолтныецепочкиэтихтаблиц:
Mangle: PREROUTING, INPUT, FORWARD, OUTPUT,
POSTROUTING
Nat: PREROUTING, OUTPUT, POSTROUTING
Filter: INPUT, FORWARD, OUTPUT
Конечно,ничтонемешаетнамдобавитьсвоюцепочку.Этоможетпо требоватьсядлятого,чтобызарулитьпакетынасистемуучетатрафика. Порядокпрохождениявходящихиисходящихпакетовболеенаглядно представленнасхеме.Несложноувидеть,что,если,допустим,пакет идетчерезшлюзкрабочейстанции,онпроходитследующийпорядок цепочек:Mangle:PREROUTINGNat:PREROUTINGFilter:FORWARD Mangle:FORWARDNat:POSTROUTINGMangle:POSTROUTING.
Чтобыперенаправитьпакетссетевогоинтерфейсасерверанапорт1433 машины192.168.2.100,намнужнодобавитьсоответствующееправилов таблицуnat,вцепочкуPREROUTING.
Какустанавливать
Дляначалаубедись,чтоядрособраносподдержкойNetfiler.Дляэтого зайдивисходникиядраинабериmakemenuconfig(илиmakexconfig). Затемперейдивследующуюветку(дляядра2.6.x):«Networking NetworkingoptionsNetworkpacketfilteringframework(Netfilter)IP: NetfilerConfiguration»иотметьвсеопциикакмодули.Затемоткрой/etc/ sysctl.confидобавьвконецстроку«net.ipv4.ip_forward=1».
ТеперькачайсвежийпакетIptablesиустанавливайегостандартными
«./configure;make;makeinstall».Послеэтогоутебядолженпоявиться файл/etc/init.d/iptables.ОнзаставитIptablesработатьвролисервиса. Убедись,чтофайлреальнозапуститсяпризагрузке,дляэтогонабери вконсоли«chkconfig--level345iptableson».Наэтомустановкуможно считатьзавершенной.
Какпользоваться
Теперьявкратцепоясню,какработатьсIptablesикакиекомандыпри этомнужноиспользовать.Команда iptables-L позволяетпросматривать содержимоетаблицы.ПоумолчаниюиспользуетсятаблицаFilter.Для тогочтобыявнымобразомуказатьдругую,добавляем-ttablename.Вмес- тесключом‘-L’можноиспользоватьещенесколькополезныхопций. Например,‘-n’—применяетсядлятого,чтобызаменитьвсестроковые данныечисловыми;‘-v’—подробныйрежим,отображаетназваниясете- выхинтерфейсовиколичествопереданныхипринятыхпакетов;‘--line- numbers’—спомощьюэтогоаргументаможнопронумероватьстроки, этобываетполезно,когдатребуетсяудалитькакую-тострокупосреди
Редактируем правила файрвола
оченьдлиннойцепочки.Такимобразом,чтобывывестивсюинформа-
циюпотаблицеNat,пишем:iptables-L-nv-tnat–-line-numbers.
ВпакетIptablesвходятещедвеутилиты:iptables-save(длясохранения таблиц)иiptables-restore(дляихвосстановления).Еслидлятогочтобы сохранитьтаблицы,достаточнонаписать«iptables-save-tnat>/etc/ iptables.save»,тоутилитавосстановлениявоспринимаеттолькостандарт ныйпотоквыводанаэкран:iptables-restore|cat/etc/iptables.save.Но
неспешипрописыватьэтовrc.local,всегораздопроще.Длясохранения настроек,которыепослеперезагрузкибудутсамивосстанавливаться,
нужнонаписать«serviceiptablessave»—ивсе!
Какконфигурировать
Дляначалазакроемвселишнееснаружи,отфильтруемлевыеадресаот MSSQLипереадресуемнеобходимыепортыпоихпрямомуназначению. Проверьспомощьюnmapналичиеоткрытыхпортов:nmap127.0.0.1.
Допустим,утебяоткрытыпорты21,22,80,111,139,445,953,993,1723и 2628.Уменянетникакогожеланияоткрыватьдоступна22 йпортснаружи,поэтомусделаемтак,чтобыстучатьсяизнутринанегомоглатолько однамашина—192.168.1.100.Аизвненаправимнанеевсепакетыс 22 гопорта.ЕслизлоумышленникизайдетпоSSH,пустьдумает,чтозахватилсервер!Нонасамомделеонбудетнаходитьсянапустоймашинес однимтолькоSSH.Адошлюзаещедалеко...
# iptables -A PREROUTING -i eth0 -p tcp -m tcp \ --dport 22 -j DNAT --to-destination 192.168.1.100 \ -t nat
Именнотакбудетвыглядетьстрока,котораяперенаправитпакетыс 22 гопорташлюзанасервер192.168.1.100.Теперьзакроемэтотпортдля всехмашиниоткроемтолькодля192.168.1.100:
#iptables -I INPUT 1 -i 192.168.1.100 -p tcp \ --dport 22 -j ACCEPT
#iptables -I INPUT 2 -p tcp --dport 22 -j REJECT \ --reject-with icmp-port-unreachable
Примечание:правило,стоящеевцепочкевыше,являетсяболее привилегированным.
Длятогочтобыотрезатьпакет,используетсяправилоDROP,ноесли внимательнопочитатьруководствопоIptablesнасайтеразработчика,то можноувидеть,чтоавторрекомендуетприменятьREJECT,воизбежание различных*DoS-атак.
Ипоследнимшагоммыотрубимвселишниепорты.Пустьонипо-пре- жнемубудутвидныизнутри,нонавнешнеминтерфейсеeth0нужно оставитьсамыйминимум:
xàêåð 08 /104/ 07 |
139 |
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
C |
E |
|
|
|||
|
|
X |
|
|
|
|
|||
|
- |
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|||
>>to BUYХАКЕР.PRO |
|||||||||
w Click |
|
|
|
|
|
m |
|||
w |
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
g |
|
|
|
|
|
|
df |
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
||||
|
- |
|
|
|
|
|
d |
|
|||
|
F |
|
|
|
|
|
|
t |
|
||
|
D |
|
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
|||||
|
|
|
|
|
|
||||||
w |
|
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
|||
|
|
p |
|
|
|
|
g |
|
|
||
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
|
-x cha |
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
Смотрим статистику
#iptables -A INPUT -i eth0 -p tcp \ -m multiport \
--dports 21,111,139,445,953,993,1723,2628 \ -j REJECT --reject-with icmp-port-unreachable
Кстати,впоследнейстрочкевместо‘-mmultiport’можнопоставить‘-mtcp’ исформироватьотдельноеправилодлякаждогоизпортов.Тактысможешьвидетьколичествопакетов,полученныхнакаждыйотдельныйпорт, и,соответственно,реальнооцениватьнагрузкуивозможнуюугрозу.
#iptables -A PREROUTING -d 100.100.100.100 \ -p tcp -m tcp --dport 443 -j DNAT \ --to-destination 192.168.3.100 -t nat
#iptables -A PREROUTING -d 100.100.100.100 \ -p tcp -m tcp --dport 80 -j DNAT \ --to-destination 192.168.0.100 -t nat
#iptables -A PREROUTING -d 100.100.100.100 \ -p tcp -m tcp --dport 1433 -j DNAT \ --to-destination 192.168.2.100 -t nat
Такмызарулимпакетыпоихпрямомуназначениюнадругиесерваки. Следующимистрочкамимыподружимсетевыеинтерфейсымежду собой.Какправило,длятакихцелейиспользуютхардварныемаршрутизаторы,номыженесобираемсяменятьнесколькоящиковпивана какие-тожелезныеподелки,которыектомужеэлементарнозаменяются одним-единственнымLinux+Iptables:).
#iptables -A FORWARD -i eth1 -o eth2 -j ACCEPT
#iptables -A FORWARD -i eth1 -o eth3 -j ACCEPT
#iptables -A FORWARD -i eth1 -o eth4 -j ACCEPT
...
#iptables -A FORWARD -i eth4 -o eth3 -j ACCEPT
Каксчитатьтрафик
Понятно,чтоеслидажевсепакетырулятся,портыфильтруются,но сервакнеумеетсчитатьпроходящийчерезнеготрафик,тогрошценатакомуадминству.Этупроблемумырешимследующимобразом:создадим цепочку,котораяспомощьюправилаQUEUEбудетссылатьсяналюбую понравившуюсятебесистемуучета.ЯвыбралNeTAMS.Последнюю версиюэтойзамечательнойпрограммыможноскачатьсnetams.com. РазличныеFAQиинструкциипоустановкележаттамже.
ПравилоQUEUEзанимаетсятолькотем,чтопосылаетпоступивший пакетвочередьнапользовательскоеприложение.Длятогочтобыимвоспользоваться,нужновоткнутьвядростандартныйобработчикочереди дляIPv4—модульip-queue.Делаетсяэтопримернотак:
Схема сети
#modprobe iptable_filter
#modprobe ip_queue
Теперьсоздадимцепочку,вкоторуюбудемотправлятьвесьтрафикдля подсчета:
# iptables -N COUNTER
Напишемодно-единственноеправило,апоцепочкепустимвсеоставши- есяпакеты:
#iptables -A COUNTER -j QUEUE
#iptables -A FORWARD -i eth0 -j COUNTER
#iptables -A FORWARD -o eth0 -j COUNTER
Здесь есть один очень важный момент. Дело в том, что с помощью приведенных выше правил все входящие и исходящие пакеты поступают в системную очередь, откуда их будет брать NeTAMS. Однако если в момент активизации Iptables NeTAMS не будет запущен, пакеты поступят в системную очередь и там потеряются, поскольку не будет программы, которая отправит их обратно. В результате пропадет коннект с сервером. Поэтому в процессе отладки надо либо сидеть за консолью сервера, либо, в случае удаленного администрирования, тренироваться на ICMP-трафике. А порядок запуска такой: сначала запускаем NeTAMS, потом — Iptables. Соответственно, остановка осуществляется в обратном порядке: сначала останавливаем Iptables,
потом — NeTAMS.
Тонкаязаточка
Вот,собственно,ивсе,чтотребовалосьдлятого,чтобыпакетыначали ходитьпострунке,апортыотпинывалинезваныхгостей.Теперьсамое времязанятьсятонкойнастройкой.Принеобходимостиможноотступитьотстандартныхправил:
//Вместо прямого адреса можно указать доменное имя:
# iptables -A INPUT -s test.host.jp -j DROP
//В качестве пункта назначения задаем целую подсеть:
# iptables -A INPUT -s 192.168.133.0/24 -j DROP
//Восклицательный знак означает исключение. То есть в данном случае дропятся все адреса, кроме указанного:
# iptables -A INPUT -s ! 192.168.133.156 -j DROP
Кактыужезаметил,несколькоразвправилахмыуказывалиопцию‘-p’. Оназадаетобрабатываемыйпротокол.Можноиспользоватьall,icmp, tcp,udp.
140 |
xàêåð 08 /104/ 07 |
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
>>
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
C |
E |
|
|
|||
|
|
X |
|
|
|
|
|||
|
- |
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|||
ХАКЕР.PROBUY |
|||||||||
w Click |
to |
|
|
|
|
m |
|||
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
g |
|
|
|
|
|
|
df |
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
Нижеописаныстандартныеправиладляцепочек,которыеуказываются сключом‘-j’:ACCEPT—разрешитьпакет;DROP—уничтожитьпакет; REJECT—будетотправленоICMP-сообщениеотом,чтопортнедосту- пен;LOG—информацияобэтомпакетебудетдобавленавсистемный журнал(syslog).
Скрытыевозможности
Вотмыиподошликсамомусладкому...Еслитысчитаешь,чтоуIptables слишкомузкийнаборвозможностей,тоэтачастьстатьикакраздля тебя.Ссайтаftp.netfilter.orgскачайпоследнююверсиютарболаpatch-o- matic,этотпатчдобавляетIptables54расширения.Естьверсиидляядер 2.4и2.6.Установкапакетадостаточнопроста(возможно,patch-o-matic ужесобранвтвоем«коробочном»ядре,особенноеслитысчастливый обладательсерверногодистрибутива):
// Для Linux 2.4
# KERNEL_DIR=путь_к_сорцам_ядра_2.4 ./runme pending
// Для Linux 2.6
# KERNEL_DIR=путь_к_сорцам_ядра_2.6 \ IPTABLES_DIR=путь_к_сорцам_iptables ./runme pending
ЗатемследуетперекомпилироватьядроиIptables.Послеэтогоpatch- o-maticстановитсячастьюIptables,исовсемиегоправиламиицелями можноработатькаксовстроенными.Длятогочтобыполучитьпомощь полюбомурасширению,введивконсоли:
# iptables -m любая_цель_или_правило -–help
РасширениеLength
РасширениеLengthобрабатываетправилавсоответствиисзаданной длинойпакета:
#iptables -A INPUT -p icmp --icmp-type echo-request \ -m length --length 86:0xffff -j DROP
Этоперекроеткислородвсем,ктобудетпинговатьтебябольшечемпо 86байтзаодинприсест.
РасширениеNth
РасширениеNth—ещеоднаполезнаянадстройканадIptables.Она обрабатываеткаждыйN’ыйпакетпозаданномуправилу.Например,сле- дующаястрочказадропиткаждыйвторойпакеттипаicmpecho-request:
#iptables -A INPUT -p icmp --icmp-type echo-request \ -m nth --every 2 -j DROP
ЕслитебяпостояннотерроризируютDoS/DDoS-атаками,советуюпоб- лижепознакомитьсясдвумявышеописаннымимодулями.
РасширениеPsd
Этооченьполезноерасширение,котороеперехватываетсканирование портов.Противграмотногоиспользованияnmappsdбудетбессилен,но большинствотопорныхпробонраспознаетипресекаетнакорню.Этим правиломмызахватываемсразувсеимеющиесяпорты:
# iptables -A INPUT -m psd -j DROP
РасширениеString
Это расширение анализирует область данных пакета и на основе этого производит фильтрацию. Здесь важно не перестараться. Если тебя одолевают спамеры, а от слова porno тебя слегка потрясывает, можешь добавить следующую строку:
#iptables -A FORWARD -i eth0 -p tcp --sport 25 -m string --string ‘porno’ -j DROP
Пакетисчезнетпрежде,чемдойдетдотвоегоспам-фильтра.Незабывай, чторасширениечувствительнокрегиструсимволов!
Расширениеtime
Это расширение обрабатывает пакеты в указанное время. Следующий пример демонстрирует ограничение доступа к серверу по пятницам с 2:00 до 4:15 (например, для выполнения планового обновления):
# iptables -A INPUT -p tcp -d 80 -m time \ --timestart 02:00 --timestop 04:15 --days Fri \ --syn -j REJECT
Всетриключа,‘--timestart’,‘--timestop’и‘--days’,должныбытьобязатель-
новключенывправило.
Расширениеrandom
Используяэторасширение,можнопостроитьтакойкритерий,которыйбудетсрабатыватьсвероятностьювдиапазонеот0%до100%.К примеру,длябалансировкинагрузкираспределимтрафикпочетырем серверам:
#iptables -t nat -A PREROUTING -i eth0 -p tcp \ --dport 80 --syn -m random --average 25 \
-j DNAT --to-destination 192.168.0.100:80
#iptables -t nat -A PREROUTING -i eth0 -p tcp \ --dport 80 --syn -m random --average 25 \
-j DNAT --to-destination 192.168.0.101:80
#iptables -t nat -A PREROUTING -i eth0 -p tcp \
--dport 80 --syn -m random --average 25 -j DNAT \ --to-destination 192.168.0.102:80
#iptables -t nat -A PREROUTING -i eth0 -p tcp \ --dport 80 --syn -m random --average 25 \
-j DNAT --to-destination 192.168.0.103:80
Подводимитоги
Вот мы и настроили абсолютно полноценный сервак-шлюз с помощью практически одного только Iptables. Выводы делай сам, но лично я давным-давно уже перевел все свои серваки именно на такое управление, чего и тебе советую.z
xàêåð 08 /104/ 07 |
141 |
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
E |
|
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
d |
|
|
||
|
F |
|
|
|
|
|
t |
|
|
|
|
D |
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
|
||
P |
|
|
|
|
NOW! |
o |
|
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|||
>>to BUYХАКЕР.pro |
|
|||||||||
w Click |
|
|
|
|
|
m |
|
|||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
o |
|
|
|
. |
|
|
|
|
.c |
|
|
||
|
|
p |
|
|
|
g |
|
|
|
|
|
|
|
df |
|
n |
e |
|
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
полета
ТОНКАяНАСТрОйКАПАрАМеТрОВTCP/iPПОДТОлСТыеКАНАлы
Пропускная способность локальных сетей и интернет-каналов неуклонно растет, однако вместе с ней растут и потребности, вызывающие естественное желание выжать из стека TCP/IP максимум возможного. Этим мы сейчас, собственно, и займемся, акцентируя внимание главным образом на Windows Server 2003, хотя описанные технологии оптимизации справедливы и для рабочих станций, собранных на базе
W2K/XP.
п |
о поводу кручения настроек TCP/IP существует два |
конкретновзятыхканаловсвязи,разброскоторыхпростоколоссален. |
диаметрально противоположных мнения. Многие |
Какойприростпроизводительностиможетдатьоптимизацияпарамет- |
|
|
администраторы (а вместе с ними и авторы популярных |
ровTCP/IPприусловии,чтоонавыполненаправильно?Этозависитот |
|
книг) считают, что разработчики уже сделали все что |
того,наскольконастройкипоумолчаниюблизкиксвойствамисполь- |
нужно и любое вмешательство в этот четко отлаженный механизм |
зуемогоканала.Всреднемследуетожидать20-30%выигрыша,однаков |
|
может только навредить. В то же самое время в интернете валяется |
«клинических»случаяхскоростьможетувеличитьсявнесколькораз! |
|
множество руководств, обещающих радикальное увеличение произ- |
|
|
водительности ценой изменения пары-тройки ключей в системном |
Преждечемприступатькоптимизации |
|
реестре. |
|
Вместотогочтобы,засучиврукава,спервыхжестрокбросатьсявбой, |
Истина,какводится,где-топосередине.Операционныесистемыуже |
лучшеспервапокуритьиподумать.Допустим,мыимеем10-мегабитный |
|
давнонаучилисьавтоматическираспознаватьтипподключения,выби- |
каналискачиваем/раздаемфайлыспреимущественнойскоростью |
|
раясоответствующийемунаборнастроекпоумолчанию.Адаптивные |
порядкамегабайтавсекунду.Понятно,чтоникакимиухищренияминам |
|
алгоритмыдинамическиподстраиваютсяподхарактеристикиканала,и |
неудастсяподнятьпроизводительностьдосколько-нибудьзаметнойве- |
|
неквалифицированныеуказанияпользователя,действительно,только |
личины.Такстоитливозиться?Ктомужедостаточнобольшоеколичест- |
|
мешают.Однакоадаптивнымалгоритмамсвойственноошибаться,ана- |
воадминистраторовумышленноущемляетотдачуврайоне50-100Кб/с, |
|
стройкипоумолчаниюдалеконевсегдасоответствуютхарактеристикам |
предотвращаяперегрузкусети.Какаяужтутоптимизация... |
142 |
xàêåð 08 /104/ 07 |
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
|
.c |
|
|
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
>>
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
E |
|
|
|||
|
|
|
X |
|
|
|
|
|||
|
|
- |
|
|
|
|
d |
|
||
|
|
F |
|
|
|
|
|
t |
|
|
|
|
D |
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
|
P |
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|||
ХАКЕР.PROBUY |
||||||||||
|
w Click |
to |
|
|
|
|
m |
|||
|
|
|
|
|
|
|||||
|
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
o |
|
|
|
. |
|
|
|
|
.c |
|
||
|
|
|
p |
|
|
|
g |
|
|
|
|
|
|
|
df |
|
n |
e |
|
||
|
|
|
|
|
-x cha |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Тонкая настройка TCP/IP-параметров через редактор реестра
Другоедело,еслинаблюдаемаяпропускнаяспособностьсоставляет менеедвухтретейотзаявленнойаплинком.Тутужебезоптимизации никакнеобойтись!Однако,помимостекаTCP/IP,запроизводительностьотвечаютидругиесистемныекомпоненты,напримерпроцессор. Прибольшомколичествеодновременноустановленныхсоединений загрузкаЦПможетдостигать100%.
Ещеоднавиновница—видеокарта,надолгозахватывающаяшинубезо всякихвидимыхпричин,врезультатечеговсеостальныепериферийные устройствасадятсянаголодныйпаекискоростьввода/вывода(втом числеисетевого)многократноснижается.Обновлениедрайверовили отключениевсех«агрессивных»настроеквидеокартывэтойситуации можетпомочь.
Такженестоитзабыватьиотом,чточрезмернаяфрагментациядисковогопространствасущественнозамедляетскоростьотдачи/приема файлов,чтоявляетсяоднойизосновныхпричинзамедлениязагрузок web-страничекуконечныхпользователей.
Вобщем,преждечемлезтьвстекTCP/IP,следуетубедиться,чтовсе остальныевозможныепричиныустраненыиузкимместомявляются именнонастройкисетевыхпротоколов,анечто-тоиное(внимание: «убедиться»—этосовсемнетожесамое,что«убедитьсебя»).
MTU+MSS=???
MTU(MaximumTransmissionUnit—максимальныйразмерпередаваемо-
гопакета),вероятно,самыйизвестныйпараметрTCP/IP,рекомендации понастройкекоторогоможновстретитьпрактическивлюбойстатьепо оптимизацииTCP/IP.Сотниутилитпредлагаютсвоиуслугипоопределениюпредельноточногозначения,но,увы,обещанногоувеличения производительностинедостигается.
MTUзадаетнаибольшийвозможныйразмеротправляемогоIP-пакета (вместесзаголовком),нарезаяотправляемыеданныенапорциификсированногоразмера.ЧембольшеMTU,темниженакладныерасходы напередачуслужебнойинформации,азначит,вышеКПДканала.С другойстороны,маршрутизаторысваливаютпакеты,поступающиеот разныхузлов,вобщуюочередь,ипотомугораздовыгоднееотправить одинбольшойпакет,чемдвамаленьких,причемчемсильнеезагружен маршрутизатор,тембольшийвыигрышмыполучим.
Таквчемжедело?!ВыкручиваемMTUдопределаи...скоростьпадаетдо нуля.Почему?Причинавтом,чтосростомразмерапакетовувеличиваетсяивремя,необходимоедляихповторнойпередачи,втомслучаеесли пакетпотерянилиискажен.Ктомужепромежуточныеузлыимеютсвои собственныенастройки,иеслиразмерпередаваемогопакетапревышает текущийMTU,пакетразрезаетсянадваилиболеепакетов(тоестьфраг- ментируется),иэтифрагментысобираютсявоединотольконаузле-при- емнике,врезультатечегопропускнаяспособностьуменьшается.Причем еслиMTUузлаотправителялишьчуть-чутьпревышаетMTUпромежуточ- ногоузла,товторойпакетсостоитпрактическиизодногозаголовка.
Зависимость скорости передачи данных от размера MTU
Запускамутилитуредакторареестраиоткрываемвнейследующий раздел:HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\ Interfaces\interfaceGUID.ВидимпараметрMTUтипаDWORD(аеслине видим,тосоздаем)ивводимтребуемыйразмервбайтах(например, 0xFFFFFFFFозначает«использоватьзначениеMTUпоумолчанию»). ИнтерфейсызаданыGUID-идентификаторами,иобычноихбывает намногобольшеодного.Каксрединихнайтиинтерфейскабельного модемаиликонкретнойсетевойкарты?Даоченьпросто—поIP-адресу! Существуетвозможностьавтоматическогоопределениямаршрута,
покоторомупакетысзаданнымMTUпроходятбезфрагментации (параметрEnablePMTUDiscoveryтипаDWORD,находящийсявтойже ветвиреестра,чтоиMTU;значение«1»включаетэтуфункцию,«0» выключает).Однакомногиеадминистраторыпромежуточныхузловпо соображениям
безопасностиблокируютотправкуICMP-сообщений,иузел-отправитель остаетсявполномневеденииотносительнофактафрагментации.Специальнодляобнаружениятакихвот«неправильных»маршрутизаторов (прозванных«чернымидырами»)Windowsподдерживаетспециальный алгоритм,управляемыйпараметромEnablePMTUDiscovery(вовсеманалогичнымEnablePMTUDiscovery).Вподавляющембольшинствеслучаев использованиеопцийEnablePMTUDiscoveryиEnablePMTUDiscovery
приводиткснижениюпроизводительности.
Ещеодинпараметр—MSS(MaximumSegmentSize—максимальныйраз- мерсегмента)—отвечаетзамаксимальныйразмерпередаваемыхданных завычетомдлинызаголовкаIP-пакета.Трогатьегонеследует,даиWindows всеравноэтогонепозволит.ВобщемслучаеMSS=MTU-40байт.
TCPReceiveWindow
РазмерTCP-окна—малоизвестный,ночрезвычайноважный(вплане производительности)параметр,способныйувеличитьпропускную способностьвнесколькораз.Рассмотримдваузла,AиB,изаставимузел AпередаватьузлуBданные,разбитыенасегменты,размеркоторых(как ужеговорилось)определяетсяпараметромMSS.ПротоколTCPработает сустановкойсоединения,чтообязываетегоотправлятьуведомления обуспешнопринятыхсегментах.Неподтвержденныесегментыспустя некотороевремяпередаютсяузломAвновь.
Промежутоквременимеждуотправкойпакетаиегополучениемназываетсязадержкой(latency),иэталатентностьвзависимостиоттипаи загруженностисетиварьируетсяот20мс(именее)до100мс(иболее). Легкопосчитать,чтоеслибыподтверждалсякаждыйсегмент,тодажев низколатентнойсетиреальнаяскоростьпередачизаметноотставалабы отеепотенциальныхвозможностейибылабыравнаMTU/(2*latency), чтообразуетпределв6Мбит/с,независящийотпропускнойспособности.Кошмар!
ВотпоэтомусоздателиTCP/IPиразрешилиузлуAотправлятьболее одногосегмента,недожидаясьподтверждения.Максимальноеколичес-
xàêåð 08 /104/ 07 |
143 |
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
C |
E |
|
|
|||
|
|
X |
|
|
|
|
|||
|
- |
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|||
>>to BUYХАКЕР.PRO |
|||||||||
w Click |
|
|
|
|
|
m |
|||
w |
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
g |
|
|
|
|
|
|
df |
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
MTU и MSS
твосегментов,котороеможнопередатьдоприходаподтверждения,и называетсяразмеромTCP-окна.
Почемуэтотпараметртакважендлядостижениянаибольшейпроизводительности?Допустим,мыимеемканал10Мбитипередаем7сегментовпо1460байткаждый,тратянаэто8мс.Еслилатентностьсоставляет 100мс,то100мс+92мс=192мс.Мы,какидиоты,ждемподтверждения целых 192мс,и96%времениузелАпроводитвбездействии,используялишь
4%пропускнойспособностиканала.Это,конечно,крайнийслучай,но все-такиненастольконереальный,какможнобылобыподумать.
ВпроцессеустановкисоединенияузелAпредлагаетузлуBвыставить размерокна,равный16Кб(значениепоумолчанию,прописанноев параметререестраТсрWindowSize,котороеприжеланииможноизменить).Еслиразмерокнапревышает64Кб,системаактивируеталгоритм автоматическогомасштабирования,который,впрочем,работает только втомслучае,еслиузелBтакжеподдерживаетэтотмеханизм.Однако следуетпомнить,чтослишкомбольшоеокнозабиваетканалпакетами, вызываяперегрузкусети,препятствующуюпересылкеуведомлений,в результатечегопроизводительностьпадает.
Дверекомендации:есликлиентылокальнойсетиработаютчерезрroxyсервер,тодлядостижениямаксимальнойпроизводительностидостаточ- ноизменитьразмерTCP-окнанепосредственнонасамомсервере;при работечерезNATнеобходимонастроитьTCP-окнонакаждойрабочей станции,подключеннойклокальнойсети.
Медленныйстартивыборочноеподтверждение
ДляпредотвращенияперегрузоксетивпротоколTCPбылвведентак называемый«медленныйстарт»(slowstart),подробноописанныйв RFC1122иRFC2581.ПрисозданииновогоTCP/IP-соединениясистема устанавливаетразмерокна,равныйодномусегменту.Послеполучения подтвержденияразмерокнаувеличиваетсявдвое,итакпродолжается вплотьдодостижениямаксимальновозможногоразмера. Экспоненциальныйростшириныокнасъедаетсовсемнемноговремени припередачиогромныхфайлов,новотприустановкемножестваTCP/ IP-соединений(характерных,например,длябраузеров),обмениваю- щихсякрошечнымипорциямиданных,медленныйстартзаметноснижаетэффективностьширокихканалов.Крометого,дажеприкратковременнойперегрузкесетисистемасбрасываетразмерокнавединицу. НельзязабыватьипроспециальныйпараметрSlowStartThresholdSize (пороговыйразмерокнамедленногостарта),поумолчаниюравный 65636.Послераспознаванияперегрузкисетионможетвызватьдраматическоепадениепроизводительности.
ОтключитьмедленныйстартштатнымисредствамиWindows(непри- бегаякпатчуядра)нельзя,однакоеслизадействоватьSACK-алгоритм (SelectiveAcknowledgement—выборочноеподтверждение,одноиз расширенийTCP-протокола,описанноевRFC2018),томедленныйстарт вырубаетсясамсобой,становясьприэтомникомуненужнымпережиткомстарины.
Выборочноеподтверждениепередачипозволяетосуществлять повторнуюпередачунеподтвержденныхсегментовводномокне(при неактивномSACK’епотерянныесегментыпосылаютсяодинзадругимв индивидуальномпорядке).Другимисловами,узелАповторнопередает узлуBтолькореальнопотерянныесегменты,аневесьблок,всостав котороговходятиуспешнопринятыепакеты.Очевидно,чтомаксимальныйприростпроизводительностибудетнаблюдатьсянанестабильных
каналахсвязи,регулярнотеряющихпакеты.Дляактивацииалгоритма SACKдостаточноустановитьпараметрреестраSackOptsвзначение«1».
Время,работающеепротивнас
Сподтвержденнымисегментамивсеясно.Еслиподтверждениепришло, сегментможносчитатьуспешнодоставленным.Весьвопросвтом, сколькоэтосамоеподтверждениеждатьикогданачинатьповторную пересылку.
ПоумолчаниюWin2003ждет3секунды(прижеланииэтозначение можноизменитьредактированиемпараметраTcpInitialRTT),послечего осуществляетсяповторнаяпересылканеподтвержденныхпакетов,асам интерваложиданияувеличиваетсявсоответствиисалгоритмомSRTT (SmoothedRoundTripTime—сглаженноеоцененноевремяобращения). Максимальноеколичествоповторныхпередачхранитсявпараметре TcpMaxDataRetransmissions(поумолчаниюонравенпяти),придостижениикоторогосоединениеразрывается.
Очевидно,чтонанестабильныхканалах,страдающиххроническими задержками,количестворазрывовсоединенийможносократитьпутем увеличенияпараметраTcpMaxDataRetransmissionsдолюбойразумной величины(нонебольшеFFFFFFFFh).Сдругойстороны,дляповышения производительностиинейтрализациипагубноговлиянияпотерянных пакетовнабыстрыхканалахсмалымвременемзадержкизначение TcpInitialRTTрекомендуетсяуменьшитьдооднойсекунды.
Главныйнедостатокстатическоготаймеравегонеспособностиреагироватьнакратковременныеизмененияхарактеристикканаласвязи. Выбранноесистемойвремяожиданияподтвержденияоказывается недостаточно,товелико.Производительностьпадает,пользовательрвет имечет,апропускнаяспособностьплаваетвоченьширокихпределах, заметноотставаяотожидаемой.
Задержанноеподтверждение(DelayedAcknowledgement)—еще однорасширениепротоколаTCP/IP,описанноевRFC1122ивпервые реализованноевNT4.0SP4иW2K.Вместотогочтобыподтверждать каждыйполученныйсегмент,узелBздесьотправляетподтверждение
тольковтомслучае,есливтечениеопределенногопромежуткавремени (хранящегосявпараметреTcpDelAckTicksипоумолчаниюравного200 мс)отузлаAнебылополученониодногосегмента.Другимисловами, еслисегментыидутдружнымикосякамиивсеработаетнормально, подтверждениянеотправляютсядотехпор,покавсетиневозникнет «затор».Немногоподождав,узелBвысылаетподтверждениевсех полученныхсегментов,даваяузлуAвозможностьсамостоятельноразобраться,какиесегментыпотерялисьвдороге,ипередатьихповторнос минимальныминакладнымирасходами.
Ксожалению,задержка,выбраннаякомпаниейMicrosoftпоумолчанию, близкаклатентностисетейсбольшимизадержками,чтосводитнанет вседостоинстваэтогоалгоритма,идляповышенияпроизводительностизначениеTcpDelAckTicksрекомендуетсяувеличитьвнесколько раз.Соответственно,нанизколатентныхсетяхеголучшеуменьшить, ликвидируяникомуненужныепростои.Значенияэтогопараметра могутварьироватьсявдиапазонеот0до6,выражаемомвдесятыхдолях секунды,тоестьединицасоответствует100мс,анольтрактуетсякак запретнаиспользованиезадержанныхподтверждений.
ПрииспользованииTCP-оконбольшогоразмерарекомендуетсязадейс- твоватьалгоритмвременныхметок(TCP-Timestamps),описанныйвRFC 1323,автоматическиадаптирующийзначениетаймераповторнойпередачидажевусловияхбыстроменяющихсяхарактеристикканаласвязи. ЗаэтоотвечаетпараметрTcp1323Opts,который,будучиустановленным взначение3,разрешаетиспользованиевсехрасширенийRFC1323.z
144 |
xàêåð 08 /104/ 07 |
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-xcha |
|
|
|
|
07)АВГУСТ08( x
2007
|
|
|
|
hang |
e |
|
|
|
|
|
|
|
|
C |
|
E |
|
|
|||
|
|
X |
|
|
|
|
|
|||
|
- |
|
|
|
|
|
d |
|
||
|
F |
|
|
|
|
|
|
t |
|
|
|
D |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
|
|
r |
||
P |
|
|
|
|
|
NOW! |
o |
|||
|
|
|
|
|
|
|
||||
|
|
|
|
|
BUY |
|
|
|||
|
|
|
|
to |
|
|
|
|
|
|
w Click |
|
|
|
|
|
m |
||||
|
|
|
|
|
|
|||||
w |
|
|
|
|
|
|
|
|
|
|
|
w |
|
|
|
|
|
|
|
o |
|
|
. |
|
|
|
|
|
.c |
|
||
|
|
p |
|
|
|
|
g |
|
|
|
|
|
|
df |
|
|
n |
e |
|
||
|
|
|
|
-x cha |
|
|
|
|
104