공유기 작동 원리
공유기는 NAT 기술이 적용되어 있다.
NAT란 Network Address Translation, 즉 주소 변환이란 뜻이다.
IP 주소에는 public과 private이 있다.
원래 host 하나당 public IP 하나가 있어야 하는데, NAT는 public IP 하나를 가지고 여러 host가 동시에 사용할 수 있게 해주는 기술이다.
IP 주소와 포트 모두 제어할 수 있다.
IPv4 주소는 총 42억개가 있는데, IP 주소 부족문제를 해결해준다. (IPv6는 부족 문제 없다)
구조에 따른 분류
- Cone NAT
- 여러 종류가 있지만, 외부 포트와 연동할 때 단위가 host로 가면 Cone이다.
- Symmetric NAT
- TCP, UDP 같은 session이 있고, 세션마다 외부 포트를 지정한다.
- 보안성이 굉장히 뛰어나다.
즉, 외부포트가 Host냐 Session 단위냐의 차이
공유기 네트워크 구성
IP 주소(v4)는 크게 public과 private이 있다.
인터넷은 기본적으로 public network다.
NAT를 지원하는 공유기가 있으면 공유기를 중심으로 내부를 private network라고 한다. 내부에서는 private IP를 사용한다. (주로 192.168.x.x 또는 172.16.x.x 10.x.x.x 대역을 사용)
Symmetric NAT 방식
IP 헤더에 IP 주소, TCP/UDP 헤더에 Port 번호가 있는데 이걸 바꿔치기 한다.
private network 안의 Host가 외부로 요청을 보내면 IP와 Port는 대략 이렇게 된다. (상단 그림 참고)
Src | Dst | |
IP | 192.168.0.10 | 15.15.15.15 |
Port | 3000 | 80 |
이 요청이 NAT Gateway에 도착하는 순간 변조된다.
Src | Dst | |
IP | 3.3.3.3 | 15.15.15.15 |
Port | 23000 | 80 |
Host의 IP가 NAT Gateway의 Global IP로 바뀌고, Port 역시 바뀐다.
해당 요청이 웹서버에 도착하면 웹서버 측에서는 3.3.3.3 IP를 가진 host가 접속했다고 인식한다.
트리거는 Outbound다.
Outbound Traffic을 중심으로 뭔가가 변조되고 관련 자료구조가 생겨나는데, 이 자료구조를 NAT Table이라고 한다.
NAT Table은 공유기가 가지고 있다. 패킷이 나갈때마다 특정 IP + 특정 Port의 요청을 뭘로 변조했는지 기록한다.
패킷이 Outbound될 때만 해당 Table에 record가 추가된다.
NAT Table 예시
Local IP | Local Port | External Port | Remote IP | Remote Port | Protocol |
192.168.0.10 | 3000 | 23000 | 15.15.15.15 | 80 | TCP |
192.168.0.12 | 2500 | 23001 | 15.15.15.15 | 80 | TCP |
192.168.0.11 | 4000 | 23002 | 15.15.15.15 | 80 | TCP |
웹서버로 보낸 요청이 돌아올 때는 Dst가 3.3.3.3 (NAT Global IP)에 Port 23000으로 돌아온다.
그러면 공유기가 Src IP, Port, Dst Port 이 3가지를식별자로 NAT Table을 조회해서 IP, Port를 찾아 다시 변조한다. (= Remote IP, Remote Port, External Port)
공유기가 각 Host 별로 다른 Port를 사용하면 두개의 호스트가 하나의 IP 주소로 접속했지만 웹서버 입장에서는 하나의 호스트가 2번 접속했다고 인식하게 된다. (보안 문제와 연결 → 발생량 기반 규칙)
Full Cone 방식
공유기=NAT Gateway가 패킷 필터링 방화벽 역할을 한다.
NAT Table에 데이터가 추가되려면 Outbound, 즉 내부에서 요청이 먼저 나가야 한다.
웹서버에 요청을 보내서 온 응답의 경우, NAT Table에 레코드가 추가되어 있어 내부 네크워트의 어떤 호스트에게 응답을 전달해야 할지 알지만,
그 외의 경우, 즉 임의의 패킷이 먼저 들어온 경우에는 어떤 호스트에게 전달해야 할 지 모르기 때문에 처리불가 상태가 되어 드랍한다.
이때 가장 이슈가 되는 것이 게임이다.
게임의 경우 P2P 통신을 하는데 직접적으로 통신이 안되고, 클라이언트가 포트를 열어놔도 바로 접속이 안되서 속도가 느리다.
해결 방법은 '홀펀칭'이다. (홀펀칭에 대한 자세한 설명은 여기로...)
NAT Table에 레코드가 전혀 없음에도 통신이 되게 하려면 많이 열어주면 된다. 하지만 보안성이 낮아진다. (내부 엉뚱한 호스트에 요청을 날린다던가)
Full Cone 얘기로 돌아와서,
이 방식은 Host와 Port를 하나의 External Port에 매핑하는 방식이다.
Local IP | Local Port | External Port | Remote IP | Remote Port | Protocol |
192.168.0.10 | 3000 | 23000 | Any | Any | TCP |
예를 들어 192.168.0.10 호스트를 3.3.3.3:8080번에 매핑했다면, 3.3.3.3:8080번으로 유입되는 모든 것은 192.168.0.10:3000으로 보내는 것이다. 즉, Remote IP, Port는 상관하지 않겠다.
문제가 되는 것은 Remote IP, Port 모두 Any이기 때문에 어떤 요청이 와도 3.3.3.3:8080으로 들어오는 요청은 '그' host가 받게 되는것이다.
좋은 점은 게임이 잘 된다.
특정 게임을 할때 어떤 게임은 무조건 3000번 포트를 연다 이런 룰이 있는데, Cone 방식을 사용하면 무조건 서버와 직접적으로 연결할 수 있다. (홀펀칭이 잘 된다.)
보안성 면에서 봤을때는 안좋다.
그리고 잘못 사용하면 충돌 가능성이 있다.
결론적으로 Full Cone 방식의 NAT를 쓰는 경우가 상당히 많다.
정리
단점
- Remote IP, Port 모두 Any이기 때문에 특정 external port로 들어오는 모든 요청을 특정 host가 받게 된다.
장점
- 게임이 잘 된다.
- 특정 게임을 할 때 어떤 게임은 무조건 3000번 포트로 연다 이런 룰이 있는데, Cone 방식을 사용하면 무조건 서버와 직접적으로 연결할 수 있다. (=홀펀칭)
- 보안성 면에서 봤을 때는 안좋다.
Cone 계열 = host IP + Port를 external Port랑 매핑해준다.
따라서 이 Port(external) 번호랑 Global IP만 알면 누구라도 내부 유입이 된다.
Restricted Cone 방식
Full Cone은 Remote IP, Port를 전혀 신경쓰지 않고 트래픽이 오면 받는 방식
Restricted Cone NAT는 Remote IP를 기록해둔 뒤 External Port와 Remote IP를 보고 Table에서 조회하는 방식이다.
한번도 통신한 적이 없는 외부에서 트래픽이 오면 드랍한다. 엉뚱한 호스트가 접속하는 것을 막을 수 있다.
Local IP | Local Port | External Port | Remote IP | Remote Port | Protocol |
192.168.0.10 | 3000 | 8000 | 15.15.15.15 | Any | TCP |
Port Restricted Cone 방식
Restricted Cone + Remote Port까지 확인
Local IP | Local Port | External Port | Remote IP | Remote Port | Protocol |
192.168.0.10 | 3000 | 8000 | 15.15.15.15 | 5555 | TCP |
Port까지 확인하게되면 같은 호스트 내에서 각기 다른 프로세스가 같은 External Port를 사용하더라도 각기 다른 Port로 응답을 받을 수 있다.
NAT를 사용하는 이유는 여러 호스트가 인터넷을 잘 쓰기 위함인데, NAT는 P2P 통신을 방해한다.
따라서 이를 해결하기 위한 방법으로 Restricted Cone 방식을 사용하는 것이다. (Port Restricted Cone도 가끔 쓴다.)
Symmetric과 Port Restricted의 차이는?
- Symmetric의 경우는 external port를 아끼지 않음. 즉 같은 호스트 내에서 다른 프로세스의 통신일지라도 다른 external port를 사용. 세션별로 지정
- Port Restricted는 external port를 호스트별로 지정
포트 포워딩
보통 NAT 내부를 Client라고 한다. 외부에서 요청이 먼저 오는 경우는 흔하지 않으니까.
하지만 그럼에도 요청이 오는 경우가 있는데, 이를 위해 NAT Table을 직접 수정하는 것을 포트포워딩이라고 한다.
(원래는 outbound에 의해 자동으로 추가)
예를 들어, private 네트워크 안에서 서버를 호스팅 할 때 외부에서 접속할 수 있도록 포트포워딩 한다.
특정 포트로 접근하는 요청을 특정 호스트로 연결하는 것
만약 양쪽 호스트가 모두 NAT 네트워크 안에 있는데 P2P 통신을 해야한다면, 양쪽에서 각각 포트포워딩을 해야 한다.
'공부 > 네트워크' 카테고리의 다른 글
[네트워크 응용] 부하분산 시스템 작동원리 (0) | 2024.04.14 |
---|---|
[네트워크 응용] Proxy (0) | 2024.04.03 |
[네트워크 응용] 네트워크 장치의 구조 (0) | 2024.03.27 |