# 프록시 점프 및 점프 호스트

#### 프록시 점프 개념

프록시 점프(Proxy Jump)는 클라이언트가 직접 원격 서버에 연결하지 않고, 중간의 한 개 이상의 중계 서버를 통해 간접적으로 접속하는 방법이다. 이러한 방식은 네트워크 환경에 따라 보안을 강화하거나 네트워크 접근을 제한해야 하는 상황에서 매우 유용하다. `ProxyJump` 설정을 통해 SSH 연결 시 중계 서버를 사용해 원격 서버에 안전하게 연결할 수 있다.

프록시 점프는 보통 다음과 같은 상황에서 사용된다:

* 직접적인 SSH 접속이 불가능한 서버에 접근해야 하는 경우.
* 네트워크 보안 정책 상에서 중간 서버를 통해서만 원격 서버에 접근 가능한 경우.
* 외부에서 내부 네트워크로의 접근을 보호해야 할 때.

#### 기본 사용법

프록시 점프 기능은 SSH 버전 7.3부터 기본 제공되며, `ProxyJump` 옵션을 사용하여 설정할 수 있다. `ssh` 명령어에서 프록시 점프를 사용하려면 다음과 같이 설정한다:

```bash
ssh -J 중계서버 사용자@원격서버
```

위의 명령어에서:

* `-J` 옵션은 ProxyJump를 의미하며, 중계 서버(점프 호스트)를 지정한다.
* `중계서버`는 클라이언트가 처음 연결하는 서버이다.
* `사용자@원격서버`는 최종 목적지인 원격 서버를 나타낸다.

예를 들어, 중계 서버 `proxy.example.com`을 통해 `user@target.example.com`에 접속하려면 다음과 같은 명령어를 사용한다:

```bash
ssh -J proxy.example.com user@target.example.com
```

이 명령어는 `proxy.example.com` 서버를 거쳐 `target.example.com` 서버에 접속하게 된다.

#### 점프 호스트의 설정

점프 호스트(Jump Host)는 클라이언트가 원격 서버에 접근할 때 중계 역할을 하는 서버이다. 이를 통해 외부에서 내부 네트워크로 직접적인 접근을 제한하고, 보안을 강화할 수 있다. 점프 호스트는 보통 방화벽 역할을 수행하며, 내부 네트워크에 대한 액세스 제어를 수행한다.

점프 호스트를 설정할 때는 `~/.ssh/config` 파일에서 설정을 지정할 수 있다. 예를 들어, 특정 호스트에 대해 점프 호스트를 사용하려면 다음과 같이 설정한다:

```bash
Host target.example.com
  ProxyJump proxy.example.com
```

이렇게 설정하면 `target.example.com`에 접속할 때 자동으로 `proxy.example.com`을 거쳐 연결하게 된다.

#### 여러 개의 점프 호스트 사용

여러 중계 서버를 거쳐 최종 목적지에 도달해야 할 경우에도 `ProxyJump` 옵션을 사용할 수 있다. 이때는 중계 서버들을 콤마(,)로 구분하여 나열한다:

```bash
ssh -J 중계서버1,중계서버2 사용자@원격서버
```

여러 개의 중계 서버를 사용할 경우, 각각의 중계 서버에서 SSH 접속이 가능해야 한다. 예를 들어, `proxy1.example.com`과 `proxy2.example.com`을 거쳐 `user@target.example.com`에 접속하려면 다음과 같은 명령어를 사용한다:

```bash
ssh -J proxy1.example.com,proxy2.example.com user@target.example.com
```

이 방식은 여러 네트워크를 거쳐야 하는 복잡한 환경에서 매우 유용하다. 다만, 중계 서버의 수가 많아질수록 성능에 영향을 줄 수 있으므로 필요한 경우에만 사용해야 한다.

#### ProxyCommand를 사용한 프록시 점프

프록시 점프를 설정하는 또 다른 방법은 `ProxyCommand`를 사용하는 것이다. 이 방법은 `ProxyJump`가 지원되지 않는 SSH 클라이언트나 버전에서 유용하게 사용된다. `ProxyCommand`는 SSH 클라이언트가 어떻게 원격 서버에 연결할지를 지정하는 데 사용된다.

```bash
Host target.example.com
  ProxyCommand ssh 중계서버 nc %h %p
```

위의 설정에서:

* `ProxyCommand`는 SSH 명령어를 사용하여 중계 서버를 통해 원격 서버에 접속할 수 있도록 명령어를 지정한다.
* `nc`는 netcat 명령어로, 중계 서버를 통해 원격 서버의 호스트(%h)와 포트(%p)로 연결한다.

