연결 유지 및 재시도 설정
OpenSSH에서 연결 유지와 재시도 설정은 네트워크가 불안정하거나 장시간 연결을 유지해야 하는 상황에서 중요한 역할을 한다. 기본적으로 SSH 연결은 클라이언트와 서버 사이에 지속적으로 트래픽이 없으면 끊어질 수 있다. 이를 방지하기 위해 KeepAlive와 TCPKeepAlive와 같은 설정을 사용할 수 있다. 또한, 연결 실패 시 자동으로 재시도하도록 설정하는 방법도 있다.
KeepAlive 설정
SSH 연결을 유지하기 위한 가장 기본적인 설정은 KeepAlive 옵션이다. 이 옵션은 클라이언트가 서버로 일정 주기마다 패킷을 전송하여 연결 상태를 확인하도록 한다. 이 과정을 통해, 만약 연결이 끊기거나 네트워크가 일시적으로 불안정해질 경우에도 재연결을 시도할 수 있다.
SSH의 KeepAlive 설정은 ServerAliveInterval 및 ServerAliveCountMax 두 가지 파라미터로 제어된다.
-
ServerAliveInterval
: 클라이언트가 서버로 패킷을 보내는 간격을 설정한다. 기본 값은 0이며, 이 경우 KeepAlive 패킷이 전송되지 않는다. 예를 들어,ServerAliveInterval 60
이라고 설정하면 클라이언트는 60초마다 서버로 패킷을 전송한다. -
ServerAliveCountMax
: 서버에서 응답이 없을 경우 클라이언트가 연결을 종료하기 전에 몇 번의 KeepAlive 패킷을 보낼지를 설정한다. 예를 들어,ServerAliveCountMax 3
이라면, 서버가 3번의 KeepAlive 요청에 응답하지 않으면 클라이언트는 연결을 종료한다.
이 설정들은 클라이언트 측의 SSH 설정 파일인 ~/.ssh/config
파일에 다음과 같이 설정할 수 있다.
Host *
ServerAliveInterval 60
ServerAliveCountMax 3
TCPKeepAlive 설정
TCPKeepAlive는 전송 계층에서의 KeepAlive 설정이다. 이는 TCP 수준에서 서버로 KeepAlive 패킷을 보내는 방식으로, 서버의 상태를 확인하는 데 사용된다. 이 설정은 OS 레벨에서 관리되며, 기본적으로 SSH는 이 기능을 활성화한다.
-
TCPKeepAlive가 활성화되어 있으면, 네트워크 단절이나 라우터의 문제 등으로 인해 연결이 끊겼을 때 TCP 계층에서 이를 감지하여 연결을 종료하게 된다.
-
만약 이 옵션을 비활성화하면 TCPKeepAlive 패킷이 전송되지 않으므로, OS가 연결 상태를 확인하지 않는다. 따라서 네트워크 연결이 끊겨도 클라이언트가 이를 인식하는 데 시간이 오래 걸릴 수 있다.
클라이언트 측에서는 TCPKeepAlive
옵션을 사용하여 설정을 변경할 수 있다.
Host *
TCPKeepAlive yes
재시도 설정
OpenSSH는 네트워크 연결이 불안정하거나 끊어졌을 때 자동으로 재시도하도록 설정할 수 있다. 이를 위해 ConnectTimeout 및 ConnectionAttempts와 같은 파라미터를 사용할 수 있다.
-
ConnectTimeout
: SSH 클라이언트가 서버에 연결을 시도할 때 대기하는 시간을 설정한다. 기본값은 0이며, 이는 무기한 대기하는 것을 의미한다. 예를 들어,ConnectTimeout 10
으로 설정하면 클라이언트는 서버 연결 시 10초 동안 대기한 후 타임아웃을 발생시킨다. -
ConnectionAttempts
: SSH 클라이언트가 서버 연결을 시도하는 횟수를 설정한다. 기본값은 1이며, 예를 들어ConnectionAttempts 3
으로 설정하면 클라이언트는 최대 3번 서버 연결을 시도한다.
이 설정들은 클라이언트 측 SSH 설정 파일에 다음과 같이 적용할 수 있다.
Host *
ConnectTimeout 10
ConnectionAttempts 3
수식 적용
네트워크 유지와 재시도에서 특정 매개변수들을 사용한 시간 경과에 따른 연결 상태를 수식으로 나타낼 수 있다. 예를 들어, ServerAliveInterval
이 주기적으로 서버로 패킷을 보내는 주기를 수식으로 나타내면 다음과 같다.
여기서 T_{\text{alive}}는 KeepAlive 패킷 전송 주기, n은 패킷을 전송한 횟수, \Delta t는 ServerAliveInterval
로 설정된 시간 간격을 의미한다. KeepAlive 패킷이 전송되지 않을 경우 n = 0이며, 기본적으로 연결은 끊기게 된다.
또한, 재시도 횟수는 아래와 같이 나타낼 수 있다.
여기서 T_{\text{retry}}는 재시도에 소요된 총 시간, t_i는 각 시도에 소요된 시간, N은 ConnectionAttempts
로 설정된 최대 시도 횟수를 나타낸다.
연결 유지와 재시도의 상호작용
연결 유지 및 재시도 설정에서 중요한 점은 이 두 설정이 서로 상호작용한다는 것이다. 만약 ServerAliveInterval
이 짧게 설정되고 ConnectionAttempts
가 낮게 설정되면, 서버가 일시적으로 응답하지 않을 경우 클라이언트는 빠르게 연결을 종료하고 다시 시도할 수 있다.
하지만, ServerAliveInterval
이 길게 설정되고 ConnectionAttempts
가 높게 설정되면 클라이언트는 서버가 응답하지 않는 상태에서도 연결을 유지하려고 할 것이다. 이는 서버가 일시적으로 응답하지 않더라도 연결을 안정적으로 유지하는 데 도움이 되지만, 연결 복구가 지연될 수 있다는 단점이 있다.
따라서, 네트워크 환경에 따라 적절한 값을 설정하는 것이 중요하다. 예를 들어, 네트워크 연결이 자주 불안정한 환경에서는 다음과 같이 설정할 수 있다.
ServerAliveInterval
: 30초ServerAliveCountMax
: 2ConnectionAttempts
: 5ConnectTimeout
: 5초
이 설정은 클라이언트가 서버로 패킷을 30초 간격으로 보내며, 서버가 응답하지 않을 경우 두 번의 시도를 더한 후 연결을 종료한다. 동시에 클라이언트는 서버 연결을 5초 동안 시도하며, 최대 5번의 연결 시도가 이루어진다.
연결 상태 유지 수식 확장
위에서 다룬 기본적인 수식을 확장하여, ServerAliveCountMax
와 같은 설정을 포함할 수 있다. 서버가 응답하지 않는 상태에서 클라이언트가 보낼 수 있는 KeepAlive 패킷의 최대 횟수는 아래와 같이 표현된다.
여기서 N_{\text{max}}는 서버 응답이 없는 상태에서 클라이언트가 보낼 수 있는 최대 KeepAlive 패킷의 수를 나타내며, T_{\text{timeout}}는 서버가 응답하지 않을 때의 최대 대기 시간, \Delta t는 ServerAliveInterval
로 설정된 시간 간격이다.
재시도와 관련된 시간 지연도 다음과 같은 수식으로 표현할 수 있다.
여기서 T_{\text{delay}}는 재시도 시 클라이언트가 연결을 기다리는 총 시간을 나타내며, N은 ConnectionAttempts
에 의해 설정된 최대 시도 횟수, t_{\text{retry}}는 각 시도 사이의 지연 시간을 의미한다.
예제 코드
다음은 OpenSSH에서 ServerAliveInterval
및 ServerAliveCountMax
를 설정하는 간단한 예제다.
Host *
ServerAliveInterval 30
ServerAliveCountMax 2
ConnectTimeout 5
ConnectionAttempts 5
이 설정은 SSH 연결 유지 및 재시도와 관련된 주요 파라미터들을 정의하며, 클라이언트와 서버 간의 연결이 끊기지 않도록 유지하는 데 도움을 준다. 특히, 재시도 설정을 통해 클라이언트가 서버 연결을 다시 시도하는 빈도를 제어할 수 있다.