카라얀 님이 쓰신 글 :
: SNMP 프로토콜에 대해서 잘알고 있거나 구현해보신 분 계신가요.
: RFC 파일 다운 받아 읽어봐도 감을 못잡겠습니다 ㅡㅡ 원거리에 몇개씩 설치되어있는 장비인데요.
:
: 엔터프라이즈 OID로 1.3.6.1.4.1.56789를 쓰고, WarmStart 값으로 1, Specific 값으로 0x3963 을 사용해서 TCP로 SNMP 패킷을 조합해서 보내주면 장비가 리부트 하게 되있으니까, 패킷을 조합해서 전송하는 코드를 구현하라는 지시가 떨어졌는데 어떤 식으로 패킷을 조합해서 보내야 할지 전혀 감을 못 잡고있습니다. 네트웍 프로토콜 잘 아시는 분 도와주세요. ㅜㅜ
:
: OID 가 잘못 적혔네요. 정확하게 1.3.6.1.4.1.56789.129 이고, 커뮤니티는 'DPass1567Environment' 입니다.
답변)
SNMP 프로토콜 레벨에서 패킷을 처리하는 방법을 물으셨는데...
질문에서 요구되는 조건을 만족하기 위해선... Sequence 형식으로 SNMP 패킷을 조합해서 보내야 합니다...
그리고 하나의 Sequence 블럭은...
SEQUENCE 임을 나타내는 Sequence Signature(0x30), Version Number, Community Octet, PDU Chunk 로 구성되게 됩니다...
여기서 PDU Chunk 는... OID, IP Address, Generic Type, Specific Type, Time Stamp 로 세분화 되게 됩니다....
SNMP 프로토콜 레벨에서 각기 Chunk의 패킷 구조를 살펴 보면...
OID 처리 부터 살펴 보죠...
1.3.6.1.4.1.56789.129
위와 같은 OID가 있다고 할 때... 1과 3을 각기의 바이트 형태 그대로 보내지 않고..
처음 두개의 OID 넘버는.. (1 * 40) + 3 = 43(0x2B) 식으로...
첫번째 값에 40을 곱하고, 두번째 값을 더해서 보내게 되는데..
Root(1) 로 시작하는 OID 넘버에서 앞 부분은 작은 수로 시작하기 때문에...
위와 같은 식으로 처리하면 전송되는 패킷을 한바이트로 줄일 수 있기 때문 입니다..
앞부분 두개를 제외한 나머지는 7bit 형식으로 묶는 방식으로 패킷을 조합하게 됩니다.
위에서... 6, 4 같은 경우는 그값 그대로 사용하면 되지만...
예를 들어서 ...
1.3.1.4.1.311 과 같은 OID가 있다고 할 때....
311의 경우 Hex 값으로 표현하면 값이 0x0137 이죠..
이 경우...
Leftmost 값인 0x01 의 최상위 비트를 1로 하고... Rightmost 값인 0x37의 최상위 비트는 무시한 후...
Leftmost 값의 하위 4비트 Nibble을 왼쪽으로 1비트씩 쉬프트 해서 패킷을 7비트 형식으로 표현하게 됩니다.
결과 값은 0x8237 이 됩니다.
위와 같은 방식을 적용하게 되면...
'1.3.6.1.4.1.56789.129' OID의 변환된 패킷 형태는
'2B 06 01 04 01 83 BB 55 81 01' 이 됩니다 (Hex 값) 10개 (0x0A)
여기에 OID 데이타 타입을 나타내는 Signature 로 0x06 이 사용되고...
Length 값인 10 이 하나로 묶여서 SNMP OID 패킷형태의 Chunk 가 완성되어야 하므로 전체적인 값은...
'06 0A 2B 06 01 04 01 83 BB 55 81 01' (Hex 값) 이 됩니다.
IP Address의 경우...
Agent로 패킷을 보내는 쪽의 IP가 "192.168.123.124"라고 가정할 때...
Hex 값으로 표현하면.. 'C0 A8 7B 7C'이니까...
IP 어드레스임을 나타내는 Signature(40)과 Lengh(04)를 포함해서 표현하면..
'40 04 C0 A8 7B 7C'로 하나의 Chunk 단위 패킷이 완성 됩니다.
IP Address의 경우... Multi Session Agent를 구현할 때... 이용 되기도 합니다..
Community 의 경우...
"DPass1567Environment" 를 Hex로 표현하면...
'44 50 61 73 73 31 35 36 37 45 6E 76 69 72 6F 6E 6D 65 6E 74' 입니다 (20개 0x14)
Community 의 데이타 타입임을 나타내는 Octet의 Signature(04)와 Lengh(14)를 포함해서...
하나의 Chunk 로 표현하면...
'04 14 44 50 61 73 73 31 35 36 37 45 6E 76 69 72 6F 6E 6D 65 6E 74'가 됩니다...
Time Stamp 의 경우...
10 mSec 단위의 시스템 경과 시간을 나타내는 Stamp로 사용되는데... 0 이라고 가정한다면..
TimeStamp의 Signature인 '43'과 Length(1), 값(0) 을 하나의 Chunk 로 묶어서 표현할 경우...
'43 01 00' 이 되겠죠... 컴으로 부터 시스템 경과 시간을 알아내서 Time Stamp로 쓸 경우...
값을 보정해서 처리해주면 됩니다...
그리고...
질문 내용을 보면...
WarmStart 값과... Specific 값... 둘다 언급하고 있는데...
Agent를 구현할 때...
Generic Type(WarmStar)이 사용되면... Specific Type은 정의를 하지 않고 사용하거나...
또는.. Specific Type을 사용하면 Generic Type를 정의하지 않고 사용하는 게 일반적인
구현 방법 입니다..
따라서... Generic Type(WarmStar)만 사용하던가.. 아니면 Specific Type만 사용하든가
하는 식으로 둘중에 하나의 방법을 선택해야 합니다...
Sub Chunk 단위를 하나의 Sequence 로 패킷을 조합해서 전송해야 하므로...
위에서 구한 각기 Chunk 단위의 패킷들을... 묶어서...
Sequence Signature(30) + Length + PDU Chunk + Sequnce Signature(30) 형태로 패킷을 조합하면...
1. Generic Type(WarmStar)을 사용할 때의 전체 패킷구조는...
30 38 02 01 00 04 14 44 50 61 73 73 31 35 36 37
45 6E 76 69 72 6F 6E 6D 65 6E 74 A4 1D 06 0A 2B
06 01 04 01 83 BB 55 81 01 40 04 C0 A8 7B 7C 02
01 01 02 01 00 43 01 00 30 00
으로 되어야 하고...
2. Specific Type(0x3963)을 사용할 때는... Specific Type Signature(6) 과 함께 패킷이 조합되어야
하므로 전체 패킷 구조는...
30 39 02 01 00 04 14 44 50 61 73 73 31 35 36 37
45 6E 76 69 72 6F 6E 6D 65 6E 74 A4 1E 06 0A 2B
06 01 04 01 83 BB 51 81 01 40 04 C0 A8 7B 7C 02
01 06 02 02 39 63 43 01 00 30 00
으로 되어야 합니다...
각기 Chunk 단위의 Length 는 128(0x80)이 넘는 경우... 최상위 비트를 1로 한 상태에서...
나머지 비트스트림을 길이로 표현하는...Long Form 형식의 변환 방법은 간단하니까 생략 합니다...
그리고...
SNMP 프로토콜을 구현할 때... 보통 UDP 방식이 많이 사용되기는 하지만, SNMP 프로토콜 스펙에서
반드시 UDP 를 사용해야 한다고 강제하고 있지 않기 때문에... TCP 방식이 사용될 수도 있습니다...
TCP를 사용하든 아니면 UDP를 사용하든 상관 없습니다... Agent가 TCP로 구현되어 있으면...
패킷을 보낼 때... TCP로 보내면 그만인 거죠...
v3 레벨도 구현해야 한다면... 암호화 처리를 위한 DES 알고리즘도 구현해야 하고..
SNMP 프로토콜 수준에서 Agent 를 구현하기 위해선... 프로토콜 전반에 대해서 세부적으로 숙지하고 있어야 합니다...
...
|