2013년 5월 29일 수요일

네트워크에는 ping, 디스크 I/O 에는 ioping

네트워크 상에서 많이 쓰는 도구중에 하나가 PING 이 아닐까 생각합니다. 네트워크가 안된다면 일단 PING 을 통해서 확인을 시도해 보니까 말이죠. 네트워크에 PING 이 있다면, 디스크에는 IO Latency 를 확인해 볼 수 있는 IOPING 이 있습니다. 세부 정보는 다음 경로에서 확인할 수 있습니다.

https://code.google.com/p/ioping/

다운 받아보면 아주 간단하게 구성되어 있습니다.


# ls
ioping.1  ioping.c  ioping.spec  Makefile

Makefile 이 이미 존재하므로 바로 make 를 해주면 컴파일이 됩니다.

# make
cc -std=c99 -g -Wall -Wextra -pedantic -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -DVERSION=\"0.6\" -c -o ioping.o ioping.c
cc -o ioping ioping.o -std=c99 -g -Wall -Wextra -pedantic -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -lm

실행해 보면 아래와 같은 도움말을 볼 수 있습니다.

# ./ioping
 Usage: ioping [-LCDRq] [-c count] [-w deadline] [-p period] [-i interval]
               [-s size] [-S wsize] [-o offset] device|file|directory
        ioping -h | -v

      -c <count>      stop after <count> requests
      -w <deadline>   stop after <deadline>
      -p <period>     print raw statistics for every <period> requests
      -i <interval>   interval between requests (1s)
      -s <size>       request size (4k)
      -S <wsize>      working set size (1m)
      -o <offset>     in file offset
      -L              use sequential operations (includes -s 256k)
      -C              use cached I/O
      -D              use direct I/O
      -R              seek rate test (same as -q -i 0 -w 3 -S 64m)
      -q              suppress human-readable output
      -h              display this message and exit
      -v              display version and exit

따로 메뉴얼이 없어도 대략 어떤 의미인지가 추정이 됩니다. 그만큼 사용법이 간단하다는 의미가 되겠죠.

# ./ioping /dev/sda6 
4096 bytes from /dev/sda6 (device 309.1 Gb): request=1 time=14.5 ms
4096 bytes from /dev/sda6 (device 309.1 Gb): request=2 time=5.3 ms
4096 bytes from /dev/sda6 (device 309.1 Gb): request=3 time=9.3 ms
4096 bytes from /dev/sda6 (device 309.1 Gb): request=4 time=7.5 ms
4096 bytes from /dev/sda6 (device 309.1 Gb): request=5 time=6.3 ms
4096 bytes from /dev/sda6 (device 309.1 Gb): request=6 time=9.0 ms
^C
--- /dev/sda6 (device 309.1 Gb) ioping statistics ---
6 requests completed in 5645.3 ms, 116 iops, 0.5 mb/s
min/avg/max/mdev = 5.3/8.6/14.5/3.0 ms

실행해 보면 ping 에서 보던 것과 유사하게 출력이 됩니다. 더 이상 다른 설명은 안 드려도 될것 같네요. :-)

IO latency 를 실시간으로 확인할 필요가 있으신 분들은 참고하시기 바랍니다.

2013년 5월 21일 화요일

라즈베리파이(Raspberry PI)가 네트워크 탭(Tapping) 장비로 변신한 이유

저번에 소개해 드렸던 집에서 네트워크 Passive Tap 만들기 기억나시나요? 그때 댓글에 누가 남겨주셨던 곳을 통해 잭을 구매했습니다. 이름을 무엇이라고 부르는지 몰라서 못 찾고 있었는데, KeyStone 잭 이라고 하네요. 이걸로 검색해 보시면 쉽게 찾아보실 수 있습니다.

잭 4개를 이용해 다음과 같이 케이블을 연결해 주었습니다. 실제로 데이터 전송에는 8개중 4개의 선만 이용이 됩니다. 그래서 오렌지 색깔과 녹색 색깔 라인을 따로 분리하여 만들어 준 것입니다.


선만 연결하고 마무리 정리를 안해 놓아서 상당히 지저분해 보이네요. 연결은 어렵지 않아서 이전 포스팅에 있는 그림만 참고하시면 쉽게 연결이 가능합니다. 연결이 되면 한쪽은 IN 다른 한쪽은 OUT 방향의 데이터를 덤프할수가 있습니다.