이 방식은 `ProxyJump`보다 조금 더 복잡하지만, 네트워크 상황에 따라 더 세밀한 제어가 필요할 때 유용하다.

#### 프록시 점프와 보안 고려 사항

프록시 점프는 네트워크 보안을 강화하는 데 도움을 줄 수 있지만, 점프 호스트를 통해 데이터가 전송되기 때문에 그 과정에서 발생할 수 있는 보안 문제를 고려해야 한다. 이를 해결하기 위해 몇 가지 보안 측면을 살펴보자.

**1. 각 점프 호스트에 대한 SSH 키 설정**

프록시 점프를 사용할 때 각 중계 서버(점프 호스트)에 대한 보안 인증을 관리하는 것이 중요하다. 모든 점프 호스트는 개별적으로 SSH 키 인증을 사용해야 하며, 비밀번호 인증을 비활성화하는 것이 좋다. 다음 명령어를 사용하여 각 호스트에 SSH 키를 배포할 수 있다:

```bash
ssh-copy-id 사용자@중계서버
```

이 명령어는 사용자의 공개 키를 중계 서버에 배포하여 비밀번호 없이 인증할 수 있도록 한다.

**2. SSH 터널링과의 차이점**

프록시 점프는 중계 서버를 통해 직접 원격 서버에 접속하는 반면, SSH 터널링은 데이터를 암호화된 통로로 전달하는 방식이다. 프록시 점프는 단순한 접속 방식이지만, SSH 터널링은 데이터를 보안적으로 전달하는 데 중점을 둔다. 예를 들어, 로컬 포트 포워딩을 통해 데이터 전송을 암호화할 수 있으며, 이러한 방식은 보안이 중요한 애플리케이션에서 자주 사용된다.

#### 점프 호스트와 SSH 에이전트 포워딩

점프 호스트를 사용할 때 SSH 에이전트 포워딩(Agent Forwarding)을 설정하면 프라이빗 키를 중계 서버로 전달하지 않고도 인증이 가능하다. 이를 위해 SSH 에이전트를 사용하여 로컬에서 한 번 인증한 키를 점프 호스트에서도 사용할 수 있도록 한다. 에이전트 포워딩은 SSH 에이전트가 시작된 세션에 한해서만 적용되므로, 프라이빗 키가 서버에 저장되지 않는다.

SSH 에이전트 포워딩을 활성화하려면 `-A` 옵션을 사용한다:

```bash
ssh -A 사용자@중계서버
```

이후 중계 서버에서 최종 원격 서버로 접속할 때 프라이빗 키 없이도 접속이 가능하다. 예를 들어, 다음과 같이 에이전트 포워딩을 사용하여 점프 호스트를 거쳐 원격 서버에 접속할 수 있다:

```bash
ssh -A -J 중계서버 사용자@원격서버
```

#### 수학적 설명: 네트워크 경로와 시간 지연

점프 호스트를 사용하면 네트워크 경로가 길어지면서 통신 속도에 영향을 미칠 수 있다. 이를 모델링하기 위해 네트워크 경로와 관련된 시간 지연을 수학적으로 표현할 수 있다. 점프 호스트를 여러 개 사용할 때 네트워크 지연 시간은 각각의 호스트에서 발생하는 지연 시간을 합산한 값이다.

각 점프 호스트에서의 지연 시간을 $t\_1, t\_2, \ldots, t\_n$으로 표현할 수 있다. 그렇다면 전체 지연 시간 $T$는 다음과 같이 표현된다:

$$
T = t\_1 + t\_2 + \cdots + t\_n
$$

여기서 $t\_i$는 각 점프 호스트에서의 지연 시간을 나타내며, 이는 네트워크 상태에 따라 다를 수 있다.

특히, 여러 개의 점프 호스트를 사용할 때 발생하는 총 지연 시간 $T$는 개별 지연 시간들의 합으로 구성된다. 예를 들어, 첫 번째 점프 호스트에서 $t\_1 = 10 , \text{ms}$, 두 번째에서 $t\_2 = 20 , \text{ms}$, 세 번째에서 $t\_3 = 15 , \text{ms}$의 지연 시간이 발생한다면 총 지연 시간은 다음과 같다:

$$
T = 10 , \text{ms} + 20 , \text{ms} + 15 , \text{ms} = 45 , \text{ms}
$$

지연 시간이 클수록 연결 성능에 부정적인 영향을 미칠 수 있으므로, 점프 호스트의 수와 네트워크 환경을 고려해야 한다.
