DoS(Denial Of Service)

일명 DoS라고 하는 공격은 우리말로 풀어서 설명하면 서비스 거부 공격이라고 하는데요. 이는 공격 대상을 상대로 서비스 불가 상태로 만드는 공격입니다. 시스템의 가용성을 무너뜨리는 공격의 종류입니다. DoS에는 세가지의 공격 유형이 존재합니다. 

1. 파괴 공격 : 데이터나 디스크, 또는 시스템을 파괴하는 공격입니다.

2. 자원 소진 공격 - 시스템: 시스템의 자원을 소진시키는 공격입니다. 예를 들어 CPU의 자원을 소진시키는 공격과 메모리를 사용하는 공격, 디스크 용량을 모두 소진시키는 공격 등이 있습니다. 리눅스에서 무한정 fork()함수를 사용해서 프로세스를 무한정 생기게 만드는 것, 그리고 file을 생성시켜 의미없는 데이터로 디스크를 채우는 공격 등이 있을 수 있겠네요.

3. 자원 소진 공격 - 네트워크 : 역시 자원을 소진시키는 공격인데요. 시스템과는 다르게 네트워크의 대역폭을 소진시키는 공격입니다. DoS에서 네트워크 자원 소진을 통한 공격을 매우 많이 볼 수 있을텐데요. 위의 두 유형보다는 수행이 쉽기 때문입니다. 대표적으로 Http 서버를 DoS로 무력화시키면 해당 웹사이트가 서비스 불가한 상태가 됩니다. 

DoS 공격으로는 아래와 같은 공격이 있습니다.

- Ping Of Death : ICMP 패킷을 정상적인 크기보다 매우 크게 생성해서 전송하는 방식입니다. 이렇게 되면 MTU(Maximum Transfer Unit)에 의해 IP 패킷의 단편화(Fragment)가 발생합니다. MTU는 네트워크 패킷의 최대 전송 크기를 의미하며 이더넷의 경우 MTU는 1500 바이트입니다. 공격 타켓의 컴퓨터에서는 단편화된 페킷을 다시 재조립해야하는데, 이 과정에서 많은 부하가 발생하여 정상적인 서비스를 할 수 없게 만드는 공격입니다.

 

- Land Attack : 출발지 IP 주소와 목적지 IP 주소를 같게 만들어 보냄으로써 자시 자신에게 응답을 보내게 만드는 공격입니다. 이런식으로 서비스를 하지 못하게 하여 가용성을 무너뜨리는 DoS공격 방식입니다. 대부분 OS에서는 출발지 IP주소와 목적지 IP 주소가 같으면 Drop 시킴으로써 현재는 거의 사용하지 않는 DoS 공격입니다. 

 

- Smurf Attack : 출발지 IP 주소를 공격 대상의 IP 주소로 변경하고, ICMP Echo Request를 특정 네트워크에 브로드 캐스트로 보냅니다. 그러면 그 네트워크의 모든 컴퓨터들이 ICMP Echo 응답을 생성해서 공격 대상의 IP 주소로 보내게 되는 DoS공격 기법입니다.

 

- Teardrop Attack : IP 패킷의 재조합 과정에서 Fragment Offset을 일부러 틀리게 전달합니다. 그 결과 재조합하는 과정에서 오류가 발생이 되게 되고, 통신시스템이 문제를 일으키게 되는 DoS 공격방식입니다.

 

이 밖에도 많은 DoS 공격 방식이 존재합니다.

 

DDoS(Distrubuted Denial Of Servier)

DoS 공격을 분산적으로 여러 컴퓨터들이 수행하는 것을 DDoS 공격이라고 합니다. DDoS를 어떤 사람들은 Double DoS라고 하는 분을 봤는데, Distributed DoS입니다. DDoS 공격을 수행하는 컴퓨터는 좀비 PC라고 불립니다. 

 

공격의 흐름은 이렇습니다. 1) 공격자는 C&C 서버라는 서버를 두어서 명령어를 전달합니다. 2) C&C 서버는 공격자로부터 직접 명령을 받아서 감염되어 있는 좀비 PC에 분산하여 명령을 전달합니다.  3) 좀비 PC는 명령을 수행하여 Target PC를 공격하게 됩니다. 좀비 PC는 Bot이라고도 불리는데, Bot은 여러분의 컴퓨터가 될 수 있습니다. 

DDoS 공격의 유형은 아래와 같은 것들이 존재합니다. 

- UDP/ICMP Flooding : 공격자는 다량의 UDP/ICMP 패킷을 서버로 전송하여 네트워크 대역폭을 가득채웁니다. 그래서 다른 사용자들이 서비스를 받지 못하게 만드는 공격입니다.

 

- SYN Flooding : 무수히 많은 다량의 TCP의 SYN 패킷을 공격 대상에게 전달하여 Backlog Queue를 가득채우게 만드는 공격방식입니다. 이 경우 새로운 클라이언트의 연결 요청을 무시하게 되어서 그 클라이언트는 서비스를 받을 수 없게 됩니다. 이 공격방식은 3-Way Handshake의 취약점을 이용한 공격인데요. 클라이언트가 SYN을 보내면 서버에서 SYN+ACK 응답을 보냅니다. 이때 클라이언트가 ACK응답을 보내야만 Connection이 됩니다. 서버에서는 ACK응답이 오지 않은 경우 incomplete queue에 연결 요청정보를 삽입합니다. 반면 ACK가 도착하면 complete queue로 연결 정보를 이동시키죠. 그렇게 되면 accept() 시스템 콜을 통해 연결 socket을 생성시켜 통신하게 됩니다. 이 공격은 SYN 패킷만을 보내고 ACK응답을 주지 않는 공격으로 서버의 incomplete queue를 모두 채워 더는 연결할 수 없는 상태로 만들어버립니다. backlog queue는 incomplete queue와 complete queue를 합친 queue입니다.

 

- HTTP GET Flooding : 동일한 URL을 반복 요청하여 웹서버에 부하를 주는 공격입니다. 자, 여러분 대학교 수강신청때 수강 실패한적이 많죠? 갑자기 서버에 요청이 들어와서 처리할것이 많아 느려졌기 때문입니다. 이러한 현상을 공격으로 만든 것이 HTTP GET Flooding입니다.

 

이 밖에도 해시 도스, 헐크 도스 등 많은 DDoS 공격 방식이 존재합니다. 

DDoS 공격을 수행하는 Tool은 인터넷에 뒤져보면 여러가지 존재합니다. 헐크라던가 슬로로리스등 많은데요. Google에 서치해도 여러가지 많이 나오는데 쉽게 구한다고 해서 쓰게 되면 여러분 어떻게 되는지 아시죠? 그냥 테스트 용도로 자기 PC나 test 서버에다가만 시도하시기 바랍니다. 아래의 링크에서 슬로로리스를 다운받을 수 있습니다.

슬로로리스(HTTP Dos 공격 툴)

https://github.com/gkbrk/slowloris

 

GitHub - gkbrk/slowloris: Low bandwidth DoS tool. Slowloris rewrite in Python.

Low bandwidth DoS tool. Slowloris rewrite in Python. - GitHub - gkbrk/slowloris: Low bandwidth DoS tool. Slowloris rewrite in Python.

github.com

 

이상으로 DoS의 개념, DDoS의 개념을 알아보았습니다.

반응형
블로그 이미지

REAKWON

와나진짜

,

 

 

DNS(Domain Name System)

우리들이 www.naver.com 이나 www.google.com 를 웹브라우저를 통해 접속할때 문자열로 된 주소를 타이핑하여서 웹 사이트에 접속을 하게 되죠? 근데 컴퓨터는 글자로 된 주소는 사실 모르고, 서버 컴퓨터의 IP를 이용해서 웹사이트에 접속하게 됩니다. naver에 접속을 하면 위의 www로 시작하는 주소를 입력하여 접속해도 되지만 이번에는 IP주소를 직접 쳐서 들어가보세요. IP를 알아볼 수 있는 명령어는 nslookup입니다. 저는 naver와 nate의 주소를 알아보았습니다.

nslookup - naver
nslookup - nate

223.130.195.200이라는 IP주소를 웹브라우저에 쳐서 들어가도 똑같이 네이버에 접속이 가능합니다. 네이트의 주소는 120.50.131.112네요.

whois 명령을 사용하면 도메인의 등록 정보를 알아볼 수 있습니다. 단, 업체에서 whois서버가 따로 존재해야합니다. 사용 방법은 whois 도메인명 혹인 whois IP주소 를 쳐서 도메인 등록 정보를 알 수 있습니다. google도메인에 대한 정보를 알아봤습니다. whois google을 타이핑해보세요.

whois google

 

아무튼 그렇다면 컴퓨터가 어떻게 이 주소를 알수 있을까요? 컴퓨터는 다음의 순서로 알아냅니다. 

