Node.js를 공부하다보니 서버사이드 기술이기 때문에
네트워크에 관한 기본적인 지식이 필요했다.
인터넷에서 검색하다가 쉽게 잘 정리되어 있는 글이 있어서 포스트한다.
--------------------------------------------------------------------------
프로그램은 비록 돈을 많이 벌어 주지는 못 해도 좋은 취미가 될 수 있다. 나는 컴퓨터 프로그래밍을 취미로 삼고 싶다. 수준 높은 프로그램을 하기 위해서 네트워크 쪽도 어느 정도 알아야 한다. 네트워크 관련 책을 읽으며 정리한 것이다. 가장 기본적은 단어 몇 개를 정리한다. 일단 아래 지도는 글 전체를 이해할 때 도움이 되니 외우면 좋다.
LAN(Local Area Network = 지역망) 렌/랜은 300m 이내 건물 내부 네트워크이다. 1970말 ~ 1980초 제록스 연구소에서 이더넷으로 출발, 이더넷이 LAN의 대명사처럼 된다. 내가 초등학교 입학하던 시절에 탄생한 것이다. 컴퓨터 내부의 BUS(데이터 전송용 전선으로 된 도로와 같은 것)를 외부로 확장한 개념이다.
Intranet(인트러넷) 인트라넷은 LAN을 묶은 것을 말한다. 한 기업 내부 망 같은 것이다.
Internet(인터넷)은 인트라넷을 묶은 것을 말한다. 전 세계 망이다.
Protocol(프로우터콜) 프로토콜이란 통신 규약이다. 통신에서 기계 간에 대화 방식을 정한 것이다. 이 규칙을 지켜야 통신을 할 수 있다. 이것도 언어처럼 3가지 요소로 되어 있다. 1번 문법(Syntax = 씬택스), 2번 의미(semantic = 씨멘틱), 3번 시간(Timing = 타이밍)이다. 문법이란 언어의 형식이다. 형식을 지켜 주어야 한다. 의미란 그 형식 속에 담아 전달한 내용이다. 시간이란 서로 말 하고 듣는 속도를 일치 시키고, 말 하는 시점과 듣는 시점을 일치 시키는 것을 말 한다. 듣는 쪽이 준비를 하고 있어야 하고, 듣는 쪽이 받을 수 있는 속도로 전달해야 한다.
프로토콜에도 계층이 있다. 사장, 이사, 부장, 과장, 대리, 사원, 노동자 7계층이 있다. 각 계층은 자신이 하는 역할이 구분되어 있다. 사장이 이웃 건물 사장에게 전달할 내용이 있을 때 이것은 하부로 내려 오면서 포장 되고, 나뉘어지고, 암호화 되고, 구체적으로 바뀐다. 마지막에 노동자가 직접 전달하는 역할을 맡는다. 수신 측에선 다시 나뉜 것을 묶고, 포장을 풀고, 암호를 풀고, 사장에게 전달할 추상적인 내용을 복구한다. 프로토콜의 7계층의 역할을 구분하여 권장하는 OSI 7계층이란 것이 있다. 여러 회사가 자기만의 프로토콜을 만들어 네트워크를 운영하니 인터넷 구성이 어렵다. 그래서 인터넷 구성을 하려면 지켜야 할 권고 사항을 서로 모여서 만든 것이다. Open System Interconnection (열린 시스템 상호 연결)은 7개의 층을 나누고 그 역할을 설명하고 있으나 매우 추상적이다. 현실 세계에서 사용하고 있는 실제 네트워크와 비교를 해야 이해하기 쉽다. TCP/IP 프로토콜이 실제로 사용되는 구체적인 구현이다. 이것을 이해하면 OSI 7계층을 이해한 것이다.
1.물리 계층
비트의 전송을 책임지는 하드웨어 통신이다. 전파, 전압으로 비트를 표현하는 방법(통신 공학)과 연결하는 전선의 종류(twist pair cable = LAN cable, 동축 케이블 = 유선 방송 케이블, 광 케이블, 무선), 타이밍 등에 대한 프로토콜이다. 이 부분은 전자, 전기, 전파, 통신 공학의 영역이다. 단방향(simplex), 반이중(half-duplex), 전이중(full-duplex), 비동기식, 동기식 등의 방법들이 있다고 하는데 프로그래머 입장에선 자세히 알 필요가 없다. 이 프로토콜은 오직 바로 직접 연결된 기계와 기계 사이의 물리적 통신을 정한다. 비유를 하면 트럭을 운전해서 물건을 배달하는 노동자에 해당한다. 그런데 이 트럭은 도로로 연결된 건물까지만 배달하고 그 건물 넘어 도로까지는 가지 않는다. 트럭 운전자는 정해진 노선만 달린다. 고로 수신지 따위를 생각하지 않는다. 자신이 싣고 가는 화물의 내용도 신경 쓰지 않는다. 바로 옆 건물(기계)까지 전달만 책임진다.
2.데이터 링크 계층
기계와 기계 사이의 1대1 통신이나 방송 같은 것을 하려면 1계층으로 충분하다. 도로가 하나라서 송신자와 수신자가 1대1로 정해져 있고, 방송의 경우 증폭하여 중계하는 정도면 충분하다. 필요한 놈은 받아 가고 필요 없으면 무시하면 된다. 그런데 여러 컴퓨터가 묶인 네트워크이고 특정 수신자에게만 배달해야 할 경우라면 2계층이 필요하다. 여기선 송신자와 수신자의 주소가 필요하다. 또한 큰 데이터를 작게 나누어 전송한다. 고로 순서를 제어하고 흐름을 제어하는 복잡한 기능이 필요하다. 데이터의 오류 확인도 필요하다. 패리티 검사(1바이트 오류 검사), 블록 합계 검사(Block Sum Check = 블록 오류 검사), 순환 중복 검사(Cyclic Redundancy Check = 수신한 데이터 전체 검사)를 사용한다. 데이터를 바이트로 구분해서 보기 시작하는 것도 여기다. 즉, 비트의 나열을 전달하는 것이 아니라 숫자(바이트)를 전달한다는 개념이 나타난다. 2계층만으로도 인터넷이 가능하다. 허나 업체들마다 자기의 하드웨어 프로토콜(1계층)과 소프트웨어 프로토콜(2계층)을 사용하기 때문에 인터넷을 만들기 위해서는 프로토콜의 전환이 필요하다. 그래서 그 위에 3계층을 하나 더 만들었다. 이 3계층에서 1과 2계층의 하드웨어 전환과 프로토콜 전환이 발생한다. 즉, LAN에서 인터넷으로 나가면 다른 하드웨어 환경과 만나게 된다. 유선에서 무선으로 전기에서 광통신으로 하드웨어 프로토콜도 바뀐다. 거기에 따른 소프트웨어 프로토콜도 바뀐다. 고로 이런 것을 덮어 무시하고 공통적인 프로토콜을 만들어야 했다.
3.네트워크 계층
이 추가된 계층으로 인해서 비로소 인터넷이 가능해진다. 2계층에선 LAN 카드마다 주소가 붙어 있다. 이것으로 수신자와 송신자를 구분한다. 그런데 3계층에서도 또 다른 주소를 사용한다. 1계층과 2계층이 통일이 되면 3계층은 사실 필요가 없다. 현실은 업체마다 자기의 네트워크 프로토콜을 사용하기 때문에 이를 통합할 3계층을 만든 것이다. 2계층은 LAN을 벗어나지 못 한다. 3계층에서 인터넷이 가능하기 때문에 3계층 주소가 바로 인터넷 주소가 된다. 여기서부터 프로그래머가 알아야 하는 프로토콜이다. 1계층과 2계층은 네트워크 하드웨어 관련자들이 알아야 할 내용이다. 위의 그림에서 중간에 라우터(router = 행선지를 정하는 놈)라고 되어 있는 일종의 교환기가 3계층에서 동작한다. 주소를 보고 어디로 우편물을 보낼지 결정하는 것이다. 3계층에선 모든 하부의 하드웨어와 소프트웨어적인 프로토콜의 차이가 가려진다. 그래서 이곳을 IP(인터넷 프로토콜)라고 부른다.
4.트랜스포트 계층
3계층이 우편물의 주소를 보고 편지를 전달하는 것이라면, 4계층은 그 우편물의 수신자를 확인하여 그 사람에게 전달하는 것이다. 즉, 컴퓨터의 주소는 3계층에서 파악하여 전달하고, 그 컴퓨터 속의 어떤 프로그램에게 가는 정보인지는 4계층이 파악하여 전달한다.
5.세션 계층
이 계층은 역할이 모호하다. 단어의 의미로 보면 회의/모임 등을 담당한다는 뜻이다. 즉, 연결을 유지한다는 개념인데 그것을 이 층에서 하라는 얘기다. 나중에 나올 TCP와 UDP 중에서 TCP는 이 세션 계층의 역할을 하고 있다. TCP를 4계층 프로토콜이라고 하지만 UDP가 진짜 4계층 프로토콜로 보이고, TCP는 5계층까지 일부 포함한 역할을 하는 것 같다.
6.프리젠테이션 계층
말 그대로 데이터의 표현이다. 여기는 데이터의 암호화, 압축, 문자 코드 등을 담당한다. 통신에서 전달되는 것은 숫자이다. 이 숫자는 바이트로 표현되고, 비트 나열의 전기 신호로 전달 된다. 이것을 화면에 출력할 때는 적당한 문자로 바꾸어야 한다. 바로 여기서 문자 코드, 암호 해독, 압축 풀기가 필요하다.
7.응용 프로그램 계층
이 계층은 컴퓨터 사용자와 컴퓨터 사이를 연결한다. 즉, 화면을 보고 키보드 입력하여 전송할 데이터를 만들고, 전송 받은 데이터를 화면에 보여주는 것을 담당한다. HTTP(웹 브라우저), FTP(파일 전송), 터미널, 이메일 등의 서비스를 말 한다.
이상의 OSI 7계층 설명은 추상적일 수밖에 없다. 구체적인 물건을 아직 보지 못 했기 때문에 무슨 소리인지 이해하기 어렵다. 현재 사용하고 있는 인터넷 프로토콜인 TCP/IP를 알면 OSI 7 계층의 이해가 쉽다. 그런데 이 TCP/IP도 이해하기 쉽지는 않다. 역시 구체적인 물건으로 보이지 않기 때문이다. 프로토콜이란 말 그대로 대화 방법이다. 누구와 누구의 대화인지도 잘 모를 것이다. 여하튼 TCP(4계층 프로토콜)와 IP(3계층 프로토콜)가 가장 많이 사용되기 때문에 TCP/IP라고 부르는 것 같다. OSI 7계층과 TCP/IP를 함께 비교하여 그려 보면 아래 그림이다. 그림에서 하부 1계층과 2계층은 네트워크마다 다른 특징이다. 인터넷은 3계층과 4계층이 담당한다. 3계층은 하부 2개 계층을 이용해서 필요한 통신을 한다. 이론상으론 2계층으로도 인터넷을 구성할 수 있다. 전 세계 모든 사람들이 같은 네트워크를 사용하면 된다. 5계층부터는 경계를 명확하게 구분할 필요가 없다. 왜냐하면 5계층부터는 통신에 절대적으로 필요한 프로토콜이 아니기 때문이다. 허나 실제로 응용 프로그램 내부를 보면 이와 같은 구분에 따라 프로그램이 되어 있다. 고로 잘 알아야 한다. 5계층부터는 프로그래머 마음대로 자신만의 프로토콜을 만들어 사용할 수 있다. 엄밀하게는 3계층의 프로토콜만 지키면 인터넷 통신이 가능하기 때문에 4계층 프로토콜도 자신의 마음에 맞게 만들어 사용할 수 있다. 즉, TCP나 UDP를 꼭 사용해야 하는 것은 아니다. TCP/IP는 1980년대에 만들어진다. 우리 나라에선 1990년대에 인터넷을 사용하는 체험을 하게 되고, 2000년대가 되어서 윈도우 환경을 체험하게 된다. 그러면서 갑자기 컴퓨터 성능이 향상된다.
★ 네트워크 인터페이스 계층(1, 2계층)
LAN에 연결을 해주는 1계층과 2계층을 묶어서 이렇게 부르는 것 같다. 이 지역 네트워크 중에서 이더넷(Ethernet)이 우리가 사용하는 LAN이다. 여러 회사의 여러 네트워크가 있는 모양인데 지금은 거의 이것으로 통일 된 것 같다. 아니 이 것이 최초이기 때문에 이후의 것들은 이것의 호환 업그레이드 버전이다. 초기 네트워크는 버스 개념이었기 때문에 방송 개념과 비슷하다. 즉, 송신자가 수신자에게 보낸 내용은 네트워크의 모든 컴퓨터가 받게 된다. 이 중에서 수신 컴퓨터에게만 그 데이터가 의미가 있다. 나머지 컴퓨터는 버스에 데이터를 올리기 위해서 네트워크가 조용한지 확인해야 했다. 이 중에서 LAN Card가 하드웨어적으로 통신하는 부분은 말 그대로 물리적이고 전기적인 부분이기 때문에 생략하고, 2계층인 데이터 전달하는 부분의 프로토콜의 프레임 형식을 본다. 프로토콜이 대화이기 때문에 대화할 때 전달하는 데이터 형식이 있을 것이다. 바로 그 형식을 보겠다는 말이다. 이 형식을 지켜 주어야 대화가 된다.
2계층에선 수신자와 송신자의 구분이 가능하기 때문에 2계층에선 교환기 기능을 구현할 수 있다. 허브(Hub)란 바퀴의 중앙 부분이다. 모든 정보가 모였다가 나가는 교차로 같은 부분을 허브라고 부른다. 허브 기계는 중계기와 교환기 역할을 하는 것이다. 1계층 허브는 신호의 증폭이나 중계를 하는 역할이고, 2계층 허브란 교환기 역할을 하는 것이다. 스위칭 허브라는 것은 2계층 허브를 말 한다. LAN Card는 충돌 확인을 해야 하기 때문에 항상 전선의 신호를 감시해야 한다. 처음의 Preamble(프리엠블=서문)이란 0과 1의 나열을 감지하여 뭔가 신호가 있다는 것을 알게 된다. 이 서문이 끝나면 데이터가 시작되기 때문에 이 신호를 통해서 데이터의 시작 위치를 맞춘다. 그리하여 대략 1.5kbyte 정도의 신호를 받아서 2계층으로 넘긴다. 2계층에선 데이터의 가장 중요한 부분이며 처음 나타나는 수신 주소를 확인하여 자기에게 온 것인지 판단한다. (송신 주소는 가짜일 수도 있다.) 수신자가 자기 자신이 아니라면 데이터를 버린다. 이 말은 도청도 가능하다는 말이 된다. 현재는 2계층 스위칭 허브를 사용하기 때문에 이런 도청은 되지 않을 것이다. 스위칭 허브는 주소를 보고 그 PC에게 데이터를 전달한다. 2계층까지 상세하게 알 필요는 없을 것 같다.
LAN에는 Promiscuous(프러미스큐어스 = 난잡한) 모드라는 것이 있다. 난잡한 방식이란 말인데, 초기 네트워크에선 BUS개념이 적용되어서 수신자에게만 정보를 보내는 것이 아니라, 모두에게 뿌리면 각자 자기에게 온 것을 확인하는 방식이다. CPU와 메모리와 IO 장치들 간에 이렇게 통신을 한다. 이렇게 하다 보니 도청이 가능한 것이다. 도청도 가능하지만 방해 신호를 보낼 수도 있다. 1계층 허브는 이런 방식으로 동작한다. 2계층 스위칭 허브는 이렇게 동작하지 않는다.
★ 인터넷 계층(3계층)
IP(Internet Protocol)는 1계층과 2계층의 차이를 감추어 인터넷이 가능하게 해 주는 프로토콜이다. 3계층의 내용은 하부 계층에 의해서 전달이 된다. LAN 내부의 전달은 스위칭 허브가 담당하고 LAN을 벗어나서 인터넷으로 나가면 라우터라는 장치가 교환기 역할을 한다. 일단 교환기 역할을 하려면 수신지를 파악해야 한다. 고로 주소가 필요하다. 3계층에서 사용하는 주소를 IP 주소(255.255.255.255 형태로 표현하는 주소)라고 부른다. 2계층에서 사용하던 하드웨어 주소(MAC 주소)는 6바이트인데 IP주소는 4바이트이다. 나중에 6바이트로 새롭게 늘린 것 같다. 4바이트이면 4기가(40억) 정도를 구분 가능하다. 지구 인구에 비하면 좀 적은 편이다. 여하튼 인터넷 주소를 만들어야 했다. 아래와 같은 체계로 만들었다. 그리고 데이터 앞에 붙이는 헤더 부분을 아래와 같은 체계로 만들었다.
위의 내용을 보면 데이터를 최대 64kbyte 단위로 잘라 전송할 수가 있다. 그 내용을 다시 LAN Card에선 1.5kbyte 정도로 잘라 전송한다. 하위 계층인 3계층에서 4계층의 프로토콜 정보를 담고 있다. 그럴 필요가 있을까? 내용을 보면 라우터를 거쳐서 목적지에 도달하지 못 하면 패킷을 버리도록 되어 있다. 이 정보만 가지고 라우터가 교환기 역할을 할 수 있을까? 뭔가 정보가 부족하다. 실제 데이터 전달은 하위 2계층에서 해야 한다. 고로 IP의 주소를 보고 어느 방향으로 보낼지 결정해야 하는데 그 방향이란 2계층의 MAC주소를 결정한다는 말이다. 고로 IP와 MAC 주소 대응표가 있어야 한다. 직접 연결된 인접 기계들의 MAC주소와 IP주소를 함께 알고 있어야 데이터를 전달할 수 있다. 직접 연결된 기계들과 IP주소가 맞지 않으면 라우터로 보내야 한다. 라우터가 길을 찾아 줄 것이다.
각 지역 네트워크마다 주소 체계가 다르다. 그래서 LAN의 주소와 IP 주소 대응표는 그 네트워크에 연결된 기계들이 각자 적당하게 만들어야 한다. 고로 이런 정보는 IP 프로토콜에 포함시키기 어렵다. IP를 사용하기 전에 대응표가 만들어져 있어야 하기 때문에 2계층 통신 방법으로 대응표를 만들어야 한다. 이런 대응표를 만들기 위해서 ARP(Address Resolution Protocol = 주소 해석 프로토콜)이란 것을 사용한다. 동작 방법은 브로드캐스팅(방송)을 이용해서 지역 네트워크의 각 컴퓨터의 IP를 물어 보는 것이다. 그럼 거기에 응답하는 컴퓨터가 있을 것이다. 그 컴퓨터의 하드웨어 주소를 IP주소와 대응 시키게 된다. 응답을 할 때 MAC주소를 함께 보내기 때문이다. 여하튼 모두에게 물어 보는 방식이기 때문에 중간에 장난을 치는 컴퓨터가 있으면 도청을 당할 수 있다. 엉뚱한 IP를 가르쳐 줄 수가 있다는 것이다. 지금은 IP가 중복되는 경우 그 PC의 통신이 정상 동작하지 않게 되어 있다. 네트워크에 접속하는 컴퓨터의 수는 시간에 따라 변하기 때문에 정기적으로 방송을 해서 주소 대응표를 갱신해야 한다. ARP가 IP주소로 MAC주소를 얻는 것이라면, RARP란 MAC주소로 IP주소를 물어 보는 것이다. 기억력이 별로 없는 기계나 터미널 장치가 남에게 자신의 IP를 물어 보기 위한 용도로 개발한 것이었다. 요즘은 고정 IP를 사용하지 않고 IP를 받아 사용하는 것으로 안다. 서버는 고정 IP가 필요하겠지만, 일반 클라이언트 PC들은 고정 IP로 관리하기 어렵다. 그래서 동적으로 IP를 나누어 주는 것으로 안다.
인터넷은 전화망처럼 연결 상태를 유지하지 않는다. 고로 패킷(우편물)이 떠나면 도달했는지 여부를 확인할 수 없게 된다. 그래서 패킷을 배달하는 라우터가 전달 상황을 송신 컴퓨터에 알려주는 프로토콜이 있다. 이 정보는 인터넷을 통해 전달 되는 것이기 때문에 3계층 IP를 이용할 것이다. ICMP(Internet Control Message Protocol = 인터넷 제어 메시지 프로토콜)은 라우터와 컴퓨터 사이에 주고 받는 대화 규칙이다. 메시지는 다음과 같은 것이 있다. 헤더는 볼 필요 없을 것 같다.
- From 라우터 To 송신자, 목적지에 도달하지 못 했다! 이유 회신!
- From 라우터 To 송신자, 방향을 바꾸어라! 경로가 잘 못 되었다!
- From 라우터 To 송신자, 시간 초과다! 패킷의 수명이 다 되었다!
- From 라우터 To 송신자, 네트워크 혼잡! 송신을 좀 줄여라!
- From 송신자 To 수신자, 패킷을 받았나?
- From 수신자 To 송신자, 패킷을 받았다!
대충 위와 같은 짧은 내용을 서로 주고 받으며 대화를 한다고 한다. 이 부분을 교란시킬 이유는 별로 없기 때문에 프로그래머가 알아야 할 필요는 없는 것 같다. 여하튼 데이터를 잘 전달하기 위해서 열심히 노력하고 있다.
★ 트랜스포트 계층(4계층)
3계층에서 사용하는 것이 IP이고 보조로 2가지(ARP, ICMP)를 사용한다. 내용을 보면 2계층에서도 통신의 신뢰성을 보장하기 위해서 노력하고 있기 때문에 4계층의 일이 단순할 것 같아 보인다. 4계층에선 TCP와 UDP 2가지가 사용된다. 4계층에선 Port(포트)란 것이 나온다. 이 번호로 한 컴퓨터 속의 어떤 프로그램이 통신하는 것인지 구분한다. 3계층에선 IP주소로 컴퓨터만 구분했다. 어떤 프로그램에서 온 것인지 알 수는 없었다. 4계층에선 그것을 구분한다. TCP(Transmission Control Protocol = 전송 제어 프로토콜)이 IP와 크게 다른 점은 아마도 포트라는 것을 사용하는 것이다. 3계층에선 단지 데이터를 나누어 보내고 오류가 발생하면 라우터로부터 그 회신을 받을 뿐이다. 송신자와 수신자 사이에 직접 수신 응답도 가능하다. 허나 뭔가 좀 부족하다고 생각한 모양이다. 그래서 TCP를 만든다. TCP는 어떤 프로그램이 데이터를 보내고 받는지 구분하고, 송신자와 수신자의 프로그램들 사이에 가상의 연결 상태(통신을 위한 대기 상태, 서로간 통신 제어 대화 가능)를 만든다. 그리고 데이터 재전송을 하여 확실하게 데이터가 전달 되도록 해 준다. 3계층까지는 전화기 연결하여 소리를 전달하는 것이라면, 4계층부터는 사람의 통화 내용에 관한 것이다. 먼저 연결을 이루기 위한 “여보세요? 예!” 대화 방법을 본다. 이를 핸드셰이킹(악수)라고 부른다.
일단 연결이 되면 끊기 전까지 계속 연결을 유지한다. 전화망처럼 물리적인 연결을 유지하는 것이 아니다. 연결을 유지한다는 것은 송신자와 수신자 프로그램을 계속 통신 대기 상태로 만든다는 것을 말 한다. 그러니까 가상의 연결이다. 상대가 대기 상태인지 정기적으로 확인한다는 것을 말 한다. 상대가 응답하지 않으면 상대가 통신 준비 상태가 아님을 뜻하고, 그럼 연결이 끊어진 것으로 취급하는 것이다. 그리고 데이터를 잘 받았는지 대화한다. 이렇게 대화를 계속하는 것을 연결이라고 부른다. 순서 번호를 만들어 대화를 시작하는데 대화에 오고가는 데이터의 양만큼 순서 번호가 증가한다. 고로 순서 번호의 증가가 서로 일치해야 옳은 상대와 대화 중이라는 것이다. 3계층 IP에선 통신 선로가 혼잡하다는 메시지를 받아도 어떻게 대응할 수 있는 방법에 대한 설명이 없었다. 4계층 TCP에서 데이터 송신량을 조절하여 여기에 대응한다. UDP(User Datagram Protocol = 사용자 데이터 프로토콜)는 연결을 하지 않는 방식이다. 즉, 상대가 통신 준비 되었는지, 데이터 잘 받았는지 확인하지 않는다. UDP는 방송용 데이터 전송에 해당 된다. TCP는 편지를 잘 받았는지 회신하는 방법이고, UDP는 TV나 라디오 방송과 같이 수신을 확인하지 않고 보내기만 한다. TCP의 이런 대화 방법을 악용하여 대화 규칙을 이상하게 어겨서 통신을 방해할 수 있다.
IP도 데이터를 최대 64kbyte로 분할해서 보내는 능력이 있기 때문에 재조립도 가능하다. 문제는 IP에선 포트 구분을 하지 않는다. 또한 상대와 그렇게 긴밀하게 대화를 하지 않는다. TCP는 포트 구분도 하고 상대와 긴밀한 대화를 계속해서 연결을 유지한다. TCP에서 분할된 데이터를 순서에 맞게 재조립하기 위해서 순서 번호를 부여한다. 패킷의 크기가 1000이고 처음 시작하는 순서 번호가 1이면1, 1001, 2001, 3001, 4001 형태로 증가한다. 패킷의 크기가 계속 더해지는 것이다. 연결을 설정할 때 시작 순서 번호는 임의로 결정되며, 이 순서 번호의 증가로 정상적인 통신인지 확인한다. 만약 이 번호가 이상하면 재전송을 요청하게 된다. 이 때 TCP의 재전송 처리 방식에 오류가 있다고 한다. 이를 악용해서 통신을 방해하기도 한다.
★ 응용 프로그램 계층(5계층~7계층)
4계층까지는 바이트 데이터를 전송하는 것이다. 그 의미는 따지지 않는다. 5계층 이상부터는 데이터의 의미를 따진다. 즉, 암호, 압축, 문자 코드 등의 문제가 있다. 각 OS마다 화면 표시와 문서 편집을 위해 나름의 문자 코드를 사용한다. 고로 이 부분을 통일해 주어야 하는 문제가 있다. OS에서 사용하는 문자 코드와 인터넷 통신에 사용하는 문자 코드, 데이터베이스에 저장되는 문자 코드가 다르면 곤란하다. 이 부분은 위키백과를 찾아 보는 것이 더 좋겠다.
FTP, TFTP는 파일 전송 프로토콜이다. FTP는 TCP를 이용하고, TFTP는 UDP를 이용한다. 명령은 문자로 되어 있다. 즉, 통신 내용 중에 명령어는 문자이기 때문에 문자 코드를 맞추어야 한다. FTP는 21(제어), 20(데이터)번 포트를 사용한다. 서버는 21번 포트를 열고 대기한다. 클라이언트는 21번 포트로 접근한다. 연결이 되면 클라이언트는 자신이 연 임의의 데이터 포트 번호를 알려 준다. 서버는 20번 포트로 접근하여 데이터 전송을 한다. FTP 명령은 문자로 되어 있기 때문에 직접 타이핑 해서 전달할 수도 있다. 명령과 매개변수는 공백으로 구분하고 마지막에는 CR+LF(줄 바꿈 문자)를 보낸다.
SMTP는 메일 프로토콜이다. FTP와 다른 점은 지연 전송이란 점이다. FTP는 연결한 상태에서 바로 전송하지만 SMTP는 때를 기다렸다 전송한다. 전송 되는 내용은 역시 문자로 된 문서이기 때문에 문자 코드 일치가 문제가 된다. 우리가 보통 사용하는 이메일은 웹 사이트에 접속해서 사용하는 것이다. 웹 사이트의 메일 서버가 대신 편지를 주고 받는 것이다. 우리 PC가 그런 역할을 하는 것이 아니다.
Telnet은 원격 터미널(모니터+키보드)이다. 멀리서 컴퓨터의 콘솔 창을 사용하는 것과 같다. 즉, 컴퓨터에 실행 명령을 내릴 수 있다. 역시 문자로 된 명령을 전달하기 때문에 문자 코드의 통일이 중요하다. 보통 영문은 ASCII 코드를 사용하기 때문에 문제가 없지만 한글, 한자 등은 문자 코드에 따라 다르게 나타난다. 요즘은 원격 데스크탑으로 윈도우 환경에서 윈도우에 명령을 내린다.
마지막으로 HTTP라는 웹 프로토콜이 있다. 이것도 문자로 통신한다. 고로 문자 코드가 중요하다. 브라우저에서 자동으로 문자 코드를 인식하지만 그렇지 못 할 경우 직접 문자 코드를 지정해 주는 기능이 있다. 브라우저와 서버가 주고 받는 대화는 모두 문자로 되어 있기 때문에 사람도 읽을 수 있다. 5계층부터는 프로그래머가 마음대로 만들면 되는 영역이다. 4계층까지가 통신을 책임지기 때문에 이용 대상이고, 5계층부터는 통신 내용에 해당하는 것으로 프로그래머가 만들기 나름이다.
★ 라우터(3계층 교환기)
LAN에서 인터넷으로 넘어 가는 관문을 게이트웨이(대문)이라고 부른다. 이것이 라우터 역할도 한다. 또 다른 말로 공유기라고 부르기도 한다. IP주소를 이용해서 목적지까지 배달해 주는 교환기 역할을 하는 장비다. 라우터는 IP주소의 특징을 보고 데이터를 전달할 방향을 결정한다. 고로 네트워크 구성에 대한 정보를 가지고 있어야 한다. 모든 PC에도 라우터와 같은 네트워크 정보를 일부 가지고 있다. 예를 들어 인터넷으로 가려면 게이트웨이 주소를 알아야 한다. 웹 브라우저를 사용하려면 도메인 이름(www.daum.net 같은 이름)을 IP주소로 바꾸어 주는 서비스를 받아야 하는데 DNS 서버가 이 일을 해 준다. 그 DNS 서버 주소를 알고 있어야 한다. 그리고 LAN에 연결된 PC들의 IP 주소도 알아야 그들에게 데이터를 전달할 수 있을 것이다. 이 정보를 확인하는 명령이다.
- 리눅스에선 netstat –rn
- 윈도우에선 route print
인터넷으로 나가는 관문이 게이트웨이다. 고로 이 주소를 알고 있어야 한다. PC에는 여러 LAN 카드가 꽂혀 있을 수 있다. 그럼 어느 카드가 게이트웨이로 연결 되어 있는가? 인터페이스라고 되어 있는 주소가 게이트웨이로 연결되는 내 PC의 IP주소다. 내 PC가 라우터 역할을 하려면 여러 LAN 카드가 있어야 한다. 각 LAN 카드에 연결된 네트워크의 PC들과 라우터의 IP 주소가 내 PC에 저장 되어 있어야 라우터 기능을 할 수 있다. 표를 보면 IP 주소의 네트워크 주소를 보고 보내야 할 방향을 결정하게 되어 있다. 대명사처럼 쓰이는 몇 가지 주소가 있다. 모두 0이거나 모두 1인 경우는 IP 주소에서 특별한 의미가 있다. 컴퓨터 주소 부분의 모두 0은 네트워크의 모든 PC를 말하고, 컴퓨터 주소 부분의 모두 1은 네트워크의 모든 PC에 방송하라는 뜻이다. 자기 자신을 의미하는 대명사도 있다. 127.0.0.1이다.
라우팅이란 경로를 만드는 것을 말한다. 관리자가 직접 테이블을 만들어 입력하는 정적 라우팅이 있다. 라우터들끼리 정보를 주고 받거나 라우터가 나름 뭔가 계산해서 스스로 경로를 정하는 동적 라우팅이 있다. 각각의 장단점은 예상할 수 있다. 동적 라우팅은 라우터가 정보 수집을 해야 하기 때문에 시간 낭비가 있다. 동적 라우팅에선 경로에 대한 평가를 해야 하는데 그 평가 점수가 매트릭이다. 이 값이 적으면 통신이 빠르다는 것을 뜻한다. 인접 라우터와 거리와 방향에 대한 정보를 공유하여 라우팅 테이블을 만드는 방법과, 라우터간 정보 공유를 통해 네트워크 전체 연결 상태를 그리는 방법이 있다. 전자는 간단하고, 후자는 복잡하지만 가장 빠른 최적의 경로를 계산할 수 있다는 장점이 한 가지 있다. 하지만 라우터가 매우 똑똑해야 하기 때문에 비싸질 것이다. 더 이상 상세하게 알아야 할 필요는 없는 것 같다.
★ 스위칭 허브(2계층 교환기)
허브의 일반적인 뜻은 바퀴의 중심 부분으로 바퀴살(정보나 물건)이 모였다가 흩어지는 부분을 말 한다. 기본적으로 1계층 수준의 신호의 증폭 역할을 할 수 있다. 그리고 2계층 수준의 교환기 역할을 할 수 있다. 라우터와 다른 점은 LAN에서 사용한다는 것이다. 허브의 종류가 많지만 관심 없다. 1계층 허브는 신호를 증폭해서 모든 PC에 보내기 때문에 PC들은 충돌 검사를 해야 한다. 자신에게만 온 내용인지 판별해야 한다. 이런 문제를 해결하려고 2계층 허브가 나온다. 2계층 허브는 온전한 교환기다. 송신자와 수신자를 1대1로 연결해 준다. LAN과 LAN을 연결할 때 같은 LAN을 연결하는 경우 내용을 크게 변형시킬 필요가 없다. 이 경우에 사용하는 것을 브릿지(다리)라고 부른다. 반면에 다른 종류의 LAN을 연결할 때는 내용의 변형이 발생하기 때문에 라우터를 사용한다. 브릿지는 허브의 확장판이다. 브로드캐스팅(방송)이란 것이 가능한 것은 모든 PC에 같은 신호를 보낼 수 있기 때문이다. 1계층 허브와 같은 그런 기능 말이다. 그런데 이 기술이 악용될 소지가 있다. 이를 막을 수 있는 방법은 라우터 같은 교환기 역할을 하는 장비뿐이다. 그래서 2계층 스위칭 허브가 나타났다. 라우터보다 빠르며, 라우터처럼 교환기 역할을 하여 네트워크의 낭비를 막는다. 스위칭 허브는 빨리 동작하도록 하드웨어로 만들어진다고 한다. 라우터와 스위칭 허브의 구분이 모호하게 될지도 모르겠다. 라우터는 MAC 주소 대신 IP 주소를 사용하는 것과 서로 다른 종류의 LAN을 양쪽 팔로 연결한다는 점이다. 만약 같은 종류의 LAN을 연결하는 것이라면 스위칭 허브가 라우터를 대신할 수 있다. 세상 모든 LAN을 하나의 종류로 통일하면 라우터는 더 이상 필요 없다. 스위칭 허브의 종류와 동작 방법은 관심 없다. 어차피 라우터를 대신하는 방향으로 갈 것이다. VLAN은 가상의 LAN이다. 같은 LAN에 속한 것은 브로드캐스팅(방송)을 할 수 있다. 즉, 연결된 모든 컴퓨터에 같은 신호를 보낼 수 있다. 이런 기능을 가상으로 해 줄 수 있다. MAC주소, IP주소, 허브의 포트 번호(전선을 꼽는 구멍 번호) 등으로 가상의 그룹을 만들 수 있다. 스위칭 허브는 상대가 컴퓨터인지 라우터인지 스위칭 허브인지 구분하지 못 한다. 그래서 주소를 분석해서 방향을 정하는 라우터의 기능이 없다. 고로 그 포트로 들어온 모든 MAC 주소를 외우려고 한다. 기억 용량이 한계에 도달하면 기능 정지를 하든가 멍텅구리 1계층 허브 기능을 하게 된다. 그렇게 되면 도청이 가능해 진다.
★ 포트(4계층 프로그램 구분 번호)
TCP, UDP에서 나오는 포트는 프로그램을 구분하는 번호다. 하나의 컴퓨터 안에서 웹 브라우저와 FTP가 하나의 통로인 인터넷을 사용하여 정보를 보내면 어떤 프로그램이 보낸 데이터인지 구분하는 정보가 필요하다. 그것이 바로 포트 번호이다. 65536개(16비트)의 포트가 가능하다. 0 ~ 1023(1024개)는 이미 어떤 유명한 프로그램들에 의해서 점유된 번호 영역이다.
포트 번호 | 서비스 |
20 21 23 25 53 69 80 110 111 138 143 161 | FTP - Data FTP - Control Telnet - 원격 터미널 SMTP - mail DNS - 도메인 네임으로 IP 주소 검색 TFTP - 간단한 FTP HTTP - web POP3 - mail RPC - 원격 프로시져 콜 NetBIOS - 윈도우 파일 공유 IMAP - mail SNMP - 네트워크 관리 |
위의 포트는 각 서비스 프로그램이 실행시킨 Daemon(데몬)이란 프로세스가 열어 놓고 기다린다. 그러면 클라이언트들은 1024이상의 포트 번호로 접근한다. 데몬이란 그리스에서 신과 사람을 연결해 주는 수호신 정도의 의미로 사용하던 것이다. 지금은 악마란 의미로 변질 되었다. 클라이언트와 서버를 연결해 주는 메모리 상주 프로그램이란 의미에서 데몬이라고 부른 것 같다.
★ 상대 컴퓨터의 네트워크 연결 확인(Scan)
Ping이란 명령은 ICMP를 사용해서 상대 컴퓨터의 네트워크 연결 상태를 알려 준다. ICMP의 다른 메시지를 이용해서 상대 컴퓨터를 시험해 보려면 ICMP를 직접 조립해서 보내야 한다. Ping은 ICMP의 메시지 중에서 Echo Request(type8 = 메아리 요청)와 Echo Reply(type0 = 메아리 응답)를 이용한 것이다. 기타 다른 메시지로도 상대 컴퓨터를 시험할 수 있다. 네트워크에 연결되어 있지 않다면 반응이 없을 것이다. 만약 연결이 되어 있다면 반응을 할 것인데 OS의 종류와 ICMP 메시지 종류에 따라 반응이 다르다. 그래서 단순히 연결되어 있다는 정보에 더해서 OS에 대한 힌트도 준다. 해커들은 이런 정보로 상대를 파악한다고 한다. Ping을 거부하도록 라우터나 방화벽이 설정 되었을 수도 있다. 왜냐하면 정당한 목적이 아닌 쓰레기 정보를 마구 추가해서 전송하여 통신을 방해하기 때문이다.
일단 네트워크에 연결되어 있다는 것을 알아도 어떤 포트를 열고 어떤 서비스를 하고 있는지는 모른다. 포트를 확인하려면 TCP와 UDP로 시험을 해 보아야 한다. 물론 TCP와 UDP 패킷을 만들어 보내야 한다. 일단 포트가 닫혀 있다면 ICMP의 Unreachable(도달불가) 메시지가 돌아 온다. UDP의 경우는 열려 있어도 아무 응답이 없기 때문에 확실하지 않다. TCP의 경우는 포트가 열려 있을 때 응답이 오게 되어 있다. 열린 포트에는 SYN+ACK 신호가 오지만, 닫힌 포트의 경우는 RST+ACK 신호가 온다. 이처럼 보내 신호에 대한 응답으로 포트의 유무를 확인할 수 있다. 물론 상대 시스템에는 어떤 놈(IP주소)이 접속했는지 기록을 남길 수가 있다. 정상적인 대화로 연결을 만들면 로그인 기록이 남고 비정상적인 대화로 연결을 이루지 않으면 기록이 남지 않는다고 한다. 하지만 프로그램 하기에 따라 문만 두들겨도 기록이 남게 할 수 있을 것이다. 방화벽이나 IDS(Intrusion Detection System = 침입 탐지 시스템) 같은 것들이 패킷의 내용을 검열하여 막기 때문에 정상적인 대화만 통과할 수 있다. 위와 같은 것을 해 주는 프로그램들이 많다고 한다. (nmap으로 검색) 서버에 대한 정보는 http://toolbar.netcraft.com/를 통해서 얻을 수 있다. 그리고 Telnet을 이용해서 여러 포트를 찔러 보면 OS나 서버 프로그램에 대한 정보를 알 수 있다.
상대 IP 주소를 알고 있다고 할 경우, 그 IP 주소까지 도달하면서 거치는 라우터들을 확인할 수 있다. 원리는 패킷의 수명 값을 바꾸면서 계속 탐색하는 것이다. 수명이 다 하여 사라지면 라우터들이 ICMP 메시지 “시간 초과”를 보낸다. 이것은 정상적인 절차인데 만약 중간에 방화벽 같은 것이 있다면 이런 메시지를 보내지 못 하게 막는다고 한다. 라우터에 대한 정보가 돌아오지 않으면 방화벽이 있다는 뜻으로 해석이 된다.(Visual Route 검색)
- 리눅스에선 traceroute
- 윈도우에선 tracert
방화벽이나 IDS도 장비이기 때문에 관리 목적의 포트를 열고 있다고 한다. 이 포트에 접속을 해 보면 방화벽이나 IDS 장비의 종류도 알 수 있다고 한다. 업체마다 다른 포트를 열고 있기 때문이다. 하지만 방화벽과 IDS의 IP주소를 어떻게 알 수 있단 말이지?
★ 도메인 이름을 가진 서버 정보 얻기
도메인 이름(www.daum.net 같은 이름)을 등록하면 지역을 담당하는 whois 서버에 그 정보가 저장된다.
지역 | whois 서버 |
일반 유럽 프랑스 영국 호주 아시아 한국 일본 | www.internic.net www.ripe.net www.nic.fr/cgi-bin/whois www.nic.uk whois.aunic.net www.apnic.net, www.arin.net whois.krnic.net whois.nic.ad.jp/cgi-bin/whois_gw |
DNS(Domain Name Service)는 외우기 힘든 IP 주소 대신 별명을 사용할 수 있게 해 준다. 이런 서비스를 하기 위해서 DNS 서버라는 것이 있는데 여기에 별명을 문의하면 IP 주소를 알려 준다. DNS서버는 자신이 찾지 못 할 때 상위 DNS에 문의하는 방식으로 결국 답을 찾아 회신한다. 단순 질문과 응답이기 때문에 UDP를 사용한다. 고로 각 PC에는 DNS 서버의 IP주소를 게이트웨이 주소와 함께 가지고 있어야 한다. PC 자기 자신이 IP에 대한 별명을 기억할 수도 있다.
- 리눅스에선 /etc/hosts
- 윈도우에선 c:\windows\system32\drivers\etc\hosts
위의 파일 안에 별명과 IP주소를 적으면 DNS에서 검색하지 않고 여기 기록된 내용에 따라 IP주소를 찾는다. 고로 도메인 이름을 등록하지 않은 어떤 IP 주소에 별명을 주려면 여기에 기록하면 된다. 게이트웨이와 DNS 서버 주소를 설정하는 방법은 아래와 같다. 여기에 기록된 것을 바탕으로 인터넷에 접근한다.
- 리눅스에선 /etc/resolv.conf
- 윈도우에선 ipconfig
DNS 서버에 대한 정보는 리눅스/윈도우 nslookup 명령으로 확인할 수 있다.
★ 게이트웨이에서 정보 얻기
책에 SNMP(간단한 네트워크 관리 프로토콜)이란 것이 나오는데 라우터나 허브에는 기본으로 설치 되어 있다고 한다. 원격에서 네트워크를 관리하려고 만든 표준이란다. 즉, 원격에서 라우터나 서버등을 관리할 수 있다는 말로 들린다. 그런데 황당하게도 이것이 보안상 취약하다고 한다. 아무나 접근 가능하게 해 놓았단다. 라우터를 해킹한다는 것은 별로 의미가 없어 보인다. 하지만 많은 정보를 알려 준다고 한다. 전에 게이트웨이 주소를 브라우저에 입력해서 라우터 정보를 수정하는 것을 본 적 있다. 황당하게도 암호가 걸려 있지 않아서 아무나 접근해서 조작할 수 있더라. 그래도 문제가 없는 것인지는 모르겠다. 그것이 SNMP였는지 아니면 일반 HTTP였는지 구분이 되지 않는다.그냥 브라우저로 라우터 정보를 수정해서 서버를 외부에 노출시킬 수 있었다. 라우터가 외부에서 들어오는 접근을 어느 정도 차단하는 것 같다. 지역 네트워크에서 사용하는 IP와 인터넷에서 사용하는 IP는 다르다. 외부에서 사용하는 IP는 중간의 라우터(게이트웨이)를 거치면서 내부 IP로 번역이 된다. 지역 IP는 컴퓨터마다 고정된 것이 아닌 변동적인 것일 수도 있다. 서버의 경우 IP가 고정 되어 있어야 하고, 외부에서 그 서버로 접속하려면 외부에서 보는 IP를 이용해야 한다. 내부 컴퓨터들은 내부에서 보는 IP를 이용하게 된다. 고로 자기 자신의 내부 IP를 상대에게 알려 주면 상대는 내 컴퓨터에 접속할 수가 없다. 라우터 중에는 3계층과 4계층에서 적당히 필터링을 하는 스크리닝 라우터가 있어 방화벽 비슷한 노릇을 한다.
★ 상대의 IP 주소 확인하기
메일 헤더에는 IP 주소가 기록된다. P2P로 나와 직접 연결되어 통신하는 컴퓨터의 IP 주소는 netstat 명령으로 확인할 수 있다. 자기 컴퓨터에 접속한 상대의 IP를 알 수 있는 것이다. 중계 서버를 이용한 채팅에서도 파일 전송은 중계 없이 P2P로 직접 하는 경우가 많아 파일 전송 할 때 확인하면 상대의 주소를 알 수 있다.
게시판에 글을 올리면 IP주소도 함께 저장된다. 그리고 서버에 접속을 하면 서버 로그 기록에 남게 된다. 게시판의 ID나 별명을 인터넷에서 검색하면 그 사람의 행적을 추적할 수도 있다. 그렇게 추적하다가 보면 IP를 알 수 있을지도 모르겠다. IP주소를 숨기거나 엉터리로 보내는 경우라도 상대의 컴퓨터가 접속하고 있는 라우터는 traceroute, tracert 명령으로 추적할 수 있다. 패킷이 여러 경로로 도달하지만 결국 출발지와 도착지의 관문은 공통으로 통과해야 하기 때문이다.
★ 무선 네트워크
무선으로 Access Point(접근점)이라는 안테나 장비(허브)에 정보를 주면 이 것이 유선 허브에 연결되어 보통 네트워크를 돌아 다닌다. 그래서 외부인이 방문해서 쉽게 내부 네트워크에 접근할 수 있다. LAN Card에 전선을 꼽지 않고도 말이다. 지향성 안테나(방향 있는 접시 안테나)는 엄청 긴 거리(km단위)에서도 동작하고, 무지향성 안테나(방향 없는 막대 안테나)는 약 300m까지로 건물 내부에서 사용하기 좋다. 여하튼 공중에 퍼지는 전파처럼 도청하기 쉬운 것이 어디 있을까? 아무 장치도 없이 바로 도청이 된다. 고로 불필요하게 전파가 강한 것은 피한다. DHCP(동적 호스트 구성 프로토콜)는 IP주소를 자동 할당한다. 무선 LAN에선 이것이 아무에게나 IP주소를 주는 것과 같다. MAC주소를 이용해서 외부인을 걸러 낼 수 있다. 하지만 허브를 바보로 만드는 해킹 기술이 있다. 거기다 도청도 쉽다. 대부분의 무선 LAN은 무방비 상태다. 그래서 무선 LAN에 접속할 때는 ID와 PW를 물어 보는 장치가 추가 되었다. 물론 공중 전파를 통해 전달 되기 때문에 암호화 되어 전송이 된다. 하지만 공공 장소의 무선 LAN은 이런 것을 하지 않을 것이다. 고로 그 장소에 있는 다른 사람의 노트북은 쉽게 해킹 당할 수도 있다. 보통 컴퓨터가 스스로 AP 위치를 쉽게 찾아 준다. 근처에 가기만 하면 된다. 근처에 가서 무선 LAN 도청 프로그램을 가동하면 모든 패킷을 잡을 수 있다.
★ 4계층 방화벽(FireWall) & IDS(침입 탐지 시스템) 5/6/7계층 장비 Proxy(대리인)
방화벽은 내부 네트워크와 외부 네트워크 경계부에 설치한다. 그러니까 게이트웨이가 있는 바로 그 지점이다. 이 놈이 하는 일은 들어오는 패킷의 내용을 일부 분석해서 차단하는 것이다. 프로토콜, 출발지 주소, 목적지 주소, 포트 번호를 보고 부당한 접속을 차단하는 것이다. 다시 말해서 내부에서 서버를 준비해도 외부에 노출시키지 않으면 외부에서 볼 수 없다. 허락된 서비스에 정상적인 대화 방법으로 접근한 것만 통과 시킨다. 일단 방화벽을 뚫고 내부로 들어 와도 IDS를 만난다. 방화벽은 철조망과 입구를 지키는 경비대라면 IDS는 첩자를 잡는 경찰과 비슷하다. 일단 내부에 들어온 것은 정상적인 것과 구분하기 힘들다. 그래서 장기간 감시하는 것이다. 뭔가 이상한 패턴이 발견되면 관리자에게 보고하는 것이 임무다. 방화벽은 통과 시킬 것과 통과 시키지 말아야 할 패킷을 구분한다. 그리고 통과 시킨 패킷에 대한 기록을 남긴다. 방화벽을 통과하는 방법으로, 신뢰성이 보장된 통로로 접근하는 것, 접속한 사용자가 PW를 답하는 방법, 모바일 장치의 경우 컴퓨터 그 자체의 자격으로 통과하는 방법이 있다. 즉, 선로가 안전한 경우, 접근 허락이 된 컴퓨터인 경우, 암호를 답하는 사용자의 경우 통과시킨다. 방화벽은 패킷의 내용은 검사하지 않는다. IP와 Port 정도만 확인한다. 그리고 외부에서 오는 것을 막지 내부에서 나가는 것을 막지 않는다. 그리고 내부의 일에는 간섭하지 않는다. 고로 해커가 내부에 직접 침입해서 접속하면 답이 없다. 더구나 무선 LAN을 통해 접근하면 방화벽을 돌아 갈 수도 있다. 그런데 라우터와 게이트웨이와 방화벽이 서로 의미가 겹치는 면이 있다. 라우터는 길을 찾아 주는 것이 주 목적인데 이 것이 방화벽 비슷한 역할을 할 수도 있다. 게이트웨이란 말 그대로 대문이란 뜻으로 라우터와 방화벽을 묶어 말하는 것 같다. 라우터가 인터넷 쪽에 붙어 있고 방화벽은 내부 네트워크 쪽에 붙어 있다. 라우터는 3계층 장비고, 방화벽은 4계층 장비다. 포트까지 인식해서 차단하기 때문이며 기록도 남겨야 한다. 고로 방화벽은 컴퓨터다.
방화벽 차단 규칙은 from 누구 to 누구 port 몇 번을 차단하거나 통과시키는 형태이다. 그 방문기록을 남길 것인지, 차단한 것을 송신자에게 회신할 것인지도 지정한다. 규칙은 등록한 순서에 따라 적용된다. 고로 규칙의 순서도 중요하다. 또한 내부 IP와 외부 IP를 바꾸어주는 NAT(Network Address Translation = 네트워크 주소 번역)을 사용한다. 외부 공인 IP는 수가 한정 되어 있다. 40억 정도인데 실제 사용하는 IP는 더 많다. 방화벽을 통과할 때 내부 IP는 방화벽의 IP로 바뀐다. 외부에서 볼 때 IP가 하나라면 내부의 IP는 외부 IP의 포트 번호로 구분한다. 이것을 PAT(Port Address Translation = 포트 주소 번역)이라고 한다. 내부에 서버가 있을 경우는 서비스 포트를 그대로 외부에 노출 시켜야 한다. 그 포트는 그 용도로 고정 된다. 내부 클라이언트가 외부 서버를 사용할 때는 임의의 포트로 번역한다.
외부에서 보이는 공인 IP 확인 : http://www.findip.kr/
프록시란 대리인이란 뜻으로 웹 페이지에 대한 캐시 역할을 하던 것이다. 방화벽으론 4계층 패킷을 걸러 낼 뿐이지 내용을 확인할 수 없어서 프록시로 내용을 걸러 내게 된다. 고로 프록시는 4계층 위의 567계층의 응용프로그램 계층의 프로토콜을 이해해야 한다. 고로 서비스마다 거기에 해당하는 프록시 서버를 구성해야 한다. 웹에 대한 통제를 하려면 프록시 서버가 HTTP를 이해해야 한다. 프록시는 웹 문서의 내용을 읽을 수는 있지만 내용을 분석하지는 않는다. 그냥 특정 웹 서비스의 사이트를 차단하는 정도이다.
침입 탐지 시스템은 해킹 도구와 비슷하게 네트워크의 모든 통신을 도청하여 기록한다. 또는 특정 컴퓨터에 설치 되어 그 컴퓨터의 모든 통신 기록을 저장한다. 스스로는 IP가 없기 때문에 3계층 이상으로 노출 되지 않는다. 기본적으로 도청을 하기 때문에 스위칭 허브가 있는 네트워크에선 특별한 장치를 해야 한다. 이 놈은 데이터를 수집하여 분석하는 놈이기 때문에 데이터 수집 규칙을 만들어 주어야 한다. 그렇지 않으면 데이터에 지칠 것이다. 공격 패턴을 입력하여 공격 조짐을 파악하게 한다. 새로운 공격 패턴엔 무기력하다. 이런 작업을 하기 위해서 매우 지능적인 전문가 시스템이나 추론 엔진 등을 사용한다. 또한 평균과 다른 이상한 현상을 탐지하기도 하는데 여기에도 인공 지능이나 통계 분석이 사용된다. IDS 중에 칩입자를 추적해서 역공격하여 차단하는 것을 IPS(침입 방지 시스템)라고 한다. 그 방법은 해킹에서 이용하는 방법과 같다. IDS는 방화벽 뒤, 내부 네트워크, DMZ 구역(비무장 구역 = 서버 구역)에 설치한다. 그 지역의 통신을 감시한다. IDS는 데이터를 수집해서 관리 시스템으로 넘긴다. IDS의 조상격인 리눅스 환경에서 동작하는 Snort라는 복잡한 프로그램이 있다. 책을 보니 설치 자체도 복잡하다.
허니팟(꿀단지), 허니넷(꿀망)은 해커를 유혹하기 위한 목적으로 만든 가짜 서버와 네트워크이다. 해커가 달려 들도록 취약한 모습을 보여야 한다. 하지만 해커의 모든 시도를 감시한다. VMware(가상 머신)을 설치하면 다른 OS를 추가로 설치할 수 있다. 윈도우에 MAC O/S나 리눅스를 설치할 수 있다. 이렇게 하면 하나의 컴퓨터에 여러 서버를 운용할 수 있다. 하나의 컴퓨터가 허니넷이 된다. 이것의 목적은 공격자의 기록을 몰래 남기는 것이라고 한다. 어떻게 동작하는지는 전혀 모르겠다. 그런 것이 있다는 것 정도로 만족하고 끝낸다.
여러 Protocol의 Packet을 잡아 알려 주는 프로그램 ▶ http://www.wireshark.org/
이 분야도 재미 있는 것 같다. 최신 네트워크 보안과 해킹에 관한 책을 사야 할까? 아냐! 난 게임 만드는 것이 더 재미 있는것 같다. 창조적인 일을 하자. 남을 공격하거나 방어하는 것은 취미 없다. 서버 관리자는 돈을 많이 벌지만 주말이 없다고 하더라. 너무 일이 많은 모양이다.
'IT > WebProgramming' 카테고리의 다른 글
File System 모듈 (0) | 2014.12.19 |
---|---|
MongoDB란? (0) | 2014.12.19 |
Buffer가 문자열을 가지고 있는 경우 사용 가능한 인코딩 (0) | 2014.12.19 |
웹2.0 web2.0 정의 (0) | 2014.12.19 |
웹 2.0과 공동체 (0) | 2014.12.19 |