최근 리눅스에서 개발 중 특정 서버의 Rest API를 curl/wget으로 호출 시 timeout 에러가 발생한 적이 있습니다. 방화벽 문제를 의심했으나, ping은 가능한 상황입니다. 통신이 가능하므로 방화벽 외의 다른 문제가 있을 것이라고 의심하게 됐습니다.

결론

위의 경우 특정 port의 인바운드/아웃바운드 방화벽이 적용된 것이라고 먼저 의심해봅시다.

ping은 port를 사용하지 않는다

흔히 특정 port에 대해 통신 테스트를 할 경우 ping이 아니라 telnet을 사용합니다. ping은 port 옵션이 없기 때문입니다. 여기서 유추해볼 수 있는 것은 ping이 port를 사용하지 않는 통신 방식이라는 것입니다.

Protocol

curl은 HTTP, FTP, LDAP 등 어플리케이션 계층의 다양한 프로토콜을 지원합니다. 이들은 전송 계층(TCP/UDP)에 포함되며, well-known port 혹은 지정 port를 가지게 됩니다.

그에 비해, ping은 ICMP 프로토콜을 사용합니다. 이는 OSI 7 계층 모형에서 네트워크 계층에 해당하며, 전송 계층보다 상위에 존재하게 됩니다. 당연히 port를 사용하지 않으며, IP 기반으로 데이터 전송 기능을 수행합니다.

대표적인 라우팅 프로그램으로 traceroute(윈도우에선 tracert)가 있습니다. 이는 리눅스 기준으로 UDP 통신을 하는데, 옵션을 통해 ICMP 통신을 하도록 설정할 수 있습니다. 위 사례의 경우 traceroute 역시 통신 가능했을 것이라고 추측할 수 있겠습니다. 문제와 별개로, 기본 통신이 UDP인 이유와 차이점은 리눅스의 권한 특성을 고려한 것으로 생각됩니다.