1. 로컬 DNS Cache에서 IP 검색

2. hosts파일에서 IP 검색

3. DNS 서버에 질의

로컬에 저장된 캐시에 해당 IP주소가 있는지 확인하고 그래도 없으면 hosts파일에서 IP를 찾아옵니다. (참고로 DNS Cache를 삭제하려면 /etc/init.d/dns-clean restart 명령을 사용하여 삭제하면 됩니다.)
이 DNS 캐시에도 없으면 DNS서버에 물어보게 되죠. hosts파일은 무엇일까요? 리눅스에서 /etc/hosts파일을 아래와 같이 수정해봅시다. 네이버의 주소를 네이트의 IP주소를, 네이트의 주소를 네이트의 IP주소로 저장해 놓으면 www.naver.com  접속시 네이트가 접속이 됩니다. 물론 악의적인 사람은 이 파일을 악용하는 사람들도 있겠죠?

 

 

hosts파일에도 맞는 IP주소가 없으면 이제 서버에 여쭈어보게 됩니다. 이 서버 불쌍한 놈입니다.. 우리가 알려달라고 하면 여기 저기 물어보고 그제서야 알려줍니다.

dns 질의

사용자의 컴퓨터는 google의 주소를 서버에 물어봅니다. 우리가 www.google.com이라고 치면 사실 www.google.com. 으로 되어 접속이 됩니다. 여기 맨 끝에 끝나는 . 을 루트 도메인이라고 부릅니다. 자, 우리가 직접 물어본 서버는 이제 최상위의 Root DNS서버(.)에게 google IP에 대해 질의합니다. Root DNS 서버는 다음 도메인(.com)의 서버를 알려줍니다. 이제 우리 서버는 COM 서버에 질의합니다. 이 불친절한 com 서버도 역시 google.com의 서버에게 질의하라고 넘깁니다. 이제 google.com 서버에 질의합니다. google.com은 www.google.com의 IP주소를 를 알려줍니다. 이제 우리의 서버는 IP주소를 사용자에게 알려주지요. 이렇게 주소를 받은 사용자 컴퓨터는 다음에 또 물어보기 미안하기 때문에 DNS Cache에 일정시간 동안 저장합니다.

이때 사용자가 질의하는 방식을 재귀적 질의(Recursive Query)라고 하며, DNS서버가 다른 DNS서버에게 질의하는 방식을 반복적 질의(Iterative Query)라고 합니다. 우리가 Recursieve Query를 날리는 서버는 보통 인터넷 서비스 제공 업체의 서버 주소입니다. Root DNS 서버나 Com DNS 서버를 Authoritative DNS 서버라고 합니다.

DNS서버의 IP주소는 어디에 기록되어 있을까요? 리눅스에서 /etc/resolv.conf 가 DNS 서버의 주소를 갖고 있습니다. 

/etc/resolv.conf

 

DNS는 보통 UDP 53번 포트를 사용합니다. TCP 53번도 쓰는 경우가 있는데, 이것은 DNS 헤더의 특수한 flag를 설정하면 TCP로 DNS 연결을 할 수 있고, 응답하는 데이터가 512 바이트를 넘어갈 경우 TCP를 통해 응답합니다.

실제 DNS 헤더는 어떤 정보를 담고 있을까요? 다음은 저의 DNS 패킷 중 하나입니다. 제가 사용하는 DNS서버의 주소는 210.220.163.82 인것을 알 수 있습니다. 여기에 Transaction ID와 Flag, 그리고 가장 밑에 질의(Query)를 볼 수 있습니다. 질의 형태(type)은 주로 A인데요. DNS의 본질인 IP주소를 받아오는 질의 타입이 A입니다.

 

 

DNS Query 요청

그리고 그에 대한 응답입니다. 응답에서 Transaction ID를 보면 이전에 요청했던 Transaction ID와 같은 것을 볼 수 있습니다. 그리고 우리가 알고 싶은 IP주소는 Answer필드에 있는 것을 볼 수 있네요.

DNS response

 

DNS의 패킷 그대로를 살펴보면 가장 마지막 4바이트가 우리가 원하는 주소라는 것을 알 수 있습니다. AC D9 A1 EE(172 217 161 238)이 주소이지요.

DNS raw packet

 

DNS의 질의는 아래 표에 정리되고 있습니다.

질의 TYPE 설명
A 도메인에 대한 IP 정보를 담고 있습니다.
ANY 도메인에 대한 모든 정보를 질의합니다.
MX 메일 서버에 대해 질의합니다.
NS Name Server에 대한 질의를 합니다.
SOA zone파일의 SOA 에 대해 질의합니다.
HINFO Host에 대한 정보의 질의를 합니다.
PTR Reverse Zone 파일에 설정된 PTR 레코드를 질의합니다. 
CNAME 호스트의 Alias 정보에 대한 질의입니다.

 

이상으로 DNS에 대한 개념과 실 데이터를 구경해보았습니다. 

 

 

반응형
블로그 이미지

REAKWON

와나진짜

,

 

 

ARP(Address Resolution Protocol)

ARP는 논리적인 주소(Logical Address)를 물리적 주소(Physical Address)로 변환하는 프로토콜을 의미합니다. 논리적인 주소라함은 IP주소, 물리적 주소는 MAC 주소(하드웨어 주소)라고 생각하면 훨씬 편합니다. IP주소는 어떻게 생겼죠?

예를 들어 저의 IP는 192.168.35.10이라고 해봅시다. 그리고 저희 MAC주소는 AA:BB:CC:DD:EE:FF라고 해볼게요. 저의 IP주소는 저 말고도 다른 사람도 쓸 수 있습니다. 왜냐면 네트워크는 특정 구역마다 나누어져 있으니까요. 쉽게 라우터를 기준으로 나누어져 있다고 생각하시면 됩니다. 그래서 논리적인 주소라 칭합니다. 저의 MAC주소는 이 세상에 단 하나밖에 없습니다. 하드웨어 고유한 주소이기 때문에 물리적 주소라고 합니다.

같은 네트워크에서는 IP주소로 통신하지 않고 물리적 주소를 가지고 통신합니다. 즉, MAC주소를 사용하여 통신한다는 것이죠. 스위치가 왜 2계층에 동작하는 것이 그 이유입니다. 2계층에서 MAC주소만 보아 정보 전송을 하면 되니까요.

어쨌든, IP주소를 MAC주소로 변환하는 프로토콜이 ARP라고 하는 거죠. ARP의 동작 방식을 보도록 합시다. 

1. 초기 Host A는 192.168.30.6에 MAC주소를 모르니까 네트워크 전체에 192.168.30.6에 대한 MAC주소를 물어보는 요청을 보냅니다.

ARP Request

 

2. 이 IP주소에 맞는 다른 호스트는 자신의 MAC주소를 담아 응답을 보냅니다. 요청 메시지에 자신의 MAC주소를 요청한 호스트 A의 IP주소가 있기 때문에 A에게 응답을 곧장 보낼 수 있습니다. 

ARP Reply

 

3. MAC주소를 알아낸 호스트 A는 ARP의 정보를 담고 있는 저장소에 192.168.30.6의 MAC주소를 업데이트 합니다. 이 저장소를 ARP Cache라고 하며 일정 시간 후에 이 정보를 삭제합니다.

 

RARP(Reverse ARP)

반대로 MAC주소를 IP주소로 변환하는 프로토콜은 무엇일까요? ARP의 반대 과정을 거친다고 하여 RARP(Reverse ARP)라고 합니다. RARP 동작이 되려면 따로 RARP 서버가 존재하여야합니다. 자신의 IP를 모를때 이 프로토콜을 사용합니다. 동작방식은 아래의 순서와 같습니다.

1. 최초 호스트 A는 자신의 IP를 모르는 상태이기 때문에 IP를 요청하는 RARP Request를 Broadcasting으로 보냅니다. 이때 요청에는 자신의 MAC주소가 기재되어있습니다.

RARP Request

 

 

2. RARP 서버는 요청한 호스트 A의 IP 주소를 담은 RARP 응답 메시지를 만들어 Host A에게 전송합니다. 

RARP Reply

 

ARP Cache

실제 ARP cache는 어떻게 생겼을까요?  cmd 창을 열고 arp -a 명령을 처보면 아래와 같이 ARP Cache 내용을 볼 수 있습니다. 저는 가장 호스트까지 있기 때문에 인터페이스가 2개가 잡히는데, 아니면 하나만 보일 수 있습니다. 여기에 IP주소와 MAC주소가 보이시죠? 그리고 맨 오른쪽에 정적, 동적이 보이는데, 정적은 등록된 ARP정보가 수동으로 시스템 종료가 되기 전까지 영구적으로 설정이 된것이고 동적은 컴퓨터가 알아서 설정한 것이고 시간이 지나면 없어지게 됩니다.

