# 포트 포워딩 (로컬, 원격, 동적)

OpenSSH의 포트 포워딩 기능은 원격 시스템과 통신할 때 중간 네트워크를 통하지 않고, 직접적이고 안전한 터널을 생성하여 포트나 서비스에 접근할 수 있게 해준다. 포트 포워딩은 주로 네트워크의 보안을 강화하거나 방화벽 뒤에 있는 서비스에 접근할 때 사용된다. OpenSSH에서 제공하는 포트 포워딩의 종류로는 로컬 포트 포워딩, 원격 포트 포워딩, 동적 포트 포워딩이 있다. 각 방식은 서로 다른 목적과 사용 사례에 따라 적용된다.

#### 로컬 포트 포워딩

로컬 포트 포워딩은 사용자의 로컬 시스템에서 특정 포트를 리디렉션하여 원격 시스템의 포트와 통신하게 하는 방식이다. 사용자는 로컬 시스템에서 마치 원격 서버에 직접 접속한 것처럼 특정 서비스를 사용할 수 있다. 이를 통해 외부 네트워크에 직접 노출되지 않은 서비스나 데이터베이스 등에도 접근이 가능한다.

예를 들어, 로컬 머신에서 포트 8080으로 들어오는 트래픽을 원격 서버의 포트 80으로 전달하는 상황을 생각해 봅시다. 이 경우 사용자는 로컬 시스템에서 `localhost:8080`에 접속하면, 실제로는 원격 서버의 웹 서버(포트 80)에 접속하게 된다.

**설정 명령어 예시**

```bash
ssh -L 8080:remote-server.com:80 user@remote-server.com
```

이 명령어는 로컬 포트 8080을 원격 서버 `remote-server.com`의 포트 80으로 포워딩한다. 로컬 포트 포워딩을 사용하여 여러 가지 네트워크 서비스에 안전하게 접근할 수 있다. 이를 활용하면 로컬 네트워크에 제한된 내부 서비스에 안전하게 접근하거나 방화벽 뒤에 있는 서비스를 이용할 수 있다.

#### 원격 포트 포워딩

원격 포트 포워딩은 원격 시스템에서 특정 포트로 들어오는 연결을 로컬 시스템으로 리디렉션하는 방식이다. 이를 통해 사용자는 원격 서버에서 특정 포트로 들어오는 트래픽을 자신의 로컬 시스템으로 안전하게 전달받을 수 있다.

예를 들어, 원격 서버의 포트 8080을 로컬 시스템의 포트 80으로 리디렉션한다고 가정한다. 이를 설정하면 원격 서버에서 `remote-server.com:8080`으로 들어오는 요청이 로컬 시스템의 웹 서버(포트 80)로 전달된다.

**설정 명령어 예시**

```bash
ssh -R 8080:localhost:80 user@remote-server.com
```

이 명령어는 원격 서버의 포트 8080을 로컬 시스템의 포트 80으로 포워딩하는 것을 설정한다. 원격 포트 포워딩은 로컬에서 제공하는 서비스를 원격 네트워크에서도 사용할 수 있도록 해주는 매우 유용한 기능이다.

#### 동적 포트 포워딩

동적 포트 포워딩은 SOCKS 프록시를 통해 여러 포트의 트래픽을 동적으로 전달하는 방식이다. 이 방법은 프록시 서버를 사용하여 네트워크 요청을 리디렉션하거나 방화벽을 우회할 때 유용하다. 동적 포트 포워딩을 사용하면 사용자의 로컬 머신에서 다양한 목적지로 트래픽을 보낼 수 있는 동적 프록시 역할을 하게 된다.

동적 포트 포워딩은 로컬 포트와 연결된 트래픽을 SOCKS5 프록시 서버로 전달한다. 이를 통해 여러 대상 서버와 포트로의 통신을 자동으로 처리할 수 있으며, 다양한 클라이언트 애플리케이션이 이 프록시를 통해 트래픽을 라우팅할 수 있다.

**동적 포트 포워딩 사용 예시**

```bash
ssh -D 1080 user@remote-server.com
```

이 명령어는 로컬 시스템의 포트 1080에 동적 포워딩을 설정하여 SOCKS5 프록시 서버를 생성한다. 이후 웹 브라우저나 다른 네트워크 클라이언트를 설정하여 이 프록시 서버를 사용하도록 구성하면, 모든 네트워크 요청이 자동으로 SSH 터널을 통해 안전하게 전달된다.

#### 동적 포트 포워딩의 활용

동적 포트 포워딩은 주로 네트워크 관리자가 방화벽을 우회하거나 특정 네트워크에 안전하게 접속할 때 사용된다. 또한, 제한된 네트워크 환경에서 외부 사이트에 접속할 수 있는 강력한 도구로 활용될 수 있다. 클라이언트 측에서 SOCKS 프록시 서버를 이용하여 연결을 설정하므로, 다양한 클라이언트 애플리케이션이 이 기능을 쉽게 이용할 수 있다.

동적 포트 포워딩을 활용하면 다음과 같은 기능을 제공받을 수 있다:

* 여러 포트를 자동으로 리디렉션하는 동적 터널링
* SOCKS 프록시를 통한 네트워크 보안 및 유연한 접속
* 방화벽 우회 및 외부 네트워크 접근

동적 포트 포워딩은 여러 포트와 프로토콜을 통해 복잡한 네트워크 구조에서도 간단하게 터널링을 구현할 수 있다.

#### 포트 포워딩과 방화벽의 상호작용

포트 포워딩을 사용할 때, 방화벽 규칙과의 상호작용도 중요한 부분이다. 특히, 네트워크 관리자들이 방화벽에서 허용하는 포트 및 IP 범위를 정확히 설정해야 하며, 허용되지 않은 포트에서의 접속을 차단하는 것이 일반적이다. 로컬, 원격, 동적 포트 포워딩 설정 시 방화벽 규칙을 적절히 조정하지 않으면 포트 포워딩이 제대로 작동하지 않을 수 있다.

이 때, 방화벽에서 허용하는 포트 번호를 사용하거나, 필요한 경우 포트 번호를 변경하여 사용하는 것도 유용하다. OpenSSH의 `sshd_config` 파일에서 `GatewayPorts` 설정을 통해 포트 포워딩을 보다 정교하게 제어할 수 있다.
