KeepAlive 설정
KeepAlive
는 클라이언트와 서버 사이의 연결 상태를 유지하기 위한 설정이다. SSH 세션에서 클라이언트가 오랫동안 아무런 데이터를 전송하지 않을 때도 연결이 유지되도록 설정할 수 있으며, 기본적으로 SSH는 KeepAlive 패킷을 주기적으로 전송하여 연결이 여전히 활성화 상태인지 확인한다.
KeepAlive의 역할
KeepAlive 패킷은 네트워크 연결이 끊겼는지 확인하는 데 사용된다. 네트워크가 끊겼거나, 방화벽에서 비활성화된 연결을 종료하려는 경우, KeepAlive 패킷은 SSH 세션이 여전히 유효한지 여부를 판단하는 데 중요한 역할을 한다. 이 설정이 없으면 장시간의 유휴 세션 동안 연결이 끊겼는지 감지할 수 없다.
KeepAlive 설정 방법
/etc/ssh/sshd_config
파일에서 ClientAliveInterval
과 ClientAliveCountMax
설정을 통해 KeepAlive 동작을 제어할 수 있다.
-
ClientAliveInterval: 서버에서 클라이언트로 KeepAlive 메시지를 보내는 간격(초)이다. 기본값은 0이며, 이는 KeepAlive 패킷을 보내지 않는다는 의미이다. 예를 들어, 60초로 설정하면, 60초마다 서버가 클라이언트로 KeepAlive 패킷을 보낸다.
-
ClientAliveCountMax: KeepAlive 패킷을 보낸 후 클라이언트가 응답하지 않는 최대 횟수이다. 이 횟수를 넘으면 서버는 연결을 종료한다. 기본값은 3이다. 예를 들어,
ClientAliveInterval
이 60이고,ClientAliveCountMax
가 3이면, 클라이언트가 3번의 KeepAlive 패킷에 응답하지 않으면 서버가 연결을 종료한다.
ClientAliveInterval 60
ClientAliveCountMax 3
위의 설정은 60초마다 클라이언트로 KeepAlive 패킷을 보내며, 클라이언트가 3번의 KeepAlive 패킷에 응답하지 않으면 연결이 끊깁니다.
TCPKeepAlive 설정
TCPKeepAlive
는 SSH 프로토콜 자체가 아닌 TCP 레벨에서 연결을 유지하는 데 사용되는 옵션이다. 기본적으로 활성화되어 있으며, 서버와 클라이언트 간의 물리적 연결 상태를 확인하기 위한 목적이다. TCPKeepAlive는 운영 체제의 TCP 스택에 의존하여 연결 상태를 확인한다.
TCPKeepAlive의 역할
TCPKeepAlive는 네트워크 장비나 방화벽이 오랫동안 유휴 상태로 남아있는 TCP 연결을 끊지 않도록 방지하는 데 사용된다. 일반적으로 방화벽은 특정 시간 동안 트래픽이 없는 연결을 자동으로 종료하는데, TCPKeepAlive 설정을 통해 이를 방지할 수 있다.
TCPKeepAlive 설정 방법
TCPKeepAlive
는 클라이언트와 서버 양쪽에서 설정할 수 있으며, /etc/ssh/sshd_config
파일에 다음과 같이 설정할 수 있다.
TCPKeepAlive yes
위와 같이 설정하면 TCPKeepAlive 패킷이 주기적으로 전송되어 TCP 레벨에서 연결 상태를 확인하게 된다. KeepAlive와 달리 TCPKeepAlive는 네트워크 장비에서의 연결 상태를 확인하는 데 중점을 두며, TCP 스택 자체에서 이루어지므로 더 낮은 레벨의 연결 상태를 모니터링한다.
KeepAlive와 TCPKeepAlive는 둘 다 설정 가능하며, 특정 네트워크 환경에서 하나의 설정이 더 효과적일 수 있다.
TCPKeepAlive와 KeepAlive의 차이점
KeepAlive와 TCPKeepAlive는 연결 상태를 유지하는 방식이 다르다. KeepAlive는 SSH 프로토콜 레벨에서 작동하며, SSH 서버와 클라이언트 사이의 상위 레벨에서 연결 상태를 확인한다. 반면, TCPKeepAlive는 TCP 레벨에서 작동하며, 운영 체제의 TCP 스택에서 네트워크 연결 상태를 모니터링한다.
- KeepAlive: SSH 프로토콜 레벨에서 클라이언트와 서버 간의 연결 상태를 주기적으로 확인하며, 네트워크 상태뿐만 아니라 SSH 세션의 유휴 상태를 감지한다.
- TCPKeepAlive: TCP 프로토콜 레벨에서 연결을 확인하며, 네트워크 장비나 방화벽과의 연결을 유지하는 데 초점을 둔다.
차이점 요약
- 동작 레벨: KeepAlive는 애플리케이션 레벨(SSH), TCPKeepAlive는 네트워크 레벨(TCP).
- 목적: KeepAlive는 SSH 세션의 유휴 상태를 확인하고 연결을 유지하려는 목적, TCPKeepAlive는 TCP 연결 자체를 유지하려는 목적.
- 기본 설정: TCPKeepAlive는 기본적으로 활성화되어 있으며, KeepAlive는 기본적으로 비활성화되어 있을 수 있음.
KeepAlive 및 TCPKeepAlive 설정의 상호작용
두 설정을 모두 활성화하면, SSH 세션에서 KeepAlive는 애플리케이션 레벨에서 클라이언트와 서버 간의 상호작용을 확인하며, TCPKeepAlive는 네트워크 레벨에서 물리적인 연결을 확인한다. 두 설정은 독립적이므로, 하나만 활성화할 수도 있고, 둘 다 활성화할 수도 있다. 이를 통해 특정 네트워크 환경에서 더 안정적인 연결 상태를 유지할 수 있다.
설정 예시
네트워크 환경에 따라, 두 설정을 동시에 사용하는 경우도 흔한다. 예를 들어, 다음과 같이 두 설정을 활성화할 수 있다.
ClientAliveInterval 60
ClientAliveCountMax 3
TCPKeepAlive yes
이 설정은 SSH 세션의 KeepAlive 패킷을 60초 간격으로 전송하며, 클라이언트가 3번 응답하지 않으면 연결을 종료한다. 동시에, TCPKeepAlive도 활성화되어 있으므로, TCP 레벨에서도 연결 상태를 모니터링한다.
KeepAlive 및 TCPKeepAlive 설정의 성능 영향
두 설정 모두 연결을 유지하는 데 중요한 역할을 하지만, 성능에 영향을 줄 수 있다. KeepAlive는 주기적으로 패킷을 전송하므로, 빈번한 네트워크 트래픽이 발생할 수 있다. 특히 많은 SSH 세션이 동시에 열려 있는 서버에서는 KeepAlive 패킷이 서버에 부하를 줄 수 있다.
- KeepAlive 성능: 높은 빈도의 KeepAlive 패킷 전송은 네트워크 트래픽을 증가시키고, 서버의 리소스를 더 많이 소모할 수 있다. 따라서
ClientAliveInterval
을 너무 짧게 설정하는 것은 피하는 것이 좋다. - TCPKeepAlive 성능: TCPKeepAlive는 운영 체제의 TCP 스택에서 작동하므로 상대적으로 성능에 미치는 영향이 적다. 하지만 네트워크 장비나 방화벽에서 연결을 유지하는 데 필요한 주기적인 트래픽이 발생할 수 있다.