arp -a

ARP Cache내용을 지우려면 arp -d를 사용하시면 됩니다. arp -d를 쳤을때 관리자 권한이 필요하다고 나온다면 cmd를 오른쪽 마우스를 클릭하면 관리자 권한으로 실행이라는 항목이 보이실 겁니다. 이것을 통해 cmd를 실행해보세요.

지워도 되냐구요? 단순히 컴퓨터를 쓰는 일반 사용자라면 지우셔도 됩니다. 다시 업데이트 될거니까요. 그 후 arp -a를 보면 반드시 필요한 몇개의 MAC주소를 제외하면 지워진것을 볼 수 있습니다. 

그리고 정적으로 MAC주소를 등록하려면 arp -s를 이용하면 됩니다. 아래와 같이 "arp -s IP주소 MAC주소" 를 입력하면 됩니다.

arp -s

 

 

ARP 스푸핑(ARP Spoofing)

혹은 ARP Cache Poisoning이라고 합니다. 공격자는 두 호스트의 통신을 감시하기 위해서 두 호스트의 ARP Cache를 변경하는 것을 공격방법입니다. 공격자는 아래의 그림처럼 지속적으로 ARP 응답을 보냅니다. 물론 잘못된 정보로 말이죠. 

 

 

만약 동적으로 ARP 정보가 등록되어있다면 시간이 지나면 삭제되는 것을 이용합니다. 그때 응답을 받으면 피해 컴퓨터는 잘못된 정보로 ARP Cache를 업데이트하게 됩니다. 여기서 AA:AA:AA:AA:AA:AA의 MAC주소를 갖는 호스트를 Alice, BB:BB:BB:BB:BB:BB의 MAC주소를 갖는 호스트를 Bob라고 부르도록 하겠습니다. 공격자 자신은 정상적인 ARP Cache를 가지고 있습니다.

이때 Alice가 Bob에게 데이터를 전송할때 C에게 그 정보를 전송합니다. 맨 처음에 같은 네트워크는 MAC주소만 보고 그 데이터를 전달한다고 했죠? 그러니 공격자의 MAC주소인 CC:CC:CC:CC:CC:CC으로 전달하게 되죠. 공격자는 이제 Alice의 데이터를 볼 수 있죠. 이것을 다시 정상적인 Bob에게 전달합니다. 이렇게 Alice와 Bob를 속이고 그 당사자인척 하는 공격방법이 스푸핑이라고 합니다.

ARP spoofing

 

반대로 Bob이 Alice에게 데이터를 보낼때도 공격자를 거쳐가게 되죠. Bob의 ARP Cache도 오염되어 공격자의 MAC주소로 업데이트되었기 떄문이죠.

공격자는 2계층의 MAC주소를 그 사람인척 위장해야하므로 같은 네트워크에 위치해야합니다. 

대응

- 위에서 본 정적 arp cache를 구성하면 시스템 종료시까지 막을 수 있습니다. 또한 시스템 가동시마다 arp를 정적으로 구성해주어야합니다. 물론 매번 arp를 정적으로 구성하는 것은 까다로울 수 있으니 자동화된 프로그램을 사용하는 것이 좋겠죠.

- arp cache의 변경을 감지하는 프로그램을 사용할 수도 있습니다.

여기까지 ARP에 대한 개념과 설명, 그리고 ARP Cache와 Reply를 통해서 스푸핑할 수 있는 원리에 대해서 알아보았습니다.

 

 

반응형
블로그 이미지

REAKWON

와나진짜

,

 

 

IPSec(IP Security)

IP계층(네트워크 계층)을 안전하게 보호하기 위해서 IPSec이라는 보호 기법을 사용합니다. TLS와 같은 안전한 통신 기법만 있으면 되지, 왜 굳이 IPSec이 필요하느냐에 대한 물음을 갖을 수 있습니다. TLS는 TCP 프로토콜만을 보호합니다. 전송 계층에는 TCP뿐만 아니라 UDP도 있지요. TCP뿐만 아니라 UDP, 혹은 더 상위 계층까지 보호하기 위한다면 더 낮은 계층에서 보호하는 것이 효과적이겠죠. 그래서 IP계층에서 데이터를 보호하는 것입니다. 대부분의 네트워크 응용프로그램은 IP 계층을 사용하기도 하니까 IP계층에서 동작하는 보안, 즉, 페킷에 대한 보안을 제공하는 IP Security(IPSec)이 필요합니다.

 

IP Sec은 그림에서 보는바와 같이 IP계층을 집중적으로 보호합니다.

 

두가지 모드

IPSec에는 두 가지 모드가 있는데, IP의 내용(payload)만을 보호하느냐, 아니면 헤더까지 모두 보호하느냐에 따라서 전자는 전송 모드(Transport Mode), 후자는 터널 모드(Tunnel Model)라고 합니다.

 

전송 모드(Transport Mode)

전송모드는 전송 계층와 네트워크 계층 사이에 전달되는 payload를 보호합니다. 중간에 IPSec 계층이 있기 때문에 IPSec헤더가 붙고, 이후에 네트워크 계층에서는 이것이 모두 상위층에서 보낸 데이터(payload)로 취급이 되므로 IP 헤더가 붙고 아래 계층으로 전달되지요. 

 

 

 

전송모드는 host-to-host( end-to-end)간 데이터 보호가 필요할때 사용이 됩니다. 아래는 전송모드의 데이터 전송 흐름을 보여줍니다.

 

왼쪽 컴퓨터(host)는 IPSec을 적용하여 데이터를 보냅니다. 네트워크를 통해서 오른쪽 컴퓨터로 데이터가 도착합니다. 자, 이 사이에서 다른 사람이 데이터를 가져가도 IPSec에 대한 보호가 이루어져있으므로 볼 수 없고 라우터를 거쳐 두 당사자만 데이터를 보호할 수 있지요. 그래서 종단 간의 보호(End-To-End Protection, E2EP)가 이루어 질 수 있습니다. 

 

 

 

터널 모드(Tunnel Mode)

터널 모드는 IPSec이 IP 헤더를 포함한 IP 계층의 모든 것을 보호합니다. IP 헤더까지 완전히 보호하고 IPSec의 헤더를 추가하였으니 기존의 IP헤더를 볼 수 없기 때문에 새로운 IP 헤더가 추가됩니다. 

 

이 IPSec 헤더와 새로운 헤더는 누가 추가해줄까요? 바로 호스트, 종단이 아닌 그 중간자가 추가해줍니다. 보통 라우터가 되지요. 

 

 

아래는 그 흐름을 보여주는데, 전송모드와는 다르게 호스트 A는 별다른 IPSec의 조취를 취하지 않습니다. 하지만 Router A에서 IPSec을 적용하고 새로운 IP 헤더를 추가합니다. 이 헤더에는 목적지 라우터의 주소가 있어서 Router B로 보냅니다. Router B는 이후에 적절한 조취를 취하고 새로운 IP헤더와 IPSec헤더를 제거한 후 Host B에게 전달합니다. 마치 RouterA, RouterB가 터널 역할을 하는 것 같네요.

 

터널 모드는 보통 두개의 라우터간, 호스트와 라우터간, 라우터와 호스트간에 사용이 되는데, 즉, 송수신자 양쪽 모두가 호스트가 아닌 경우에 사용됩니다.

 

 

두 가지 프로토콜

IPSec은 또 두가지 보안 프로토콜을 제공하는데, 인증에 대해서만 검사하는 인증헤더 프로토콜(AH: Authentication Header Protocol)과 페이로드 전체를 보호하여 기밀성을 제공하는 보안 페이로드 캡슐화(ESP: Encapsulating Security Payload)가 그것들입니다.

 

AH(Authentication Header)

발신지 호스트를 인증하고 IP패킷의 무결성을 보장합니다. 인증을 위해서 해쉬함수와 대칭키가 사용되어 Message Digest를 생성하고 헤더에 삽입합니다. AH는 인증과 무결성을 보장하지만 비밀은 보장해주지 않습니다.

 

Next Header : IPSec 다음에 오는 페이로드의 헤더를 말합니다. TCP인지 UDP인지 또는 ICMP인지 의미합니다.

Payload Length : 인증헤더의 길이를 말하며 4바이트 배수가 됩니다. 

Security Parameter Index : 32비트 보안 매개변수 색인(SPI) 필드는 Security Association에 대한 식별자입니다.

Sequence Number : 32비트 순서번호인데 이것은 replay attack을 방지합니다.

Authentication Data: 헤더를 포함하여 전체 페킷에 대한 데이터를 인증 데이터로 만드는데, 이때 IP 헤더의 변경될 수 있는 데이터는 제외하고 인증데이터를 만들게 됩니다. 예를 들어 TTL같은 변경이 될 수 있는 데이터는 인증 데이터를 만들때 포함하지 않습니다. 만들면 AH의 Authentication Data필드에 삽입됩니다.

 

