(해결)NAT를 사용하면 실제로 어떤 변화가 생기나요?
글쓴이: jailbird / 작성시간: 토, 2004/03/06 - 6:28오전
Q&A 게시판 중에서는 적절한 곳을 찾기 힘들어 이곳에 올려봅니다.
굳이 연결짓자면 iptable 활용에 관한 Q&A라 할까요?
이야기를 단순화하기 위해 아래와 같이 가정하였습니다.
송수신 패킷 구조 : [Ethernet Frame][TCP Header][IP Header][Data]
네트워크 연결 구조
[DeskTop]----------------[NAT/Router]-----------[KLDP] IP Address 192.168.0.2 192.168.0.1 x.y.z.1 x.y.z.2 MAC Address 0A 0B 0C 0D
아시다시피 Ethernet Frame에는 출발지와 목적지의 MAC Address가 TCP header에는 출발지와 목적지의 port가 IP header에는 출발지와 목적지의 IP address가 들어갑니다. 보통의 일반적인 라우팅이라면 TCP header나 IP header의 내용은 변경없이 Ethernet Frame의 MAC Address만 변경해서 패킷을 송수신하는 것으로 알고 있습니다. DeskTop에서 KLDP의 홈페이지를 열어볼 경우 사설 IP가 아니고 그냥 Router만 통과한다면 다음과 같이 되겠죠. 각각의 헤더는 [Source|Destination]으로 표시하였습니다.
1) Desktop [0A|0B][1234|80][192.168.0.2|x.y.z.2][Data1] 생성, 발송 2) Router [0C|0D][1234|80][192.168.0.2|x.y.z.2][Data1] 변경, 발송 3) KLDP [0D|0C][80|1234][x.y.z.2|192.168.0.2][Data2] 생성, 발송 4) Router [0B|0A][80|1234][x.y.z.2|192.168.0.2][Data2] 변경, 발송 5) Desktop 패킷 수신 및 웹브라우저에 표시
라우팅에 대해서는 이렇게 이해하고 있는데, 잘못된 부분이 있다면 테클 걸어주세요.
다시 주제로 돌아가서, NAT를 사용하면 이 TCP header, IP header도 수정하고 그 내용을 기록하겠지요? 개략적인 설명은 몇몇 문서에서 찾을 수 있었으나 구체적으로 각각의 내용이 어떻게 변경이 되는지 찾을 수가 없어서 이렇게 질문을 드려봅니다. 위의 라우팅 과정처럼 NAT 과정의 변화를 속시원히 좀 드러내주세요.
File attachments:
첨부 | 파일 크기 |
---|---|
![]() | 8.21 KB |
![]() | 8.21 KB |
Forums:
패킷 형태가 틀렸죠?
패킷이 덮어씌워지는 순서가 틀렸습니다.
EtherFrame - IPDatagram - TCPPacket - Data
위와 같이 IP위에 TCP가 올라갑니다.
그리고 라우팅에 대한 이해는 제대로 알고 계신 것입니다.
이더넷의 프레임의 주소가 바뀌는 것은 맞는데..
다시 생각하실 내용은..
패킷을 다시 생성합니다.
그래서 라우터가 패킷을 받으면 Ethernet을 때어낸다음
다시 나갈 때 다시 만들며, 인터넷이란 것이 Ethernet으로만 이루어진 것이 아니기에
들어온 이더넷 프레임은 나갈 때 Atm Cell로 나갈 수도 있죠..( 맞나?)
그리고 NAT를 한다면 가장 기본적은 것은..
IP Header에서 당연히 Source를 변경하게 되죠(SNAT의 경우)
그리고 그 패킷은 NAT Table에 기록되어 돌아온 패킷을 원래 호스트로 전달하죠
Re: 패킷 형태가 틀렸죠?
하~ 감사합니다. 이 내용은 얼핏 지나가면서 몇번 읽은 기억이 나네요. 읽는 순간 얼굴 시뻘개지면서 '맞아! 이런것도 몰랐다니...' @.@
휴~ 엄하기로 소문난 교수님께 듣기 어려운 칭찬 한 마디 들은 기분이었습니다. 10여년 전 학창시절이 새삼 그리워지네요. 감사합니다. 시험쳐서 붙은 기분입니다.
첫번째 질책이 기초력 테스트 낙제였다면, 이번 질책은 응용력 테스트 낙제네요. ^^; 집안에서 이더넷 카드만 만지작거리고 있다보니 다른 상황에 대해서는 상상조차 하지 못했네요. 감사합니다.
이상을 토대로 다음과 같이 라우팅에 대해 수정해보았습니다.
단, 상황을 단순화하기 위해 모든 네트워크 인터페이스는 이더넷카드로 제한하였습니다.
헤더 순서를 말씀하신 것과 같이 바꾸었고, 앞서의 변경이란 단어를 routing이라는 단어로 바꾸었습니다. 이는 이더넷 프레임을 버리고 상황에 따른 새로운 프레임을 기준으로 패킷을 재생성하는 과정을 염두에 두니 적절한 단어가 없어서요.
휴~ 이정도면 재시 합격인가요?
다시 NAT로 돌아가서
읽은 문서들 중에 NAT의 과정을 이해하는데 가장 도움이 되었던 글이 다음과 같은 부분입니다.
이 글을 토대로 아래와 같은 가정 아래에서 패킷의 변화를 상상해보았습니다.
mapping table은 어떻게 구성되어있는지 전혀 몰라 임의로 만들었으며
[source address:port|NAT-outer address:port]로 설정했습니다.
routing 순서는 snat, dnat에서 각각 post-, pre-routing 한다고 해서 임의로 순서에 넣었습니다.
머리를 쥐어짜가며 만들어본 결과인데 실제로 이런 방식으로 작동하진 않겠죠? 뭔가 많이 부족할 듯합니다. 조언을 들을 수 있을까요?
NAT는 말 그대로 네트웍주소를 바꾸는겁니다.레이어3,4에서 일어
NAT는 말 그대로 네트웍주소를 바꾸는겁니다.
레이어3,4에서 일어나는 일이니 레이어2의 맥어드레스까지 언급할 필요는 없습니다.
맥은 랜에서만 씁니다.
WAN에서 IP패킷이 IP를 기준으로 라우팅되다가 도착지에 도착하면 라우터가 맥을 달아주어서 해당 호스트까지 찾아가는거죠.
단순하게 생각하세요.
Jailbird님께서 그려놓으신 그림을 참조하도록할께요...
여기서 NAT에 필요한것은 TCP헤더에있는 소스/데스티네이션포트, IP헤더에있는 소스/데스티네이션 아이피입니다.
1.1.1.11에서 lynx를 이용하여 kldp.org 웹서버에 접속한 내용을 캡쳐한겁니다.전부터 한번 확인해보려던건데 이제 하게됐네요.
지금 사무실에서 사용중인 프비머신에서 뜬겁니다.(프비5.1 ipfw,natd 이용)
캡쳐한게 보기 안좋아서 순서대로 번호를 붙였습니다.
그럼 차근차근 번호대로하면...
캡쳐한 원본은 양이 많아 파일로 첨부합니다.
^^;;
SNAT를 먼저하고 routing을 나중에 하면 routing에 문제가 생기
감사합니다. 덕분에 많은 부분이 명확해졌습니다. 그리고 제가 많은 부분을 얼마나 잘못 이해하고, 기억하고 있었는지 되짚어볼 수 있었습니다. 고물컴 한대 더 옆에 있었을 때 저 tethereal 명령어라도 알았었다면 싶더라구요. 게다가 순서대로 설명까지 해주시니 감사합니다.
말씀처럼 NAT만 이해하자고 드니 맥어드레스는 전혀 필요없더군요.
사실 이것을 언급한 까닭은 NAT와 routing가 서로 영향을 미치기 때문입니다. (이 부분은 아래에서 다시 이야기할께요.)
그리고, 아직까지도 routing을 "패킷의 목적지IP를 기준으로 MAC Address를 변경하는 작업"으로 오해(!)하고 있었기 때문입니다. WAN은 MAC이 없다니...., 생각해보면 연결되는 node가 그렇게 많지 않다면 모두 1:1 통신을 하는게 효율적일테고 그러면 MAC이 필요없겠죠.그럼 routing을 "패킷이 나가야 할 NIC을 결정하는 작업 + LAN의 경우 MAC address 수정"이라고 생각하면 맞을까요?
이것 저것 새로 이해한 것들을 바탕으로 위의 예를 아래와 같이 정리해 보았습니다.
휴~ 이즈음에서 기말고사를 한 번 봐야 하겠네요. IP,TCP 헤더는 변함이 없는데도 routing을 넣은 것은 그 순서를 명확히 표시하기 위해서입니다. 아래에서 다시 질문하려구요. 여하튼 이렇게 정리하면 맞을까요? (그러고보니 저번에는 너무 엉터리 답안을 제출했네요. routing위치도 둘 다 틀렸고) (후후.. 그러고보니 설명해주신 1-4번 그대로네요. 틀릴 리도 없겠당.)
이런 저런 생각을 하며 정리하다보니 제가 Port에 대해 제대로 알지 못한다는 것도 확인하였습니다. 하지만, 이 이야기를 시작하면 주제에서 벗어날 듯하여 생략하고 아직도 잘 안풀리는 아래의 문서에 대한 질문 한가지만 할께요.
http://www.netfilter.org/documentation/HOWTO/NAT-HOWTO-6.html 에서 다음의 인용문을 찾아보면,
SNAT는 POSTROUTING chain에 있는데, 즉 라우팅을 한 후에 SNAT를 하는데, 그렇기 때문에 패킷의 내용이 변하기 전인 원래상태을 알수 있는 상황에서 제대로 routing을 하게된다는 것이죠. 이러한 사실때문에 SNAT와 routing의 순서가 중요하다고 설명하고 있고요. 그런데, 이 부분이 잘 이해가 안갑니다. SNAT를 먼저 한다고 해도 목적지IP는 건드리지도 않기 때문에 routing에는 전혀 이상이 없을 것이라고 생각되거든요. 뒤이어 나오는 설명에서 이 순서 때문에 -o 옵션이 가능하다고 하는 것은 나름대로 이해가 가더군요. -o 옵션의 의미가 "xxx라는 인터페이스로 나가는 패킷에 규칙을 적용한다."라고 생각하면, routing하기 전에는 패킷이 나갈 인터페이스가 제대로 결정되지 않은 상태일테니 -o 옵션이 제대로 작동하지 않겠지요.
즉, 이 설명을 "라우팅과 SNAT의 순서가 바뀌면 SNAT에서 -o 옵션이 제대로 작동하지 않으니 안된다."라고만 했으면 무리없어 보이는데, "순서가 바뀌면 라우팅도 잘 안된다." 라고 해석되어서 이해가 안간다는 것이죠.
제가 영어실력이 형편없어서 해석을 잘못했나 싶어 그 아래의 비슷한 구문을 갖춘 6.2 Destination NAT도 같은 방식으로 해석해 봤거든요.
생각끝에 결론은 "라우팅을 할 때는 목적지IP도 참조하지만, 시작점IP도 참조한다."라고 되었는데, 정말 그런가요? 어느 생각이 잘못된 것인지 판단할 수가 없네요. 조언을 기다리겠습니다.
먼저 결론을 내리면 라우터는 목적지아이피만 참고하여 라우팅하는 단순한 기
먼저 결론을 내리면 라우터는 목적지아이피만 참고하여 라우팅하는 단순한 기계라는겁니다.
초창기 TCP/IP를 설계했을때는 서로 믿고사는 분위기였다잖아요.
그래서 보안이고뭐고 그냥 서로 약속한대로 패킷을 주고받으면 통신이되는 획기적인 시스템이었는데, 어느날인가부터(특히 케빈미트닉) 해커들이 신뢰를 기반으로 하는 TCP/IP의 약점을 이용하기 시작한거죠.
그래서 라우터들도 좀 더 신경써서 라우팅을 하기 시작한거죠.
가령 외부에서 들어오는 패킷인데 출발지주소가 내부아이피(로컬)인경우라던가, 사설아이피, 멀티캐스트로 예약된 대역등 공인망에서 쓸 수 없는 아이피라면 패킷을 버린다는거죠.
그래서 nat 서버에서 패킷을 공인망으로 내보내기전에 출발지 주소를 공인망에서 쓸 수 있는 아이피로 바꾸어서 내보낸다는겁니다.
그리고 OSI 7 layer 문서를 다시한번 읽어보세요.
SNAT이든 DNAT이든 모두 Layer 3,4 에서 일어나는 일입니다.
NAT에서 조작된 패킷들이 실제 해당 호스트에게 전해지는건 모두 라우터 안쪽의 Layer 2에서 Mac address로 작동하는거니 신경쓸필요 없습니다.
IP레벨이하에서는 스위치와 랜카드들이 알아서 다 하니 뭘 하는지 알 필요가 없습니다.
아...그리고 SNAT랑 DNAT를 너무 복잡하게 생각하시는거같은데 NAT machine 에서 라우팅이란 패킷이 하나 있으면 이걸 외부로보낼까 내부로보낼까, 아니면 죽여버릴까 이것만 판단하면 된다는겁니다.
SNAT는 패킷이 바깥으로 나갈때인데 목적지주소가 이미 있으니 라우팅하는데는 문제가 없는거고(라우터는 목적지주소만 알고있으면 된다고했습니다) 출발지 주소만 공인아이피로 바꿔주면 인터넷을 여행하는데 지장이 없는거죠.
반대로 DNAT는 NAT machine에서 조작해 발송한 패킷의 응답이 되돌아왔을때의 상황이잖아요.
출발지, 도착지모두 공인아이피인 패킷을 원래 패킷운송을 의뢰했던 사설네트웍의 호스트에 돌려주려면 당연히 라우팅 정보를 바꿔줘야하지않겠습니까?
SNAT, DNAT에대한 설명이 나와있네요...
http://www.linuxlab.co.kr/docs/01-03-2.htm
^^;;
감사합니다. 그리고, 덕분에 무엇을 보아야 할 지 방향을 잡았습
두서없는 글에 세심하게 답변해 주신 점 감사합니다. 다시 이제껏의 글을 읽어보니 처음 시작했던 주제는 이미 해결한 상태이더군요. 박영선님께서 올려주신 첨부파일과 그 설명을 따라 읽으면서 해결된 문제였습니다. 말씀하신 것처럼 라우팅은 생각하지 말고 단지 어떤식으로 패킷이 변했는가를 따라가기만 하면 되었고, 라우팅과의 순서 문제는 NAT-2.4-HOWTO에 그려져 있는 대로만 된다고 생각하면 큰 문제는 없었습니다.
제가 어제 질문으로 올린 글은 주제와 좀 거리가 있는 내용이니 새로 써야 했던 듯해요. 더구나 그 글은 질문하는 내용도 약간 모호한 점이 있네요. 이런 글에까지 자세히 답변해주셔서 감사합니다. 덕분에 제가 정말 알고자 했던 것이-초보자는 자기가 뭘 원하는지도 때로는 잘 모르게 되더군요^.^- "OSI 7 Layer" 안에 들어있다는 것을 알게 되었습니다. 그런데 찾아서 읽다보니 내용도 방대하고 읽고 소화할만한 지식도 부족해서 좀 시간을 두고 접근해야겠다는 결론이 나더군요. 다시 한 번 감사드리며 글을 접습니다. 꾸벅~
댓글 달기