알아두면 좋은 네트워크 개념 - IP, port, firewall, SSH, ping, netcat

6 minute read

프로젝트를 시작하면 새로운 환경에서 일하기 위해 방화벽 설정 등 각종 네트워크 연결 작업을 수행한다. 처음 내 컴퓨터에 환경을 구성할 때나 갑작스러운 장애 상황에서 조금의 네트워크 개념을 알면 많은 도움이 된다. 네트워크의 원론적인 이야기보다는 실용적인 관점에서 몇 가지 요소에 대해 알아보겠다.

중요 네트워크 개념

서로 다른 컴퓨터끼리의 통신을 이해하려면 몇가지 네트워크 개념에 대해 알아야 한다. 기본적인 개념을 위주로 먼저 알아보자.

IP Address (Internet Protocol Address)

IP Address는 Internet Protocol Address로 인터넷에 존재하는 컴퓨터의 네트워크를 식별하기 위한 주소이다. 구글과 같은 웹사이트로의 접근도 결국 구글 서버 컴퓨터의 IP 주소를 통해 이루어진다.

현재 기준으로 구글 서버의 주소는 216.58.220.142 이고 웹브라우저에서 이 주소를 입력하면 구글로 들어갈 수 있다. 우리가 사용하는 google.com 은 IP 주소 형식을 외우기 힘드니 사람이 이해하기 편한 형태로 관리하는 DNS (Domain Name System)의 구현체이다.

ping

google.com 이라는 사이트로의 접속이 가능한 것은 사실 구글 서버 컴퓨터에서 우리가 사용하는 개인 컴퓨터의 접근을 허용했기 때문이다. ping 이라는 커맨드를 통해 특정 컴퓨터로 연결을 점검해 볼 수 있다.

ping 결과

$ ping google.com
PING google.com (216.58.220.142): 56 data bytes
64 bytes from 216.58.220.142: icmp_seq=0 ttl=116 time=37.323 ms
64 bytes from 216.58.220.142: icmp_seq=1 ttl=116 time=44.984 ms
64 bytes from 216.58.220.142: icmp_seq=2 ttl=116 time=45.063 ms
64 bytes from 216.58.220.142: icmp_seq=3 ttl=116 time=38.349 ms
^C
--- google.com ping statistics ---
4 packets transmitted, 4 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 37.323/41.430/45.063/3.612 ms  

ping 은 일정 크기의 데이터 패킷을 목적지 호스트로 보내고 돌아오는 지를 보고 연결을 확인한다. 정상적으로 연결이 되어있다면 위처럼 보낸 패킷 수만큼 패킷을 돌려 받는다.

특정 사이트(e.g. naver.com)의 경우 ping 커맨드를 명령어를 막아두어 ping 결과는 timeout으로 나오지만 실제 연결은 가능하기도 하다. 하지만 일반적으로 ping 은 대상 컴퓨터와 네트워크 연결을 확인할 때 보편적으로 사용되고 있다.

프로젝트에서도 ping 을 종종 사용한다. 개발을 하다 보면 갑자기 시스템에서 DB나 모델의 결과를 받아오지 못하는 등의 이슈가 생길 때가 있다. 이럴 때 서버 호스트 ip 주소로 ping 을 쳐보고 연결이 가능한 지를 확인해 보고 필요한 조치를 네트워크 담당자에게 문의할 수 있다.

firewall

우리말로 풀이하면 방화벽이다. 굳이 프로그래밍을 하지 않더라도 개인 컴퓨터를 쓰면서 들어본 개념일 것이다. 운영체제에서는 방화벽을 통해 내외부 네트워크의 연결을 관리한다.

내외부라는 표현을 썼는데, 방화벽은 실제로 내 컴퓨터로 들어오는 연결뿐만 아니라 내 컴퓨터에서 외부로 접속하는 연결도 관리한다. 인바운드(Inbound)와 아웃바운드(Outbound)라는 용어로 표현되는데 프로젝트 초기에 옆에서 많이 들을 수 있을 것이다. 간단히 정리해보면 다음과 같다.

  • 인바운드: 컴퓨터 내부로 들어오는 연결 설정
    • e.g. 구글 서버 컴퓨터로 내 컴퓨터 ip가 들어오는 연결
  • 아웃바운드: 컴퓨터에서 외부로 나가는 연결 설정
    • e.g. 내 컴퓨터에서 google.com, naver.com 등의 사이트로 나가는 연결

프로젝트에서는 인바운드 방화벽 설정을 통해 개발 컴퓨터에서 서버 컴퓨터로 접근을 허용한다. AWS의 ec2 instance를 사용한다고 하면 인바운드 규칙을 만들어 특정 ip 컴퓨터의 접근을 허용하는데 이것도 방화벽을 이용해 설정하는 것이다.