ESP(Encapsulating Security Payload)

AH가 데이터의 기밀성을 보장할 수 없지만 ESP는 기밀성을 보장할 수 있습니다. 또한 AH가 보장하는 IP패킷의 무결성 등 AH가 제공하는 서비스를 모두 보장할 수 있습니다.

 

ESP 헤더의 각각 필드는 32비트입니다. 

눈에 익은 필드들이 몇개 보이지요? 대부분은 AH의 필드와 유사합니다. 또 payload를 암호화하고 있네요.

 

Authentication Data : AH와는 다르게 인증데이터가 IP헤더를 포함하지 않습니다. ESP헤더까지만 인증데이터로 만들고 ESP Trailer에 붙이게 됩니다.

 

AH와 ESP의 대한 차이는 다음의 표로 간략하게 정리하였습니다.

Services AH ESP
Access Control O O
Message Authentication
(Message Integrity)
O O
Confidentiality X O
Replay Attack Protection O O
Entity Authentication
(Data Source Authentication)
O O

 

접근제어가 보장된다는 것을 알기 위해서는 SAD(Security Association Database), SP(Security Parameters) 등의 용어에 대해서 이해해야하는데, 이것은 다음 포스팅에서 설명하도록 하겠습니다.

 

 

반응형
블로그 이미지

REAKWON

와나진짜

,

 

 

SSL(Secure Socket Layer)

SSL은 1994년 netscape사의 웹 브라우저 보안 프로토콜로 처음 고안되어 1996년까지 버전 3.0까지 발표되었는데, 3.0을 표준화한 것이 TLS라고 합니다. 통상적으로 SSL과 TLS는 같은 의미로 사용됩니다.

 

SSL은 왜 생겨났을까요? 

아마 암호화를 배우신 분이라면 대칭키 암호, 비대칭키 암호를 배우셨을텐데, 대칭키는 빠른 대신 서로간의 공통적으로 알고 있는 키를 공유해야합니다. 대칭적이죠? 그래서 대칭키 암호입니다. 비대칭키는 비대칭적으로 서로 다른 키를 갖고 있어 암복호화를 합니다. 

대칭키암호와 비대칭키 암호에 관한 설명은 지난 포스팅을 참고해주세요.

 

우리는 대칭키를 공유할때 외부로의 노출이 발생하게 됩니다. 이 키를 중간에서 가로채게 된다면? 망하는거지요. 

그렇다면 대칭키는 우리들 머릿속에서 지워버리고 비대칭키로 암호화 통신을 하면 되겠군요. 가능할 수는 있지만 너무 느리고 비효율적입니다. 

그렇다면 처음 대칭키를 교환할때만 비대칭키 암호를 사용하면 어떨까요? 바로 TLS가 그런 역할을 합니다.

TLS에서 제공하는 보안 서비스

1. 기밀성 (이거 북한 어떤 개랑 발음이 똑같네요)

- 대칭키 암호를 사용하게 되면 기밀성을 제공할 수 있습니다. 남들이 데이터를 훔쳐가도 볼 수 없는 비밀을 제공합니다. 

2. 무결성

- 메시지 인증 코드(MAC: Message Authentication Code)를 통해서 메시지 인증을 제공합니다. 위, 변조 여부를 확인할 수 있지요.

3. 인증

- 연결 초기 설정에서 주고 받는 인증서를 통해서 신뢰할 수 있는 개체인지 인증할 수 있습니다.

 

TLS는 전송 계층 위에서 TLS 계층을 따로 두어 동작하게 됩니다. TLS를 사용하는 어플리케이션 프로토콜은 끝에 s가 붙게 되는데 TLS기반의 HTTP는 HTTPS라고 지칭합니다. TLS기반의 FTP는 역시 FTPS라고 부르지요. 

 

TLS의 세부 프로토콜은 다음과 같습니다.

프로토콜 상세 설명
Handshake 양쪽 간에 연결을 설정할때 보안 협상을 위한 프로토콜입니다. 연결 설정 과정은 아래에서 설명합니다.
Change Cipher Spec 보안 파라미터를 변경하거나 적용할때 사용합니다. 예를 들어 대칭키 알고리즘을 변경할때 이 프로토콜이 사용됩니다.
Alert 오류를 전송할때 사용되는 프로토콜입니다.
Application Data 실제 데이터가 전송될때 사용되는 프로토콜입니다.
Record  협상된 보안 파라미터를 이용하여 암,복호화, 무결성 검증 등을 수행하는 프로토콜입니다.

 

상태 유지(Stateful) 프로토콜 

TLS는 세션과 연결별로 상태정보를 유지합니다. TLS는 Full Handshake를 통해서 세션을 생성하고 이 세션 정보를 공유하는 여러 연결을 Abbreviation Handshake를 통해서 성립합니다. 

Full Handshake는 아래에 그림과 같이 설명합니다. Abbrevation Handshake는 세션이 이미 존재할때 사용하는 Handshake방식입니다. 

 

용어가 조금 혼동이 될 수 있는데 연결은 서버와 클라이언트 간 통신의 단위를 말하여 세션은 그 연결의 다수로 이루어지며 세션은 한번 성립되면 다음 연결을 위해서 상태를 유지(session id, negotiated cryptography parameters 등)할 수 있습니다. 예를 들면, 이미 한번의 연결을 하여 암호화 방식, 인증서 교환, session id를 공유했고 할 일이 모두 끝나 연결을 끊었습니다. 이 후 다음 연결에 이 세션에 대한 정보를 이용하여 별도의 번거로운 과정없이 연결을 할 수 있는 겁니다.

 

Handshake

Client → Server :

Client ← Server :

1) Client Hello (Client 안녕)

Client가 서버에 접속할때 몇가지 데이터를 주는데 첫 인사치고는 조금 깁니다. 무엇이 있나 보도록할까요?

- random : 클라이언트는 32바이트 난수값을 전달합니다. 이 랜덤값은 나중에 비밀 데이터를 위해 사용이 됩니다. 비밀 데이터를 master secret이라고 합니다.

- session ID : 세션을 처음 생성할때는 빈값, 이미 생성된 세션이 있다면 그 세션 ID를 전달합니다. 

- cipher suite : 클라이언트가 지원가능한 키 교환 알고리즘, 대칭키 암호 알고리즘, 해시 알고리즘 등을 알려줍니다. 클라이언트와 서버 사이에 갖고 있는 알고리즘이 다 다르겠죠? 그래서 서버는 이 중에 최적의 방식을 선택합니다. 

EX) TLS_RSA_WITH_AES_128_GCM_SHA256 : 보통 이런식인데, 키 교환 알고리즘은 RSA, 대칭키 알고리즘은 AES_128 GCM방식을 사용하고 Hash 알고리즘으로는 SHA256을 사용한다는 것입니다.

 

2) Server Hello (Server 안녕)

사용할 TLS버전, 클라이트, 서버 공통으로 지원가능한 최적의 Cihper suite, 압축 방식 등을 client에게 전달합니다. 이 밖에도 다음 정보를 전달하는데요.

- random : 역시 server도 32바이트 난수를 생성해서 client에게 전달합니다. 역시 나중에 master secret이라는 비밀값을 생성할때 사용되는 재료입니다.

- session ID : 세션 정보를 보냅니다.

 

3) Server certificate

아까 TLS가 인증(TLS의 보안 서비스 3가지 : 기밀성, 무결성, 인증) 서비스를 제공한다고 했습니다. 이 인증서를 이용해서 클라이언트는 서버가 믿을 만한, 신뢰할 만한 서버인지 확인합니다.

 

 

4) Server key exchange

키 교환에 필요한 정보를 제공합니다. 만약 필요하지 않으면 이 과정은 생략이 가능한데, 예를 들어 키교환 알고리즘을 Diffie-Hellman으로 사용한다면 소수, 원시근 등이 필요하므로 이것을 전송합니다.

 

5) Certificate request

서버 역시 클라이언트를 인증해야할때 인증서를 요구할 수 있습니다. 요청하지 않을 수도 있습니다.

 

6) Server hello done

서버의 인사가 끝났네요. 

 

7) Certificate 

방금 전 서버가 요청했던 인증서를 줄 수 있습니다. 요청하지 않았으면 필요없는 과정이네요.

 

8) Client key exchange

키교환에 필요한 정보를 서버에 제공합니다.  이 정보를 pre-master secret이라고 하는데 이게 대칭키에 사용되는 것으로 절대 노출이 되어서는 안됩니다. pre-master secret은 이전에 서버로부터 받은 랜덤값 있었죠? 이것과 클라이언트가 생성한 랜덤값을 조합하여 서버에게 전송합니다. 그냥 보낼까요? 아니죠. 이렇게 민감한 정보는 암호화를 해서 보내야하는데 어떻게 암호화를 할까요? 