컴퓨터에 연결해서 쉽게 사용할 수 있지만, Tapping 을 하고자 하는 대상이 컴퓨터와 거리가 떨어져 있어서 라즈베리 파이를 이용했습니다. 라즈베리파이가 Tapping 용도로서 한 역할을 하더군요. 사실 간단하게는 노트북을 이용하는게 더 편리합니다 ^^ 라즈베리 이더넷에 연결만 하고 tcpdump 등을 이용해 저장하면 됩니다. 저번에 소개한 것과 같이 X 환경을 이용하기에는 너무 느리므로 콘솔 기반으로 데이터 저장형태로 이용하면 될것 같습니다.
기회 되면 Tapping 으로 패킷 덤프한 이야기도 소개하겠습니다. IPTV 가 그 첫번째 대상인데요, 이 이야기는 다음번에 할께요 ;-)

/Rigel

[참고]
1. 집에서 Passive 네트워크 탭(Tapping) 장비 만들기

2013년 5월 14일 화요일

아파치 한국 공식미러 장비 기증 후원을 기다립니다.

제가 97년부터 한국아파치사용자 모임 커뮤니티를 (www.apache-kr.org) 운영해 왔습니다. 정말 오랜시간이 흘렀네요. 지금은 업무도 달라지다 보니 관리를 하지 못하고 있어 쌓여가는 스팸들을 보며 안타까워 하고 있습니다. 아무래도 국내에서 오래된 커뮤니티중에 하나였고, 국내에 아파치 웹 서버를 소개하는데 일조를 담당한 놈이어서 애정이 남다릅니다.

2004년 1월부터 아파치 한국 공식미러로 운영중인 시스템이 있습니다. (mirror.apache-kr.org) 현재 한국에는 3개의 미러링이 있고 그 중에서는 가장 오래 운영되고 있습니다. 어느덧 내년이면 미러링 운영 10년차가 되네요.

그런데, 스폰서를 받은 시스템이 노후화가 되어 운영하는데 어려움을 겪고 있습니다. 이에 장비를 기증(Donation)해 주실 분을 찾고 있습니다.

장비는 다음과 같이 최소 스펙을 갖춘 조건이면 괜챦습니다.

- 1U 타입 서버 (2U 도 가능하나, 가급적 1U 를 선호)
- RAID 구성 가능하며 디스크베이는 최소 2개
- 디스크 용량은 최소 100 기가 이상 (현재 72G RAID 1 ㅠㅠ)
- 기증하기에 그리 나쁘지 않은 스펙이라고 판단되는 시스템

아파치재단의 한국 공식미러가 10, 20 년 계속 이어질 수 있도록 도움 부탁드립니다. 기증이 가능하신 분은 댓글로 남겨주세요 (기본적으로 비공개 댓글이고, 요청시에 공개하지 않습니다)

2013년 5월 13일 월요일

패킷 데이터를 XML(Extensible Markup Language)로 저장하는 방법은?

패킷 데이터를 저장하는 방법은 다양합니다. PCAP 파일 그 자체가 될 수도 있고, 각 필드를 분리하여 해당 내용만 저장하거나 텍스트 또는 CSV, C 어레이 형태등 다양합니다. 패킷 데이터를 활용하는 방법에 따라 저장 방법의 차이가 있지만 구조화된 XML 로 데이터를 얻을 수는 없을까요?

이런 고민을 했다면 와이어샤크가 한 순간에 해결해 줍니다. 와이어샤크에서 기본적으로 지원하고 있기 때문인데요, 메뉴에서

File->Export->File->as XML - "PSML", "PDML"

위와 같은 경로를 보시면 쉽게 해당 패킷데이터를 XML 로 변경 저장해 줍니다. PSML 은 패킷 요약 정보이고 PDML 은 패킷 상세 정보입니다.

와이어샤크에서 지원하기 때문에 명령어 모드인 tshark 에서도 -T 옵션을 통해 사용가능합니다.

  -T pdml|ps|psml|text|fields
                           format of text output (def: text)

어디한번 패킷요약 정보를 XML 로 살펴볼까요?

# tshark -T psml -r 1.pcap | more
<?xml version="1.0"?>
<psml version="0" creator="wireshark/1.7.0">
<structure>
<section>No.</section>
<section>Time</section>
<section>Source</section>
<section>Destination</section>
<section>Protocol</section>
<section>Length</section>
<section>Info</section>
</structure>