아웃바운드의 경우 우리가 서버 컴퓨터에서 무언가를 받으려고 할 때 경험해볼 수 있다. 개인 컴퓨터에서 brew, yum 등의 패키지 관리자로 받던 프로그램들을 서버 컴퓨터에서 받으려고 하면 받아지지 않을 때가 있는데 아웃바운드 방화벽 때문이다. 이럴 때 일시적으로 아웃바운드 방화벽을 풀면 패키지 관리자를 통해 원하는 프로그램을 받을 수 있다.

port

네트워크에서 포트는 굉장히 중요한 개념이다. 우리가 연결하려는 컴퓨터에는 하나 이상의 어플리케이션들이 실행되고 있다. 접근하려는 컴퓨터에 DB도 올라가있고 웹서버도 올라가 있는 상황을 가정해보자. DB에 접속하고 싶지만 컴퓨터의 ip 주소만으로는 여러 어플리케이션 중에 DB 어플리케이션으로 들어가기 위해 어디로 가야하는지 알 수가 없다.

포트는 한 컴퓨터 내에 여러 어플리케이션으로 들어가는 통로를 구별해주는 연결점이다.

mysql을 사용하고 있다면 3306 포트, postgreSQL을 사용하고 있다면 5432 포트를 ip 주소와 함께 이용하면 네트워크 상의 다른 컴퓨터의 DB로 연결할 수 있다.

구글 접속 예시를 생각해보면 구글 서버 컴퓨터에도 많은 서비스들이 존재할 텐데 우리는 ip 주소만으로 웹사이트에 접속했었다. 이 경우는 웹브라우저가 기본적으로 ip 주소 뒤에 80포트를 붙여 사이트에 접속하기 때문에 가능했다. 웹 브라우저에 http://216.58.220.142:5432/ 로 포트를 변경해서 쳐보면 접속이 되지 않는 것을 확인할 수 있다.

앞서 설명한 방화벽의 경우도 ip주소와 포트를 묶어서 인바운드 및 아웃바운드 규칙을 관리한다.

원격 접속 (SSH, telnet, 윈도우 원격 접속)

그럼 이제 실제로 내가 원하는 다른 컴퓨터에 접속하는 방법을 알아보자. 우리는 여러 프로토콜을 사용해 다른 컴퓨터로 접속한다. 요새는 일반적으로 SSH (Secure Shell Protocol)라는 보안을 고려한 네트워크 프로토콜을 사용한다.

유닉스 기반 운영체제의 경우 쉘에서 ssh 커맨드를 통해 윈도우의 경우 putty라는 클라이언트로 원격 접속을 수행한다. 현재는 윈도우도 WSL2의 지원으로 유닉스 기반 운영체제처럼 ssh 커맨드를 사용해 ssh 접속을 하기도 한다.

SSH를 이용하면 대상 컴퓨터에 접속해 쉘 상에서 내 컴퓨터처럼 사용하며 원격 제어가 가능하다. 접속 커맨드 예시는 아래와 같다.

SSH 접속 커맨드

# 기본 포트 22 사용
$ ssh username@13.57.111.111
# 별도 포트 사용
$ ssh -p 5001 username@13.57.111.111
# 키 페어를 사용한 접속
$ ssh -i /home/jin/.ssh/MyKey.pem root@13.57.111.111

SSH는 기본적으로 22번 포트를 사용하고 서버에서 포트를 바꾸지 않았다면 ssh username@13.57.111.111 같은 형태로 접속이 가능하다. 포트가 바뀐 경우에는 -p 5001 처럼 옵션을 써주면 된다. 위 두 가지 접속은 비밀번호를 사용해서 접속하는 형태인데, 키 페어를 활용한 접속 방식도 있다. 키 페어를 활용한 방식은 비밀번호를 이용한 방식보다 보안이 훨씬 강력하다. 많이 사용하는 aws ec2에서도 보통 키 페어를 활용해 SSH에 접속하는 것을 권장한다. SSH로 접속하게 되면 해당 컴퓨터의 쉘이 열리고 내가 원하는 대로 개발을 수행할 수 있다.

SSH 이전에는 telnet이라는 프로토콜로도 윈격 접속을 수행했는데 보안 문제로 지금은 잘 사용되지 않는다. SSH는 교환하는 네트워크 데이터가 암호화되지만 telnet의 데이터는 노출된 형태로 교환되어 보안에 취약하다.

SSH, telnet 이런 용어가 나오면 어려워보이기도 하지만 잘 생각해보면 원격 접속을 위한 방법일 뿐이다. 윈도우에서는 원격 데스크톱 연결이라는 기능을 통해 원격 접속 수단을 제공하기도 한다. 큰 틀에서 보면 모두 네트워크를 통해 다른 컴퓨터로 접속하는 방법들일뿐이다.

원격 접속 확인 (ping, telnet, netcat)

프로젝트를 하다보면 갑자기 원격 접속이 안 될 때가 있다. 정기적인 비밀번호 변경을 다른 사람이 수행했다거나 이유가 있을 수 있다. 이런 경우 원격 접속이 제대로 이루어져있는 지 확인하는 일들을 꽤 자주하게 된다. 이럴 때 ping, telnet, netcat 등을 쓰게 된다.