이전에 우리는 인증서를 받았습니다. 인증서 안에는 서버의 공개키가 있습니다. 이것으로 서버에게 암호화하여 전송합니다. 

클라이언트는 자기가 생성했으니 이미 가지고 있고, 서버가 무사히 암호화된 pre-master secret을 받았다면 자신의 개인키로 복호화할 수 있습니다. 이제 서로가 pre-master secret을 공유하고 있지요? 이 pre-master secret을 일련의 과정을 거쳐 client/server는 master secret으로 만들게 됩니다.

클라이언트, 서버는 master secret으로 세션에 사용될 키를 생성하게 되는데, 이 키가 바로 대칭키입니다.

 

9) Certificate verify

클라이언트에 대한 Certificate request를 받았다면 보낸 인증서에 대한 개인키를 가지고 있다는 것을 증명합니다. handshake과정에서 주고 받은 메시지 + master secret을 조합한 hash값에 개인키로 디지털 서명하여 전송합니다.

 

10) Change cipher spec

협상된 보안 파라미터를 적용하거나 변경될때 서버에게 알립니다.

 

11) Finished

클라이언트 끝

 

12) Change cipher spec

클라이언트에게 보안 파라미터 변경을 알립니다.

 

13) Finished

서버도 끝

 

14) 통신

이제 주고받은 비밀키를 통해서 안전하게 통신하면 됩니다.

 

이상으로 TLS에 대한 기본적인 개념과 연결과정을 알아보았습니다.

 

 

반응형
블로그 이미지

REAKWON

와나진짜

,

UDP(User Datagram Protocol)

TCP가 신뢰성에 기반을 둔 전송 계층 프로토콜이라면 UDP는 빠른 데이터 전송 위주의 프로토콜입니다. 속도를 떨어뜨리는 요소를 없애 TCP처럼 각종 흐름제어, 오류제어, 혼잡 제어를 하지 않습니다. 따라서 UDP는 비신뢰성(Unreliable) 프로토콜입니다.

 

이 UDP 프로토콜, 저와 같은 세대시라면 어디서 많이 보셨죠? 저는 뮤컨을 위해서 스타크래프트의 UDP는 필수였습니다. 이렇게 데이터는 그다지 중요하지 않으면서 속도가 빠른 데이터 전송이 필요할때 UDP를 사용합니다.

 

데이터 전송과정을 보게 되면 이렇습니다.

만일 송신에서 데이터를 1, 2, 3 순으로 전송했다고 할때 네트워크의 사용량에 따라 어떤 데이터그램은 늦게 도착할 수 있습니다. 3번 데이터그램이 가장 좋은 경로를 타고 와서 먼저 도착하게 됩니다. 그 이후에는 1번 데이터그램이 도착하겠네요. 마지막으로 가장 부하가 많은 경로를 타고 들어온 2번 데이터그램이 도착합니다. 

결국 수신자는 3, 1, 2 데이터그램 순으로 전달받게 됩니다. 연결과정 자체를 갖지 않기 때문에 데이터의 순서를 보장하지 않습니다.

 

 

 

헤더 정보(UDP Header)

빠른 전송을 요구할때 쓰이는 UDP는 헤더의 구조가 너무나 간단합니다. 헤더는 단 4가지 정보만 존재합니다.

 

UDP 헤더 정보

너무 간단합니다.

- Source Port : 송신지의 Port 번호입니다.

- Destination Port : 목적지의 Port 번호입니다.

- Total Length : 헤더를 포함한 전체 데이터그램의 크기를 의미하는 필드입니다.

- Checksum : 데이터그램의 오류를 확인하기 위한 필드입니다.

 

UDP 특징

UDP의 특징을 요약하면 다음과 같습니다.

1) TCP와 같이 연결을 성립하는 3-way-handshake와 같은 과정이 없습니다. 따라서 비연결형인 특징을 갖습니다. 연결을 확립하는 TCP는 회선을 연결한듯 정확한 연결을 요구하므로 가상회선 방식이라 하며 UDP는 그런 과정없이 데이터를 쪼개 보내므로 데이터그램 방식이라 합니다.

2) 따라서 데이터의 순서, 유실을 보장하지 않고, 데이터 수신 실패시 재전송을 요구하지 않습니다. 데이터를 수신할때 순서가 뒤바뀔 수도 있습니다. 이는 곧 비신뢰성을 의미합니다. 

3) 데이터를 일방적으로 수신받기 때문에 속도가 매우 빠릅니다.

4) 데이터의 checksum으로 최소한의 오류만을 검출합니다. 그러니까 받는 데이터는 검사를 하지만 유실된 데이터는 모른다는 것이지요.

 

 

반응형
블로그 이미지

REAKWON

와나진짜

,

 

 

TCP(Transmission Control Protocol)

IP 계층 위에서 동작하는 TCP는 연결 지향 프로토콜입니다. 마치 물리적인 선로로 연결되어 있는 것처럼 가상의 연결 통로를 설정하여 통신합니다. 그만큼 정확한 데이터 전송을 요구하며 신뢰성을 보장하기 때문에 신뢰할 수 있는 프로토콜(Reliable Protocol)이라고 합니다. 신뢰성 보장을 위해서 다음의 제어를 수행합니다. 

 

1) 흐름 제어(Flow Control)

데이터를 보내는 사람, 받는 사람이 있다고 할때 줄 수 있는 양, 받을 수 있는 양이 다릅니다. 그래서 상대방이 받을 수 있을 만큼의 양으로 적절히 전송하는 것을 흐름제어라고 합니다. 

 

2) 혼잡 제어(Congestion Control)

네트워크가 혼잡해지면 송신자가 데이터의 전송량을 제어하는 것을 뜻합니다. 혼잡하다라는 것을 어떻게 알 수 있을까요? 데이터의 손실 발생이 많아지면 이는 즉, 네트워크가 혼잡한 상태로 판단하여 전송량을 제어하게 됩니다.

 

3) 오류 제어(Error Control)

데이터의 오류나 손실없는 전송을 보장해주는 것이 혼잡 제어입니다. 오류 발생 시 TCP는 데이터를 제전송합니다.

 

 

 

 

 

TCP 헤더

TCP 프로토콜은 신뢰성을 보장하기 위해서 헤더에 많은 정보를 포함하게 되는데 각 필드에 어떤 정보를 포함하는지 알아보도록 하겠습니다.

TCP 프로토콜의 구조

 

- Source Port: 출발지의 포트, 즉 데이터를 보내는 컴퓨터의 포트 정보입니다. 컴퓨터가 갖을 수 있는 포트는 65536개이므로 사이즈가 2바이트인것을 확인하세요. 

 

- Destination Port: 반대로 목적지의 포트입니다. 

 

- Sequence Number : 송신 데이터의 일련 번호를 담고 있습니다. 

 

- Acknowledgement Number : 그전의 데이터를 잘 받았다는 표시로 상대방이 다음에 전송할 일련번호를 담고 있습니다. 줄여서 ACK라고 하겠습니다.

 

- HLEN(Header Length) : 헤더의 정보를 담고 있습니다. 4 bits의 워드 단위입니다. 헤더의 길이는 최소 20바이트 ~ 60바이트까지입니다.

 

- Reserved : 예약된 비트입니다. 아직 사용하지 않습니다. 나중을 위해서 남겨두는 비트인 셈이지요.

 

- Control Flags 

FLAG 설명

URG

(Urgent Pointer)

Urgent Pointer의 필드가 유요하다는 의미의 FLAG

ACK

(Acknowledgement)

수신 확인 응답 FLAG

PSH

(Request for push)

송수신 버퍼의 있는 데이터 즉시 처리 요청 FLAG

RST

(Reset the connection)

연결을 강제 중단합니다. TCP가 유지되고 있을때 이 FLAG를 사용하면 그 즉시 연결을 끊어 버립니다. 해커들이 Hijacking을 위해 피해자의 연결을 끊어버릴때 사용합니다. 보통의 정상적인 종료는 아래의 FIN FLAG를 설정합니다.

SYN

(Synchronize sequence number)

연결 설정 FLAG

FIN

(Terminate the connection)

정상 종료의 연결 종료 FLAG

 

- Window Size :  수신자에서 송신자로 보내는 수신자의 윈도우 사이즈입니다. 즉, 수신 버퍼의 여유공간 크기를 의미하게 되지요. 송신자는 이 윈도우 사이즈 범위 내에서 수신측의 수신 확인(ACK)을 확인하지 않고 연속적으로 데이터를 보낼 수 있습니다.

 

- Checksum : 오류를 검사하기 위한 필드입니다. 전체 데이터가 오류가 나 변형되었는지 확인합니다. 

 

- Urgent Pointer : 긴급 데이터의 위치값을 담고 있습니다. 

 

 

 

 

 

 

 

 