<packet>
<section>1</section>
<section>0.000000</section>
<section>192.168.70.103</section>
<section>192.168.70.101</section>
<section>TCP</section>
<section>66</section>
<section>49239 &gt; ms-wbt-server [SYN] Seq=989508872 Win=8192 Len=0 MSS=1460 WS
=256 SACK_PERM=1</section>
</packet>

우리가 와이어샤크 메인 화면에서 보았던 형태의 구조로 데이터가 저장되어 있습니다. 처음에 각 섹션의 필드가 설명되어있고 <packet> 안에 각 섹션 정보가 들어가 있습니다. 두번째로 상세 정보를 보겠습니다.

# tshark -T pdml -r 1.pcap | more
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="pdml2html.xsl"?>
<!-- You can find pdml2html.xsl in /usr/local/share/wireshark or at http://anons
vn.wireshark.org/trunk/wireshark/pdml2html.xsl. -->
<pdml version="0" creator="wireshark/1.7.0" time="Mon May 13 08:34:45 2013" capt
ure_file="1.pcap">
<packet>
  <proto name="geninfo" pos="0" showname="General information" size="66">
    <field name="num" pos="0" show="1" showname="Number" value="1" size="66"/>
    <field name="len" pos="0" show="66" showname="Frame Length" value="42" size=
"66"/>
    <field name="caplen" pos="0" show="66" showname="Captured Length" value="42"
 size="66"/>
    <field name="timestamp" pos="0" show="Sep  2, 2012 07:36:41.107704000 KST" s
howname="Captured Time" value="1346539001.107704000" size="66"/>
  </proto>
  <proto name="frame" showname="Frame 1: 66 bytes on wire (528 bits), 66 bytes c
aptured (528 bits)" size="66" pos="0">
    <field name="frame.time" showname="Arrival Time: Sep  2, 2012 07:36:41.10770
4000 KST" size="0" pos="0" show="Sep  2, 2012 07:36:41.107704000"/>
    <field name="frame.offset_shift" showname="Time shift for this packet: 0.000
000000 seconds" size="0" pos="0" show="0.000000000"/>
    <field name="frame.time_epoch" showname="Epoch Time: 1346539001.107704000 se
conds" size="0" pos="0" show="1346539001.107704000"/>
    <field name="frame.time_delta" showname="Time delta from previous captured f
rame: 0.000000000 seconds" size="0" pos="0" show="0.000000000"/>
    <field name="frame.time_delta_displayed" showname="Time delta from previous
displayed frame: 0.000000000 seconds" size="0" pos="0" show="0.000000000"/>
    <field name="frame.time_relative" showname="Time since reference or first fr
ame: 0.000000000 seconds" size="0" pos="0" show="0.000000000"/>
    <field name="frame.number" showname="Frame Number: 1" size="0" pos="0" show=
"1"/>
    <field name="frame.len" showname="Frame Length: 66 bytes (528 bits)" size="0
" pos="0" show="66"/>
    <field name="frame.cap_len" showname="Capture Length: 66 bytes (528 bits)" s
ize="0" pos="0" show="66"/>
    <field name="frame.marked" showname="Frame is marked: False" size="0" pos="0
" show="0"/>
    <field name="frame.ignored" showname="Frame is ignored: False" size="0" pos=
"0" show="0"/>
    <field name="frame.protocols" showname="Protocols in frame: eth:ip:tcp" size
="0" pos="0" show="eth:ip:tcp"/>
  </proto>
  <proto name="eth" showname="Ethernet II, Src: Vmware_33:75:1f (00:0c:29:33:75:
1f), Dst: Vmware_8a:43:28 (00:0c:29:8a:43:28)" size="14" pos="0">
    <field name="eth.dst" showname="Destination: Vmware_8a:43:28 (00:0c:29:8a:43


보시는 것과 같이 꽤 많은 정보가 포함되어 있습니다. 이 XML 구조는 필드 이름으로 각 정보가 구분되어 들어가 있는데, 이 필드이름은 출력필터 문법으로 사용되고 있습니다. caplen 은 캡쳐된 길이를 뜻하고 timestampe 는 시간, frame.len 은 프레임 길이 eth.dst 는 이더넷 목적지 맥 주소 ip.id 는 IP 헤더의 Identification, tcp.port 는 TCP 포트 정보와 같습니다. 필드 이름을 보면 쉽게 이해가 되시죠? 출력필터를 그대로 사용하고 있기 때문에 이해가 쉽습니다. 즉, 프로토콜 구조 밑에 각 필드가 들어가는 구조입니다.

