이 포스트는 널널한 개발자님 강의를 참조하며 작성하였습니다.
Symmetric 방식은 보안성이 뛰어나다고 했는데 그러면 여기서 보안성은 무슨말일까? 단순하게 우리집 현관 도어락이라고 생각하면 된다. 이 도어락은 우리 가족들만 열고 들어올 수 있고 제3의 누군가가 열고 들어오게 해서는 안된다. 즉, 방화벽이라는것이 이런 역할을 하는데 NAT Gateway 구조적인 특징때문에 좋든 싫든 packet filtering 방화벽 역할을 한다. 예를 들어서 NAT-Table에 entry가 추가가 되면 Outbound에 의해서 추가가 된다. 그런데 문제는 나와 통신을 했던 서버쪽에서 응답이 오면 잘 bypass가 되지만 다른 서버가 나한테 패킷을 보내면 어떻게 될까? 아마 공유기는 보내온 패킷을 조사 후 NAT-Table을 확인 후에 검색된 레코드가 없으니 Drop시킬 것이다. 결국 한번도 통신한 적이 없는 호스트는 임의로 내부진입이 안 된다. 이것이 packet filtering 방화벽이 하는 일이다. 이런것이 보안성에서는 굉장히 좋지만 문제가 되는 경우가 있다.
제일 이슈가 되는 것이 바로 게임이다. 게임이 왜 문제냐면 게임은 일반적으로 P2P통신을 한다. 즉 게임을 하면서 게임 클라이언트끼리 서버를 안 거치고 직접 통신을 해야하는데 위의 이유로 차단이 되버리면 게임을 할 수 없을 것이다. 이런 걸 홀 펀칭이라고 하는데 공유기에 NAT-Table개념이 있는데 레코드가 없음에도 불구하고 통신을 해야하는 상황인 것이다. 이것을 해결한 방식이 Full Cone방식이다.
Full Cone방식이 어떻게 되는거냐면 위 그림처럼 내부망에 호스트 2대가 있다고 하자. 여기서 192.168.0.10:3000의 호스트가 웹서버 A와 접속했다고 하자. 그러면 트래픽이 Outbound되면서 바깥으로 나가고 그에 대한 응답이 Inbound되는 구조일 것이다. Outbound되었을 때 해당 정보를 NAT-Table에 기입을 하는데 Full Cone방식의 경우는 Local IP, Local Port를 하나의 External Port에 묶고 remote부분은 Any로 처리한다. 즉, 이런 경우는 호스트가 서버랑 한번이라도 통신을 했다면 그 이후로는 웹서버 B가 내부 호스트와 P2P통신이 가능하다는 것이다. 게임으로 애기해면 클라이언트가 게임 웹서버와 게임을 킬 때 한번 접속을 하면 이때부터 웹서버가 다른 게임 클라이언트에게 방금 이 클라이언트와 접속했으니 너가 직접 P2P통신을 해도 된다고 해당 클라이언트 IP, Port를 알려준다.
이렇게해서 좋은 점은 게임이 잘된다는 거고 안 좋은 점이 보안성이 떨어지고 트래픽 충돌 위험도 있으며 엉뚱하게 변조가 될 위험이 있지만 게임은 그런거 필요없고 게임만 잘 되면 되기에 이 방식을 게임에서는 채택한다.