TCP의 연결 설정 과정(3-way handshake)

TCP연결은 어떻게 연결이 될까요? 3단계 절차에 따라서 연결이 성립됩니다. 이때 사용되는 FLAG는 2개입니다. 바로 SYN과 ACK입니다. 다음의 그림을 통해서 연결과정을 알아보도록 합시다.

 

3-way handshake

 

1. 최초 클라이언트 측에서 동기화를 위해 SYN FLAG와 함께 Seq(uence) Number를 임의로 설정해서 보내줍니다. 이때 최초의 Seq number를 ISN(Initial Sequence Number)라고 합니다.

아직 상대방에게서 데이터를 수신하지 않았으므로 Ack(nowledgement) Number 필드는 비어있네요. SYN 패킷을 보냈으므로 클라이언트의 상태는 SYN_SENT가 됩니다. 서버는 SYN을 받았으므로 SYN_RECV 상태 또는 SYN_RCVD상태가 됩니다.

 

이때 클라이언트가 적극적으로 연결 요청을 하고 있네요. 이것을 Active Open이라 합니다. 서버는 수동적으로 받아들이고 있네요. 이것을 Passive Open이라고 합니다.

 

2. 서버에서 동기화 요청을 받았으면 잘 받았으니 연결하자고 요청합니다. 클라이언트에서 보낸 Ack number에 받은 Seq에 +1을 하여 다음 Seq Number를 요구합니다. 클라이언트의 Seq number가 100이므로 101을 Ack number로 보내는 군요. 또한 자신도 역시 ISN을 설정하여 다시 클라이언트로 보냅니다. 

이때 사용한 플래그는 ACK와 SYN입니다. ACK와 SYN이 유요한 데이터이기 때문이죠. 이 페킷을 보낸 후 서버는 연결 확립(ESTABLISHED)상태가 됩니다. 

 

3. 클라이언트는 이에 대한 응답으로 서버에게 ACK num을 설정하여 보냅니다. 이 패킷을 준 후 클라이언트도 연결 확인 상태가 됩니다.

 

이렇게 보면 초기에 데이터가 왔다 갔다 3번하고 있죠? 이것을 3-Way Handshake라고 합니다.

 

아래는 실제 3 way handshake를 와이어샤크로 찍어본 화면입니다.

wire shark hand shake

 

 

연결 종료(4-way handshake)

정상적인 연결 종료는 FIN, ACK의 플래그를 통해서 이루어집니다. 아래와 같이 4단계를 거쳐 연결이 종료가 됩니다. 

1. 연결상태에 있던 클라언트가 연결을 종료하기 위해 FIN을 보냅니다. 이때 클라이언트의 상태는 FIN_WAIT_1 상태가 되고 서버는 CLOSE_WAIT 상태가 됩니다. 3 way handshake와 마찬가지로 먼저 close요청을 한쪽이 Active Close, 받은쪽이 Passive Close라고 합니다.

 

2. 수신하는 서버는 이에 대한 응답으로 ACK를 보냅니다. 이때 클라이언트는 FIN_WAIT_2의 상태가 됩니다.

 

3. 서버는 이 후 소켓을 받는 시스템 콜(close)을 호출할때까지 대기 상태로 있다가 소켓이 종료되면 FIN을 보냅니다. 마지막 FIN과 함께 ACK를 보냈으므로 LAST_ACK 상태가 됩니다.

 

4. 서버로부터 FIN을 받은 클라이언트는 ACK응답을 하여 2MSL만큼의 시간(보통 1분에서 4분)이후 연결 종료 상태(CLOSED)가 됩니다. 서버 CLOSED상태가 되어 연결이 종료됩니다.

 

이러한 과정을 4-way handshake로 연결이 정상적으로 연결이 종료되는 과정입니다.

 

 

반응형
블로그 이미지

REAKWON

와나진짜

,

IP 클래스와 서브넷마스크


우리가 PC를 사용해 인터넷을 즐기고 게임을 하는 등 네트워크 통신에서는 항상 주소를 갖고 동작하고 있습니다. 그게 바로 IP 주소이지요. IP주소를 통해서 통신을 할 수 있는 겁니다.


우선 나의 아이피는 어떻게 알 수 있을까요?

윈도우에 cmd를 키고 ipconfig를 입력해보세요. 리눅스라면 ifconfig 명령어를 실행시켜보세요. 자신의 아이피주소가 나올겁니다.


이전에 컴퓨터의 수가 별로 없어서 IP주소를 막 뿌려댔으나 폭발적인 PC사용의 증가로 사태의 심각성을 깨달았는지 머리를 쓰게 된 것입니다.

그래서 나온게 서브넷마스크입니다.




본격적으로 IP클래스 대역과 서브넷마스크를 보기에 앞서 IP주소에 대해서 간단히 설명하고 넘어가도록 하겠습니다.


우리는 다음과 같은 IP주소를 갖고 있다고 칩시다.


192.168.10.10 -> 1100 0000. 1010 1000. 0000 1010. 0000 1010


십진수와 이진수로 나타냈습니다. 총 32비트, 4바이트라는 것을 알 수 있습니다. 여기서 1바이트가 바로 옥텟이라고 합니다. Oct가 숫자 8을 나타내는 접두사이거든요(온타곤, 옥토퍼스 등). 이것은 우리가 흔히 보는 IPv4의 주소 표기방식입니다. 


조금 후에 이야기를 하겠지만 이 IP주소가 C클래스 대역에 속한다면 네트워크 주소는 1100 0000. 1010 1000. 0000 0010입니다. 나머지 빨간 부분인 0000 1010은 호스트 주소랍니다. 그래서 192.168.10으로 시작하는 PC는 192.168.10.10과 같은 네트워크에 속하고 있다는 것을 의미합니다.


가장 첫번째 호스트 주소는 네트워크 자체를 지칭하며, 마지막 주소는 브로드캐스트용 주소로 쓰입니다. 예를 들어 위에서 192.168.10.0은 192.168.10의 네트워크를 가리키고, 192.168.10.255가 브로드캐스트용 주소이지요.


우리는 이제 IPv4를 토대로 IP 클래스 대역과 서브넷 마스크에 대해 알아보도록 하겠습니다.


A클래스

A클래스의 첫번째 옥텟의 비트는 0으로 고정됩니다.


0xxx xxxx. xxxx xxxx. xxxx xxxx. xxxx xxxx

그렇기 때문에 표현할 수 있는 범위는 0000 0000.0000 0000.0000 0000.0000 0000~0111 1110.1111 1111.1111 1111.1111 1111입니다.

그래서 0.0.0.0 ~ 127.255.255.255입니다.

이 IP클래스는 대규모 네트워크에 적합합니다.

네트워크 주소는 처음 8비트까지입니다. 나머지 24비트는 호스트 주소를 의미합니다.


B클래스

B클래스는 첫번째 옥텟의 두번째 비트가 고정됩니다. 10으로 고정이 됩니다.

10xx xxxx. xxxx xxxx. xxxx xxxx. xxxx xxxx

그래서 표현할 수 있는 범위는 1000 0000. 0000 0000. 0000 0000. 0000 0000~ 1011 1111. 1111 1111. 1111 1111까지입니다.

그래서 128.0.0.0 ~ 191.255.255.255입니다.

네트워크 주소는 처음 16비트이며 호스트 주소는 나머지 16비트입니다.




C클래스

C클래스는 첫번째 옥텟의 세번째 비트가 110으로 고정됩니다.

110x xxxx. xxxx xxxx. xxxx xxxx. xxxx xxxx

그래서 표현할 수 있는 범위는 1100 0000. 0000 0000. 0000 0000. 0000 0000 ~ 1101 1111. 1111 1111. 1111 1111. 1111 1111까지입니다.

십진수로 표현하면 192.0.0.0 ~ 223.255.255.255 입니다.

네트워크 주소는 처음 24비트이며 나머지 8비트는 호스트 비트입니다.


D클래스

D클래스는 첫번째 옥텟의 네번째 비트가 1110으로 고정됩니다.

1110 xxxx. xxxx xxxx. xxxx xxxx. xxxx xxxx

그래서 표현할 수 있는 범위는 1110 0000. 0000 0000. 0000 0000. 0000 0000 ~ 1110 1111. 1111 1111. 1111 1111. 1111 1111까지입니다.

십진수로 표현하면 224.0.0.0 ~ 239.255.255.255 입니다. 멀티캐스트용 대역으로 IP주소에 할당되지 않습니다.


E클래스

E클래스는 첫번째 옥텟의 네번째 비트가 1111으로 고정됩니다.

1111 xxxx. xxxx xxxx. xxxx xxxx. xxxx xxxx

그래서 표현할 수 있는 범위는 1111 0000. 0000 0000. 0000 0000. 0000 0000 ~ 1111 1111. 1111 1111. 1111 1111. 1111 1111까지입니다.