<proto name="geninfo">
<field name="num">
<field name="len">
<field name="caplen">
<field name="timestampe">
</proto>
<proto name="frame">
<proto name="eth">
<proto name="ip">
<proto name="tcp">

이제 이런 데이터의 활용은 여러분의 몫 이겠죠?
:-)

2013년 5월 10일 금요일

시리아 인터넷 이틀간(5/7-8) 차단

시리아의 인터넷 연결이 20시간 가까이 차단되었다가 복구된일이 발생했습니다. 시리아는 작년 11월 에도 이와 같은 사태가 있었으며 이번이 두번째 입니다. 국영 통신은 광케이블에 문제가 있었고 복구되었다고 하지만 이 사실을 믿기에는 의심이 듭니다. 기술적인 결함으로 발생된 것이라고 주장하지만 시리아 감시단체들은 군사작전을 숨기기 위한 정부의 의도적인 움직임이라고 반박했다고 하네요.

구글,아카마이등의 트래픽 현황에 따르면 5월7일(화) 19:00 GMT 부터 인터넷 흐름이 사라졌고 수요일 14:00 GMT 에 트래픽이 다시 시작되었다고 합니다.

[그림] 아카마이 트래픽 현황

[그림] BGPMON 현황

공식적으로는 기술적문제로 인해 발생한 장애라고 하지만, 많은 사람들이 이 사실을 믿기는 힘들어 합니다.  여러분들은 믿으시나요?

한국에서는 인터넷이 잠시만 끊겨도 난리가 날것입니다 :-)


[참고]
1. 이집트 민주화 시위에 인터넷 차단, 네트워크 관점의 자세한 내용을 알아보자.

2013년 5월 6일 월요일

데비안 7.0 Wheezy 공식 릴리즈


오랜 개발 기간 끝에 코드네임 "Wheezy" 인 데비안 7.0 이 5월4일 공식적으로 릴리즈 되었습니다. 이번 릴리즈에 포함된 주요 기능은 저번 데비안 컨퍼런스 DebConf11 에서 소개된 "Multiarch support" 기능이 들어가 있습니다. 파일시스템상의 라이브러리와 헤더 경로를 유연하게 만들어 다른 하드웨어 아키텍쳐에서 라이브러리를 쉽게 설치할 수 있도록해줍니다.  쉽게 말하면 데비안 사용자는 같은 컴퓨터에서 여러 아키텍쳐의 패키지를 설치할 수가 있게 된 것으로 32 비트 64비트 소프트웨어도 완벽하게 동작할 수 있도록 해줍니다.  그리고 개인 클라우드 환경을 사용할 수 있도록 지원해 줍니다. 익숙하게 들었던 Saas(Software as a Service) 형태를 지원하는데, 이것을 지원하기 위하여 오픈스택(OpenStack)과 XCP(Xen Cloud Platform) 을 사용하고 있습니다.

멀티미디어 코덱도 완벽하게 지원하고 설치를 좀더 쉽게 할 수 있도록 많은 향상이 있었다고 합니다. 설치 언어도  73 개국어를 지원하고 거기다 처음으로 데비안에서는 UEFI 를 이용한 부팅을 지원합니다. 다만, 아직 "Secure Boot" 기능은 지원하지 않습니다. 제 바이오스는 이걸 지원하긴 하는데, 아쉽네요.

주요하게 설치된 패키지는 아파치 2.2.22, GCC 4.7.2, LibreOffice 3.5.4, Perl 5.14.2, Python 2.7.3, 3.2.3 , X.Org 7.7 등 36,000 개 이상의 패키지가 설치 준비가 되어 있습니다. 다만 리눅스 커널이 3.2 를 기반으로 하고 있습니다. 현재 최신 리눅스 커널이 3.9 인 것을 보면 다소 늦은 감도 있습니다. 안정성을 추구하다 보니 이런 부분은 감수해야죠 :-)

데비안 6.0 릴리즈를 2011년 초에 포스팅 했었는데, 오랜 시간이 지나 드디어 7.0을 만나보게 되었네요. 야~호 반갑다 Wheezy 야~

다운로드 : http://www.debian.org/CD/http-ftp/

[참고]
1. Debian 7.0 Wheezy released
http://www.debian.org/News/2013/20130504
2. Deploy your own cloud with Debian Wheezy
http://www.debian.org/News/2012/20120425
3. 데비안 6.0 (코드명:Squeeze) 공식 릴리즈!
http://www.packetinside.com/2011/02/60-squeeze.html