원격 접속 확인 커맨드

# ping은 호스트 간 연결만 확인
$ ping 13.57.111.111
# telnet이나 nc는 포트 번호(80)까지 같이 써서 포트의 연결 여부를 확인
$ telnet 13.57.111.111 80
$ nc -zv 13.57.111.111 80

# 구글 접속 확인 예시
$ ping google.com
PING google.com (172.217.31.142): 56 data bytes
64 bytes from 172.217.31.142: icmp_seq=0 ttl=116 time=71.341 ms
64 bytes from 172.217.31.142: icmp_seq=1 ttl=116 time=50.330 ms
64 bytes from 172.217.31.142: icmp_seq=2 ttl=116 time=45.617 ms
^C
--- google.com ping statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 45.617/55.763/71.341/11.182 ms

$ nc -zv google.com 80
Connection to google.com port 80 [tcp/http] succeeded!

ping 은 인터넷 연결이 되었는 지를 확인할 때 사용하고 telnet, natcat 은 대상 호스트의 특정 포트가 열렸는 지를 확인하는 용도로 쓰인다. ping 은 작동이 되는데 접속이 안 되면 해당 포트의 방화벽이 설정된 것이 아닌지 확인을 해봐야 한다. 마찬가지로 telnet 은 예전 방식이므로 netcat 을 활용하는 것이 좋은 것 같다.

참고로 ping은 포트와 상관이 없는 확인 방식이라고 한다. 다만, 앞서 설명한 것처럼 특정 호스트들은 ping의 동작을 막아놓기도 해 사용이 불가능할 때가 있다.

기타 개념

MAC Address (Media Access Control Address)

MAC 주소는 디바이스 네트워크 하드웨어인 NIC (Network Interface Card)의 주소이다. MAC 주소는 고유하게 설계되며 C9:3F:BK:33:AA:44 처럼 12자리로 구성되어 있다.

실제 네트워크 통신은 물리적인 MAC 주소를 알아야 이루어진다. IP와 달리 MAC 주소는 생소할 수 있는데 우리가 쓰는 인터넷이나 네트워크 연결들은 IP 주소를 바탕으로 맥주소를 알아내는 프로토콜이 돌아가며 작동된다. 통신에 IP만 필요하면 될 것 같지만 OSI 7 계층을 보면 네트워크 통신은 데이터 링크 계층에 Mac 주소를 반드시 필요하게 설계되어 있다.

MAC Address 확인 방법

프로젝트 등에서 관리 목적으로 MAC 주소를 물어보기도 하는데 확인 방법은 다음과 같다. 윈도우와 맥의 확인 방법이 다르다.

Mac Address 확인 커맨드

# 윈도우
$ ipconfig /all
# 맥
$ ifconfig | grep inet

윈도우는 나온 결과에서 ‘무선 랜 어댑터 Wi-Fi’에 써 있는 MAC 주소를 참조하면 된다. 여러가지 MAC 주소가 나오는데 나머지들은 다른 방식의 통신을 위해 가상으로 만들어진 주소들이라고만 이해해도 된다.

맥의 경우 ifconfig 커맨드를 활용하는데 결과가 많이 나오니 | grep inet 을 통해 필요한 정보만 좁혀보면 MAC 주소를 확인할 수 있다.

마치며

빅데이터 시스템을 다루든 다른 어떤 시스템을 다루든 컴퓨터들은 연결되어 있고 연결된 상태에서 네트워크는 지나칠 수 없는 요소이다. 네트워크 담당자가 아니더라도 연결된 시스템에서 개발을 하고 있는 한 관련 문제들에 부딪히고 직접 점검해야 할 경우가 생긴다. 완벽히 알지 못해도 어느 정도 맥락을 알면 그 상황에서 무엇이 문제이고 무엇을 요청해야하는 지 알기 때문에 이런 문제로 허비하는 시간을 줄일 수 있을 것이다.

ip 주소의 형식, 서브넷 마스크, OSI 7계층 등 네트워크에 대한 복잡한 개념은 설명하지 않았다. 많은 복잡한 개념들이 있지만 가볍게는 서로 다른 기기 간의 통신을 위해 여러가지 방법으로 고유한 값을 만들고 통신하기 위한 표준을 맞춘 노력들이라고 생각해주면 좋을 것 같다.

이외에 네트워크에 대한 자세한 내용이 궁금하다면 참조 링크들을 통해 알아보자. 유튜브에 FREE CCNA // What is a Network? // Day 0 를 보면 네트워크에 대해 이해하기 쉽게 잘 설명해 주었다. 다 보지는 못했지만 Computer Networking Complete Course - Beginner to Advanced 라는 5시간 짜리 영상이 있다. 긴 영상 임에도 180만뷰나 되는 것을 보면 끝까지 봤을 때 네트워크에 대한 이해도를 많이 키울 수 있을 것이라 생각한다.

References

Leave a comment