십진수로 표현하면 240.0.0.0 ~ 255.255.255.255 입니다. 예약된 주소 대역으로 IP주소에 할당되지 않습니다.


D와 E클래스는 특정 용도로 사용하기 때문에 실제 IP주소에 할당되지 않습니다.


클래스 등급이 낮아지면서 호스트 주소 부분이 점점 줄어들고 있는것을 알 수 있습니다.


이 와중에 특정 주소 대역은 사설 IP로 사용합니다. 아래에 나와있습니다.


A클래스 사설 IP주소 10.0.0.0 ~ 10.255.255.255

B클래스 사설 IP주소 172.16.0.0 ~ 172.31.255.255

C클래스 사설 IP주소 192.168.0.0 ~ 192.168.255.255 


또한 0.0.0.0, 255.255.255.255처럼 네트워크 시작 주소, 브로드캐스트용주소는 IP주소로 할당되지 않으면 127.0.0.1과 같은 loopback용 주소 또한 사용할 수 없습니다.


서브넷마스크


우리가 C클래스 대역을 사용해서 호스트를 255개를 수용할 수 있는 것도 너무 많이 남을때가 있습니다. 또는 B클래스 대역을 C클래스 대역으로 쓰고 싶을 때가 있습니다. 네트워크 주소를 조금 더 효율적으로 할당하고자 나온 것이 서브넷마스크입니다. 서브넷마스크로 만들어진 네트워크를 서브넷이라고 합니다.


이제 서브넷마스크를 어떻게 계산하며 네트워크 부분과 호스트부분이 어떻게 되는지 살펴봅시다.




예를 가지고 설명을 하는 것이 가장 좋겠네요.

128.255.11.11는 B클래스 주소입니다. 128.255까지가 네트워크 주소이며 나머지 2옥텟이 나머지 호스트 주소입니다.

128.255.11.11을 255.255.255.0이라는 서브넷 마스크를 씌우면 어떻게 될까요? 서브넷 마스크는 비트로 보는 것이 편합니다.


1000 0000.1111 1111.0000 1011.0000 1011 <- 128.255.11.11

1111 1111.1111 1111.1111 1111.0000 0000 <- 255.255.255.0


여기서 서브넷마스크 비트가 1인것은 전부 네트워크 주소가 됩니다. 반대로 0은 호스트 주소 범위가 되지요. 그래서 128.255.11이 네트워크 주소 대역이 되고 나머지 11이 호스트용 주소가 되겠네요.


서브넷마스크의 표기방식은 주소/서브넷마스크 주소 또는 주소/비트수로 표현할 수 있습니다. 128.255.11.11/255.255.255.0 또는 128.255.11.11/24로 표현가능하다는 것입니다.


조금 더 잘게 쪼개보겠습니다.

128.255.11.11을 255.255.255.224의 서브넷마스크를 적용하면 어떻게 될까요? 이 역시 비트로 풀어보도록 합시다.


1000 0000.1111 1111.0000 1011.0000 1011 <- 128.255.11.11

1111 1111.1111 1111.1111 1111.1110 0000 <- 255.255.255.224


하위 5비트 0 0000을 호스트용 주소로 적용시킬 수 있으니까 128.255.11.0 ~ 128.255.11.31까지가 같은 네트워크이고, 128.255.11.11이 바로 이 네트워크에 속하는 것을 알 수 있습니다.

전부 구해보면 다음과 같습니다.


128.255.11.0 ~ 128.255.11.31 

네트워크 주소 128.255.11.0, 브로드캐스트 주소 128.255.11.31

128.255.11.32 ~ 128.255.11.63

네트워크 주소 128.255.11.32, 브로드캐스트 주소 128.255.11.63

128.255.11.64 ~ 128.255.11.95

네트워크 주소 128.255.11.64, 브로드캐스트 주소 128.255.11.95

128.255.11.96 ~ 128.255.11.127

네트워크 주소 128.255.11.96, 브로드캐스트 주소 128.255.11.127

128.255.11.128 ~ 128.255.11.159

네트워크 주소 128.255.11.128, 브로드캐스트 주소 128.255.11.159

128.255.11.160 ~ 128.255.11.191

네트워크 주소 128.255.11.160, 브로드캐스트 주소 128.255.11.191

128.255.11.192 ~ 128.255.11.223

네트워크 주소 128.255.11.192, 브로드캐스트 주소 128.255.11.223

128.255.11.224 ~ 128.255.11.255

네트워크 주소 128.255.11.224, 브로드캐스트 주소 128.255.11.255




총 8개의 네트워크로 나누어졌음을 알 수 있습니다. (B클래스 대역이긴 하지만 C클래스처럼 0~255까지만 보았습니다.)


사실 위의 A,B,C클래스 대역은 서브넷마스크가 255.0.0.0, 255.255.0.0, 255.255.255.0의 서브넷마스크가 적용되었다는 사실을 눈치채셨나요? 이것을 default subnet mask라고 합니다.


반응형
블로그 이미지

REAKWON

와나진짜

,

TCP/IP

인터넷 프로그램들이 서로 통신을 하는데 있어서 여러 프로토콜이 있습니다. 인터넷 프로토콜에서 가장 많이 사용하는 대표적인 프로토콜은 여러분들도 많이 아시다시피 IP입니다. 여기서 중요한 것은 TCP/IP는 계층이 아니라 프로토콜이라는 사실이라는 사실을 주의해주세요.


TCP/IP는 OSI7 계층과는 조금은 다른 TCP/IP의 구조적인 계층 위에서 동작합니다.


지난 번에 OSI7 계층에 대해서 알아보았는데요. TCP/IP 계층은 OSI7계층과 비교하여 어떤 점이 다른지 살펴보는 시간을 가져보도록 하지요.






OSI7 계층과는 조금은 다른 모습을 볼 수 있습니다. 보세요.

우선 계층의 수 부터가 다릅니다. OSI는 7계층인데 반해 TCP/IP 계층은 4계층이 전부라는 것을 알 수 있습니다.


이제 조금 더 세세하게 살펴보도록 하지요.




1. 네트워크 인터페이스 계층 (Network Interface Layer)

이 계층은 Node-To-Node간의 신뢰성 있는 데이터 전송을 담당하는 계층입니다. OSI7 계층의 물리 계층과 데이터링크 계층의 역할을 바로 이 계층이 담당하는 것으로 볼 수 있네요.


따라서 MAC주소가 이 계층에서 사용됩니다. MAC주소는 OSI7 계층에서 데이터링크 계층의 주소였죠?? 


네트워크 인터페이스 계층이 바로 데이터링크 계층까지 담당하니까 MAC 어드레스가 사용되는 겁니다.


혹시 랜카드라고 들어보셨나요? 바로 이거말이에요.




정확한 명칭은 NIC라고 하여 Network Interface Card입니다. 바로 이 랜카드가 있어야만 네트워크 통신을 할 수 있는데, 이름에서도 알 수 있듯이 네트워크 인터페이스 계층에서 동작하는 장비입니다.


주요 프로토콜을 무엇이 있을까요?

LAN상에서는 Ethernet, TokenRing, FDDI 등이 있으며 WAN 상에서는 X.25, Frame Relay, PPP 등이 있습니다.


2. 인터넷 계층 (Internet Layer)

OSI7계층의 네트워크 계층을 담당하는 계층입니다. OSI7 계층처럼 호스트간의 라우팅을 담당하지요. 


인터넷 계층에서 동작하는 프로토콜에는 무엇이 있을까요? 대표적인 몇가지 프로토콜을 살짝 알아보도록 합시다.


IP(Internet Protocol) : 비신뢰성, 비연결지향 데이터그램 프로토콜입니다. 

ARP(Address Resolution Protocol) : 주소변환 프로토콜입니다. IP주소를 MAC주소로 변환하는 프로토콜이지요.

RARP(Reverse ARP) : 반대로 MAC주소로 IP주소를 찾는 프로토콜입니다.

ICMP(Internet Control Message Protocol) : 상태 진단 메시지 프로토콜인데요. 이 프로토콜을 이용하는 대표적인 프로그램이 ping입니다.

IGMP(Internet Group Message Protocol) : 멀티캐스트용 프로토콜입니다.




3. 전송 계층 (Transport Layer)

OSI7 계층의 전송계층과 같습니다. 프로세스간의 신뢰성 있는 데이터 전송을 담당하는 계층입니다.


process-to-process 전송을 담당하기 위해서는 논리적 주소가 필요한데요. process가 사용하는 포트 번호를 그 논리적 주소로 사용합니다.


전송 계층에서 프로토콜은 무엇이 있을까요?


