Professional Documents
Culture Documents
SNMP-Upravuvanje So Kom. Komunikaciski Mrezi - 212 - 09
SNMP-Upravuvanje So Kom. Komunikaciski Mrezi - 212 - 09
SNMP-Upravuvanje So Kom. Komunikaciski Mrezi - 212 - 09
Тема:
Ментoр: Кандидат:
Скoпје, 2011
1
АПСТРАКТ
Денешниве комплексни мрежи кои се изградени од голем број на рутери,
свичеви, и сервери, може да претставуваат тешка задача во однос на управувањето и
менаџирањето со сите тие уреди на мрежата и воедно да се обезбеди сигурност за
нивно оптимално функционирање. За вакви потреби може да помогне Network
Management Protocol (SNMP), протокол за управување со мрежите. SNMP беше
воведена во 1988 година за да мозе да одговори на зголемената потреба за стандард
за управување со интернет протоколот (IP) на самите уреди. SNMP овозможува на
своите корисници далечински пристап на работа со овие уреди со едноставно
множество на операции за работа.
2
Содржина:
Вовед 4
2. Што е SNMP? 7
2.1SNMP верзии 8
4. SNMP Операции 26
3
4.6 SNMP Traps 34
5.3. Анализа 37
Заклучок
Референци
Вовед
4
фокусот на оваа семинарска, но ќе дадеме и дефинираме општи концепти за управување
со мрежата со цел подобро да се сфати и самиот концепт на работа и на SNMP.
5
Секој систем може да има голем број на интересни и релевантни конфигурациски
параметри, за кој инженерите можат да бидат заинтересирани при работата, вклучувајќи:
6
Целта на управување со безбедноста е двојна. Прво, ние сакаме да го
контролираме пристапот до некои ресурси, како во мрежата така и во нејзините
домаќини.Второ, сакаме да помогне во откривање и спречување на напади кои можат да
и наштетат на мрежата и нејзините домаќини. Нападите на самата мрежа и нејзините
домаќини може да доведе до одбивање на услуга која е побарана од мрежата и уште
полошо да им овозможи на хакерите да добијат пристап до витални информации за
системот кои што може да содржат сметководствени податоци, плати и изворниот код на
податоците.
• Firewalls
• рана детекција на пожар системи (IDSs)
• превенција на натрапници системи (IPSs)
• антивирус системи
• Политика за управување и спроведување на системите
2. Што е SNMP?
Јадрото на SNMP е едноставен збир на операции (и информациите од овие
операции се собираат) што им дава на администраторите можност за промена на
состојбата на некои SNMP базирани уреди. На пример, можете да го користите
SNMP за да се исклучи интерфејс на вашиот рутер или да се направи проверка на
брзина работи Ethernet. SNMP дури може да ја следи и температурата на вашиот
прекинувач и да даде предупредување, кога таа е премногу висока.
7
2.1 SNMP верзии
8
прибирање на информации од страна на агентите во мрежата. Анкетирањето, во контекст
на управување со мрежата, е чин на доведување во прашање на самиот агент (рутер,
Switch, Unix сервер, итн) за прибирање на некои информации. Овие информации може да
се користат подоцна за да се утврди дали може да настанаат некои видови на
катастрофални настани. Одговорите се испраќаат асинхроно, а не како одговор на
прашањата од страна на станиците. Станиците се одговорни за понатамошно вршење на
дејствие [] врз основа на информациите што ги добиваат од страна на самите агенти. На
пример, кога Т1 колото на интернет “паѓа”, тогаш SNMP-базираниот рутер може да
испрати одговор до станицата. За возврат, станицата може да преземе некоја акција, на
пример да даде известување дека се случило некој проблем во мрежата.
Вториот ентитет, агентот, е дел од софтвер кој работи на мрежните уреди со кои
се управува во мрежата. Тоа може да биде посебна програма (демон, во Unix јазик), или
може да биде вклучена во оперативниот систем (на пример, на Cisco IOS на рутерот, или
на пониско ниво на оперативниот систем, кој ги контролира UPS-от). Денес, повеќето IP
уреди доаѓаат со некој вид на SNMP агент вграден во нив. Фактот дека самите
производители се подготвени за вградување на агентите во многу од своите производи
им ја олеснува работата на систем администраторите за менаџирање на
мрежата. Агентот обезбедува информации за управување до станицата со следење на
различни оперативни аспекти на мрежниот уред. На пример, агентот на рутер е во
состојба да ги прати сите состојби на секој негов интерфејс до станицата и во моментот
кога забележува дека нешто се случува веднаш испраќа таква информација, а станицата
е одговорна да ги зачува во некој “ред на чекање” и соодветно да реагира на тие
настанати проблеми. Во случај кога имаме совршена состојба се испраќа “all clear” за да
се извести станицата дека се работи беспрекорно. Ова е корисно и во моментот кога
треба да добие одговор за состојбата после решавањето на некој проблем.Некои уреди
кои ќе испрати соодветните "сите јасно" стапица кога постои преминување. На слика 1 е
прикажана релацијата и пораките помеѓу агентот и станицата.
9
Важно е да се има предвид дека пораките може да се одвиваат во исто време, и не
постојат никакви ограничувања за тоа кога станицата ќе прими барање или агентот да
испрати такво барање.
10
• RADIUS Authentication Server MIB (RFC 2619)
• Mail Monitoring MIB (RFC 2789)
• DNS Server MIB (RFC 1611)
Како што Sun Microsystems вели:- "Мрежата е компјутерот". Ако вашиот веб
сервер или серверот за пошта е “паднат”, не е важно дали вашите рутери работат
исправно, вие сепак ќе бидете во можност да примате повици. Ресурсите на хостот MIB
(RFC 2790) дефинира множество од објекти за да помогне во управувањето со некои
критични аспекти на Unix и Windows системите.
Било кој оперативен систем на кој работи SNMP агент може да ги имплементира хост
ресурсите, не е ограничено само на Unix и Windows системите. Некои од објектите
поддржани од страна на Host Resources MIB се капацитет на дискот, бројот на
корисниците на системот, бројот на активни процеси, и софтвер во моментот кога се
инсталира. Денес, се повеќе и повеќе луѓе се потпираат на сервисно-ориентирани веб-
сајтови. Изработка на сигурна околина за серверите и нивна правилно функционирање е
толку важно како и следење на вашите рутери и други средства за комуникација во
самата мрежа. За жал, некои имплементации на агенти за овие платформи не го
имплементираат тоа MIB, бидејќи не е облигаторно.
11
RMON MIB беше дизајниран за да овозможи вистинска RMON истрага дури и во
оффлине режим на работа кој што овозможува собирање на статистичките информации
за мрежата без притоа да има потреба од станиците да мора постојано да пребаруваат за
нови информации. По некое одредено време, станиците може да пребаруваат за
статистичките информации кои биле собрани преку RMON.
12
Слика 2. TCP/IP комуникациски модел и SNMP
SNMP користи 161 UDP порта за праќање и примање на барања и порта 162 за
примање на trap-ови од управуваните уреди. Секој уред кој што го има имплементирано
SNMP мора да ги користи овие порти по default, но некои производители овозможуваат и
менување на овие порти во конфигурацијата на агентот, т.е мрежниот уред. Доколку се
направи промена на портите мора да се извести и станицата за да може да пребарува по
точните порти. На следнава слика е прикажан TCP/IP протоколниот стек, кој што е основа
на секоја TCP/IP комуникација.
Во моментот кога се извршуваат SNMP функции како што се барања или trap, во
протоколниот стек се случуваат следниве настани:
13
2.7 SNMP заедници
14
2.8 Структура на управување со информации
Име
Тип и синтакса
Кодирање
15
3. Објектно стебло (објекти потребни за управување со
мрежата)
16
јазли претставуваат листови. ccitt(0) и joint(2) не се однесуваат на SNMP па затоа нема да
дискутираме за нив.
Има уште еден дел под приватно подстебло кој се користи за да им овозможи на
хардверските и софтверските производители способност да дефинираат сопствен
приватен објект за кој било тип на хардвер или софтвер сакаат да управуваат со SNMP.
Неговата SMI дефиниција е:
IMPORTS
mgmt, NetworkAddress, IpAddress, Counter, Gauge,
TimeTicks
FROM RFC1155-SMI
OBJECT-TYPE
FROM RFC 1212;
--група во MIB-II
17
tcp OBJECT IDENTIFIER ::= { mib-2 6 }
udp OBJECT IDENTIFIER ::= { mib-2 7 }
egp OBJECT IDENTIFIER ::= { mib-2 8 }
transmission OBJECT IDENTIFIER ::= { mib-2 10 }
snmp OBJECT IDENTIFIER ::= { mib-2 11 }
-- Интерфејс табела
ifTable OBJECT-TYPE
SYNTAX SEQUENCE OF IfEntry
ACCESS not-accessible
STATUS mandatory
DESCRIPTION
"Листа на интерфејси на ентитети. Бројот на ентитети е даден
со вредноста на ifNumber."
::= { interfaces 2 }
ifEntry OBJECT-TYPE
SYNTAX IfEntry
ACCESS not-accessible
STATUS mandatory
DESCRIPTION
"Влезниот интерфејс содржи објекти во подмрежниот слој и подолу
за потребните интерфејси."
INDEX { ifIndex }
::= { ifTable 1 }
IfEntry ::=
SEQUENCE {
ifIndex
INTEGER,
ifDescr
DisplayString,
ifType
INTEGER,
ifMtu
INTEGER,
ifSpeed
Gauge,
ifPhysAddress
PhysAddress,
ifAdminStatus
INTEGER,
ifOperStatus
INTEGER,
ifLastChange
TimeTicks,
ifInOctets
Counter,
ifInUcastPkts
18
Counter,
ifInNUcastPkts
Counter,
ifInDiscards
Counter,
ifInErrors
Counter,
ifInUnknownProtos
Counter,
ifOutOctets
Counter,
ifOutUcastPkts
Counter,
ifOutNUcastPkts
Counter,
ifOutDiscards
Counter,
ifOutErrors
Counter,
ifOutQLen
Gauge,
ifSpecific
OBJECT IDENTIFIER
}
ifIndex OBJECT-TYPE
SYNTAX INTEGER
ACCESS read-only
STATUS mandatory
DESCRIPTION
"Единствена вредност за секој интерфејс.
Нивната вредност е во опсег од 1 до вредноста
од ifNumber. Вредноста за секој интерфејс мора да
содржи константа од една преиницијализација до
следна."
::= { ifEntry 1 }
ifDescr OBJECT-TYPE
SYNTAX DisplayString (SIZE (0..255))
ACCESS read-only
STATUS mandatory
DESCRIPTION
"Текстуална низа која содржи информации за
интерфејсот. Оваа низа мора да го содржи името
на производителот, името на продуктот, и
верзијата на хардверскиот интерфејс."
::= { ifEntry 2 }
END
19
Истотака се импортира и OBJECT_TYPE од RFC 1212, кој што го дефинира како е
напишан MBI документот. Секоја група импортирана со IMPORTS клаузулата користи и
FROM клаузула за да дефинира од каде се превземени објектите.
ifTable OBJECT-TYPE
SYNTAX SEQUENCE OF IfEntry
ACCESS not-accessible
STATUS mandatory
DESCRIPTION
"Листа на интерфејси на ентитети. Бројот на ентитети е даден
со вредноста на ifNumber."
::= { interfaces 2 }
Синтаксата на ifTable е секвенца од IfEntry. Ова значи дека ifTable е табела која
што содржи колони дефинирани во IfEntry. Објектот не е достапен, што значи дека не
постои начин да агентот да пребарува за вредноста на овој објект. Неговиот статус е
задолжителен, што значи агентот мора да го спроведе овој објект, со цел да се во
согласност со спецификацијата на MIB-II. DESCRIPTION објаснува што точно претставува
овој објект. Неговиот единствен OID е 1.3.6.1.2.1.2.2 или iso.org.dod.internet.mgmt.mib-
2.interfaces.2.
IfEntry ::=
SEQUENCE {
ifIndex
INTEGER,
ifDescr
DisplayString,
ifType
INTEGER,
ifMtu
INTEGER,
.
.
.
ifSpecific
OBJECT IDENTIFIER
}
Секвенца е едноставна листа на објекти и нивните SMI податочни типови, кои што
ја дефинираат концептуалната табела. Во овој случај, ние очекуваме да се
најдат променливи дефинирани од страна на ifIndex,
ifDescr, ifType, итн. Оваа табела може да содржи колку било редови, тоа е до агентот за
20
управување со редовите, кои што се во табелата. Можно е за станиците да се
додадат редови во самата табела.
ifEntry OBJECT-TYPE
SYNTAX IfEntry
ACCESS not-accessible
STATUS mandatory
DESCRIPTION
"Влезниот интерфејс содржи објекти во подмрежниот слој и подолу
за потребните интерфејси."
INDEX { ifIndex }
::= { ifTable 1 }
ifIndex OBJECT-TYPE
SYNTAX INTEGER
ACCESS read-only
STATUS mandatory
DESCRIPTION
"Единствена вредност за секој интерфејс.
Нивната вредност е во опсег од 1 до вредноста
од ifNumber. Вредноста за секој интерфејс мора да
содржи константа од една преиницијализација до
следна."
::= { ifEntry 1 }
ifIndex објектот е само за читање, што значи дека може да се види неговата
вредност, но не можеме да се промени. Конечната цел на нашите MIB дефиниции
е ifDescr, што е текстуален опис за интерфејсите застапуван од некој одреден ред во
ifTable. Во нашиот MIB пример завршува со клаузула за крај, со кој се одбележува
крајот на MIB датотеката. Во конкретните MIB-II датотеки, секој објект излистан
во IfEntry секвенцатаима своја објект дефиниција. Во оваа верзија на MIB ние прикажавме
само две од нив, во интерест на просторот.
21
3.2 Проширувања на SMI во верзија SMIv2
22
Табела 1. Нови податочни типови во SMIv2
<name> OBJECT-TYPE
SYNTAX <datatype>
UnitsParts <Optional, see below>
MAX-ACCESS <See below>
STATUS <See below>
DESCRIPTION
"Текстуалната објаснување го опишува објектот за управување."
AUGMENTS { <name of table> }
::= { <Unique OID that defines this object> }
23
3.3 Преглед на MIB-II
MIB-II е важна група за управување бидејќи секој уред кој што поддржува SNMP
мора да поддржува и MBI-II. Поради тоа, ке ги користиме објектите од MBI-II во текот на
оваа семинарска. Поради просторот нема да се оди во детали за секој објект во MIB, туку
само ќе го дефинираме подстеблото од објекти. Делот од RFC1213-MIB кој што ги
дефинира основните OIDs за mib-2 подстеблото изгледа вака:
24
Слика 4. MBI-II подстебло
Гранка од
стеблото OID Објаснување
system 1.3.6.1.2.1.1 Дефинира листа на објекти за системски операции, како што
е системското време, контакт со системот и системско име.
25
4. SNMP Операции
Protocol Data Unit (PDU) е формат на порака кој менаџерите и агентите го користат за
испраќање и примање на информациите. Секоја од овие SNMP операции има стандарден
PDU формат.
• get
• getnext
• getbulk (SNMPv2 и SNMPv3)
• set
• getresponse
• trap
• notification (SNMPv2 и SNMPv3)
• inform (SNMPv2 и SNMPv3)
• report (SNMPv2 и SNMPv3)
26
Како агентот знае што станцата бара од него? Во делот за get барањето се
вклучува променлива за биндање. variable binding, или varbind, е листа од MIB објекти кои
што овозможуваат да се види што точно бара испраќачот на барањето. Еве еден пример
како би изгледало:
27
$ snmpwalk cisco.ora.com public system
system.sysDescr.0 = "Cisco IOS Software, C2600 Software (C2600-IPBASE-M),
Version 12.3(8)T3, RELEASE SOFTWARE (fc1)
Technical Support: http://www.cisco.com/techsupport
Copyright (c) 1986-2004 by Cisco Systems, Inc.
Compiled Tue 20-Jul-04 17:03 by eaarmas"
system.sysObjectID.0 = OID: enterprises.9.1.19
system.sysUpTime.0 = Timeticks: (27210723) 3 days, 3:35:07.23
system.sysContact.0 = ""
system.sysName.0 = "cisco.ora.com"
system.sysLocation.0 = ""
system.sysServices.0 = 6
Со следнава команда :
28
Слика 6. Изминување на MIB стеблото
29
Слика 5. Секвенца на getbulk барање
N + (M * R)
30
За да погледнеме во резултатот треба да се изврши командата:
31
Првата команда е во тесна врска со get командата, која што ја прикажува
моменталната вредност на sysLocation променливата. Во еден од претходните примери,
видовме дека таа не е поставена, исто како што е слуќајот и сега. Втората команда е
snmpset. За оваа команда е потребен хостот read-write текстуалната низа (private), и
променливата која што сакаме да ја поставиме (system.sysLocation.0), заедно со нејзината
нова вредност (s "Atlanta, GA"). s му кажува на snmpset дека вредноста ќе биде стринг и
"Atlanta, GA" е новата вредност за тоа. Како знаеме дека за sysLocation е потребна
текстуална вредност? Бидејќи дефиницата од sysLocation во RFC 1213 изгледа вака:
sysLocation OBJECT-TYPE
SYNTAX DisplayString (SIZE (0..255))
ACCESS read-write
STATUS mandatory
DESCRIPTION
"Физичката локација на овој јазел (пр., 'telephone closet,
3rd floor')."
::= { system 6 }
32
4.5. get, getnext, getbulk, и set Error одговори
SNMPv1 пораки за
грешки Објаснување
noError(0) Значи дека нема проблеми со барањето.
33
4.6 SNMP Traps
trap е начин на кој агентот и кажува на станицата дека се случило нешто лошо.
• SNMP агенти
• станици
• менаџери
• Trend analysis software
• Supporting software
За жал, одлуката за она што ни е потребно за работа не е така едноставна како што е
земање програма за секоја категорија. Ако имаме мала мрежа и сакаме да градиме свои
алатки, тогаш веројатно не ни се потребни комплексни станици. Дали ни е
потребно тренд-софтвер за анализа зависи очигледно од тоа дали сте заинтересирани
за анализа на трендови во вашата мрежа. Достапните производи зависат
од платформите за кои сме заинтересирани. Минимумот можеме да го постигнеме
со SNMP агентот кој е на уредот и некој софтвер кој што може да пристапи до
вредностите од тој уред (со користење на SNMP get операцијата). Иако ова е минимална
конфигурација, тоа е доволно за да се почне со работа, а истотака може да се добие и
слободен софтвер.
34
Како што објаснивме претходно, агентот е софтвер кој што ги контролира сите SNMP
комуникации кои што се одвиваат со SNMP-базираните уреди. Во некои уреди, како што
се Cisco рутерите, софтверот на агентот е изграден во самиот уред и не бара посебна
инсталација. На други платформи, можно е да треба да се инсталира агент како
дополнителен софтверски пакет.
Пред да се види каков тип на агент ни е потребен , мора да се истражи какви типови
на уреди се користат во мрежата и какви типови на информации сакаме да добиваме од
уредите. Некои агенти се многу едноставни и враќаат само ограничен број на
информации, а други пак може да вратат цело “богатство” од информации. За почеток,
треба да се одлучи какви информации треба да се добиваат од серверите (Unix, Windows,
итн.) или од мрежните уреди (рутери, свичеви итн.). Генерално, мрежните уреди
обезбедуваат повеќе информации отколку серверите. Од друга страна, мрежните уреди
не може да се надградуваат така лесно, бидејќи мрежниот хардвер нема диск-базирана
работна околина. Ова го обврзува корисникот од тоа да прави модификации на агентот
или пак да го надградува. Во следнава табела имаме листа на неколку SNMP агенти .
Овој термин се користи за софтверски пакет кој што содржи повеќе апликации во еден
соодветен производ. Во овој дел ќе зборуваме за софтверот за овие станици за
управување со мрежата, кој што претставува еден од најважните делови во самото
управување на мрежата. Без нив софтверскиот агент не би имал никаква корист. Овие
станици дозволуваат да имаме комплетен преглед врз мрежата, вклучувајќи ги серверите,
рутерите, свичевите, и десктоп машините. Во повеќето случаеви, овој приказ може да
биде графички. Овие пакети се високо конфигурабилни и работат речеси во било која
мрежна околина. Оваа слобода, често доаѓа со голема цена и збунувачки процес на
инсталација. Дел од продуктите повеќе се фокусираат на управувањето од мрежната
35
страна (пр. на уредите како што се рутерите, хуб-овите и свичевите). Други пак, одат еден
чекор понапреди дозволуваат да се уредуваат серверите и работните станици за
полесно да се интегрираат со станиците. Исто така треба да се знае дека поголемите
софтверски пакети се за поголеми, покомплицирани мрежи и дека може да се набават и
триал верзии пред да се одлучиме за конечната верзија што ќе се користи. Во следнава
табела имаме комерцијални и слободен софтвер за станиците.
HP OpenView http://www.openview.hp.com
SolarWinds http://www.solarwinds.net
IBM Tivoli http://www.ibm.com/software/tivoli
Castle Rock SNMPc http://www.castlerock.com
BMC Software http://www.bmc.com
Computer Associates Unicenter http://www.ca.com
Veritas NerveCenter http://www.veritas.com
Micromuse Netcool http://www.micromuse.com
GxSNMP http://www.gxsnmp.org
Tkined http://wwwhome.cs.utwente.nl/~schoenw/scotty
OpenNMS http://www.opennms.org
SNMPSTAT monitoring system http://snmpstat.sourceforge.net
Big Brother http://www.bb4.org
Mercury SiteScope http://www.mercury.com
Ipswitch WhatsUp http://www.ipswitch.com/products/whatsup/index.html
Just For Fun (JFF) NMS http://www.jffnms.org
Nagios http://www.nagios.org
NagMIN http://nagmin.sourceforge.net
36
со модемот. Пред купување на таков пакет, треба добро да се проучи моменталната
средина, како е начинот на раст на истата и она што производителите моментално
користат или каква е веројатноста да се користи во иднина. Бидејќи голем број од овие
производи ги специфицираат самите производители, лесно може да се случи да се купи
нешто за кое што сме имале поголемо очекување т.е да не ги оправда нашите очекувања.
На пример, CiscoView (дел од CiscoWorks) е одличен софтвер, кој може да направи многу
добри работи како што прикажување на информации за рутерот. Како и да е, ако
вклучиме поголем број на Nortel уреди пред инсталирањето на овој уред, тогаш тој нема
да биде во позиција да ги даде унифициран поглед на мрежата. Некои пакети
дозволуваат да се управува со нивната конкурентска опрема, на пример, елементот
менаџер кој што ги следи свичовите може да ги чува и свичовите од конкурентските
производители. Пред да се купи од овие производи, треба добро да се истражи каде е
главата на мрежата. Во следнава табела имаме листа од достапни манаџери.
Табела 6. менаџери
5.3. Анализа
37
Табела 7. Анализа
Perl http://www.perl.com
http://www.perl.org
SNMP framework for Python http://pysnmp.sourceforge.net
SNMP Support for Perl http://www.switch.ch/misc/leinen/snmp/perl
http://www.cpan.org
pwSNMP Visual Basic http://sourceforge.net/projects/websignoff
38
Табела 8. Софтвер за поддршка
WILMA ftp://ftp.ldv.e-technik.tu-
muenchen.de/dist/WILMA/INDEX.html
Net-SNMP C Library http://net-snmp.sourceforge.net
Net-SNMP Perl Module http://www.cpan.org/authors/id/GSM
A3Com http://www.kernel.org/software/A3Com
SNMP++ http://www.agentpp.com
Netcool http://www.micromuse.com
Network Computing Technologies http://www.ncomtech.com
Trap Receiver
Заклучок
39
Во овој дел ќе погледнеме што имавме пред да користиме SNMP и откако ќе го
ставиме во пракса. На пример имаме, 100 машини кои работат на различни оперативни
системи. Неколку се податочни сервери, неколку ќе бидат принт сервери, а на други
работи софтвер кои што ги верифицира трансакциите на кредитните картички, а
останатите се персонални работни станици. Како додаток нормално се користат различни
свичеви и рутери за формирање на мрежата. А Т1 колото ја поврзува компанијата со
Интернет, а приватна конекција работи за системот за верификација на кредитните
картички.
Што ќе се случи кога имаме проблем со серверите кои ги чуваат податоците? Ако
тоа се случува во средината работна недела, луѓето кои што ја користат мрежата ќе
приметат и ќе го известат администраторот да го поправи проблемот. Но што доколку се
случи проблем кога веќе никој нема во самата компанија? Што ќе се случи доколку
системот за верификација на кредитните картички “падне” во 22 часот во петок навечер и
не може да се среди до понеделник наутро? Ваквите проблеми би ја чинело компанијата
илјадници, па и милиони денари.
Референци
[3] network-management-mibs-and-mpls-principles-design-and-implementation
Stephen B. Morris, 2004
40