TCP (Transmission Control Protocol) : 신뢰성있는 연결지향형 프로토콜입니다. 신뢰성있다는 말은 그 페킷에 대한 오류처리나 재전송따위로 에러를 복구하는 것을 말합니다. 그때문에 TCP의 헤더에 붙는 정보가 많습니다.

UDP (User Datagram Protocol) : 비신뢰성 비연결형 프로토콜입니다. 페킷을 잃거나 오류가 있어도 대처하지 않는 것을 말합니다. 따라서 UDP헤더는 간단한 구조를 갖고 있습니다.



4. 응용 계층 (Application Layer)

사용자와 가장 가까운 계층입니다. OSI7계층의 5계층부터 7계층까지의 기능을 담당하고 있지요.

서버나 클라이언트 응용 프로그램이 이 계층에서 동작합니다. 우리가 알고 있는 브라우저나 텔넷같은 서비스가 이 계층에 동작하며, 동작하기 위해서는 전송계층의 주소, 즉 포트번호를 사용합니다.


이를테면 http는 포트번호 80번을 사용하지요.


역시 프로토콜은 무엇이 있나 살펴볼까요?


HTTP (Hyper-Text Transfer Protocol) : TCP기반의 프로토콜로 포트번호 80번을 사용합니다.

Telnet : TCP 포트번호 23번을 사용합니다. 원격 터미널을 접속할때 이 포로토콜을 사용합니다.

SSH (Secure Shell) : 텔넷과 같은 서비스는 보안에 취약합니다. 비밀번호가 암호화되지 않아 그대로 노출이 되기 때문이지요. 이것을 보완한것이 SSH입니다. 포트번호 22번을 사용합니다.

FTP(File Transfer Protocol) : 파일 전송 프로토콜입니다. 파일을 받거나 올릴때 FTP를 사용하지요. FTP는 파일을 올리거나 내려받을때 신뢰성을 중요시하기 때문에 TCP에서 동작하구요. 2개의 포트를 사용합니다. 

TCP 포트 20번은 데이터 전송을 위한 용도, TCP 포트 21번은 제어용으로 사용합니다.

SMTP (Simple Mail Transfer Protocol) : 메일 전송 프로토콜입니다. TCP 상에서 동작하며 포트는 25번을 사용합니다.

POP3 (Post Office Protocol Version3) : 메일 수신용 프로토콜입니다. 아웃룩같은 프로그램이 POP3라는 프로토콜을 사용하여 동작합니다. TCP 포트 110번을 사용합니다.

DNS (Domain Name System) : 도메인명에 대한 호스트 정보를 제공해줍니다. 기본적으로 UDP상에서 동작합니다. 기본적으로 실패하면 다시 한번 요청하면 되며 그렇게 중요한 정보가 아니기 때문이죠. 하지만 신뢰성을 요할 경우에는 TCP상에서도 동작합니다. 데이터의 길이가 길 경우같은 때 TCP 기반으로 동작할 수 있습니다.

UDP, TCP 포트 53번을 사용합니다.




이와 같이 포트번호가 특정 프로토콜이 사용해서 우리가 쓸 수 없는 포트들이 있습니다. 이런 포트들을 well-known port라고 합니다.


프로토콜 헤더 정보를 잘 읽고 분석할 수 있다면 네트워크를 더 잘 이해할 수 있을 겁니다.


따라서 다음 시간에는 헤더를 보고 무슨 정보가 있는지 살펴보는 기회를 갖도록 하겠습니다.

반응형
블로그 이미지

REAKWON

와나진짜

,

네크워크의 기본 OSI7 계층


네트워크에서 아주 기본적인 지식은 OSI7 계층입니다. OSI7계층은 국제 표준기구인 ISO(International Organization for Standardization)으로부터 탄생합니다.


처음 네트워크 장치는 중구난방이었습니다. 때문에 회사의 장비마다 호환이 되지 않으며 복잡했었죠. 이에따라 네트워크를 7계층으로 분리하면서 표준을 만들게 되었습니다. 그것이 바로 OSI 7 계층입니다.



OSI 7 계층 구조





이렇게 생겨먹었습니다. 딱 7개로 나뉘어져 있지요?


그림을 보면 알겠지만 응용계층에서 내려온 데이터부터 시작해서 계속 헤더가 붙는 것을 알 수 있습니다. 이 헤더에는 그 계층에 대한 정보가 기록되어있지요.


우리가 이메일을 보낸다고 가정할때 처음 응용계층에서 헤더를 붙여 하위 계층으로 넘겨줍니다. 표현계층은 응용계층에서 내려온 헤더와 이메일 데이터를 하나의 데이터로 간주하게 됩니다. 그래서 다시 자신의 헤더를 붙이게 되지요. 이런 과정은 Encapsulation이라고 합니다.

이런식으로 물리계층까지 내려오게 되면 그때부터 0과 1의 이진 비트가 전송되게 되는 것입니다.


받은 수신자는 거꾸로 물리계층부터 시작해 헤더의 정보를 확인하고 떼어냅니다. 그리고 난 후 상위 계층으로 데이터를 전달하는 것이죠. 이렇게 헤더를 떼어내는 과정은 Decapsulation이라고 합니다.




지금부터 응용계층부터 물리계층까지 간략하게 설명하도록 하지요.


물리계층(Physical Layer)


7계층 중 최하위 계층입니다. 주로 전기적, 기계적, 기능적인 특성을 이용해 데이터를 전송하게 됩니다. 데이터는 0과 1의 비트열, 즉 On, Off의 전기적 신호 상태로 이루어져있지요.


이 계층은 단지 데이터를 전달하기만 합니다. 어떤 에러가 있는지 등 그런 기능에는 전혀 관여하지 않습니다.


데이터링크 계층(Data-Link Layer)


물리 계층에서 송수신되는 정보의 오류와 흐름을 관리하여 안전한 정보의 전달을 수행할 수 있도록 도와주는 역할을 합니다.

데이터 링크 계층의 데이터 전송은 Point-To-Point 간 입니다. 

안전한 정보의 전달이라는 것은 오류나 재전송하는 기능을 갖고 있다는 이야기죠. 또한 우리가 언젠가 한번 들었을 MAC주소를 갖고 있습니다. 그래서 통신을 할 수 있지요.


이 계층에서 부르는 데이터의 단위는 프레임(Frame)이라고 합니다.


네트워크 계층(Network Layer)


네트워크 계층은 네트워크에서 아주 중요합니다.

중요한 기능 중 한가지는 바로 라우팅이라고 하는데요. 목적지까지 가장 안전하고 빠르게 데이터를 보내는 기능을 말합니다. 따라서 최적의 경로를 설정해야하지요.

이런 라우팅 기능을 맡고 있는 계층이 네트워크 계층입니다.


또한 어느 컴퓨터에게 데이터를 전송할지 주소를 갖고 있어서 통신을 합니다. 우리가 자주 듣는 IP 주소가 바로 네트워크 계층 헤더에 속해있습니다.


네트워크 계층에서 부르는 데이터 단위는 패킷(Packet)이라고 합니다.


전송 계층(Transport Layer)

전송 계층 역시 네트워크에서 중요한 계층입니다. 전송 계층은 양 끝단의 사용자들이 신뢰성있는 데이터를 주고 받게 해주는 역할을 합니다.

송신자와 수신자 간의 신뢰성있고 효율적인 데이터를 전송하기 위하여 오류검출 및 복구, 흐름제어와 중복검사 등을 수행합니다.


중요한 것은 데이터 전송을 위해서 Port 번호가 사용이 됩니다. 대표적인 프로토콜로는 TCP와 UDP가 있습니다. 이 계층에서 사용하는 데이터 단위는 세그먼트(Segment)라고 합니다.




세션 계층(Session Layer)


세션 계층은 응용 프로세스가 통신을 관리하기 위한 방법을 정의합니다. 

이 계층은 세션을 만들고 없애는 역할을 하고 있지요.


표현 계층(Presentation Layer)

데이터를 어떻게 표현할 지 정하는 역할을 하는 계층으로 일종의 확장자라고 이야기하면 편하겠네요.

표현 계층은 세가지의 기능을 갖고 있습니다.


1. 송신자에서 온 데이터를 해석하기 위한 응용계층 데이터 부호화, 변화

2. 수신자에서 데이터의 압축을 풀수 있는 방식으로 된 데이터 압축

3. 데이터의 암호화와 복호화


MIME 인코딩이나 암호화 등의 동작이 표현계층에서 이루어집니다. EBCDIC로 인코딩된 파일을 ASCII 로 인코딩된 파일로 바꿔주는 것이 한가지 예이지요.


응용 계층(Application Layer)


사용자와 가장 가까운 계층이 바로 응용 계층입니다. 우리가 사용하는 응용 서비스나 프로세스가 바로 응용계층에서 동작합니다.


이상 OSI 7 계층에 대해서 알아보았습니다.

반응형
블로그 이미지

REAKWON

와나진짜

,