# iptables와 OpenSSH 설정

#### iptables 기본 개념

**iptables**는 리눅스 기반 시스템에서 네트워크 패킷 필터링을 수행하는 도구로, 방화벽 역할을 담당한다. 이를 통해 특정 IP 주소나 포트에 대한 접근을 허용하거나 차단할 수 있다. **OpenSSH**는 주로 포트 22번을 사용하여 SSH 연결을 제공하므로, 이를 기반으로 방화벽에서 접근 제어를 설정해야 한다.

**iptables**의 주요 기능은 다음과 같다:

* **INPUT**: 외부에서 시스템으로 들어오는 트래픽을 제어
* **OUTPUT**: 시스템에서 외부로 나가는 트래픽을 제어
* **FORWARD**: 네트워크를 통해 경유하는 트래픽을 제어

**기본 명령어**

`iptables` 명령어는 크게 세 가지 동작을 수행한다:

* **체인 설정**: 특정 패킷이 어떤 조건을 만족할 때 수행할 동작 정의
* **정책 설정**: 기본적으로 허용 또는 차단할 트래픽의 범위를 설정
* **규칙 관리**: 특정 IP 주소, 포트, 프로토콜에 따라 세부적인 규칙 추가 또는 삭제

예를 들어, 아래 명령어는 SSH 포트 22번을 허용하는 가장 간단한 설정을 보여준다:

```bash
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
```

이 명령은 `INPUT` 체인에 대해 TCP 프로토콜을 사용하여 포트 22로 들어오는 트래픽을 허용한다. 여기서 `-A`는 규칙을 추가하는 옵션, `-p`는 프로토콜 지정, `--dport`는 대상 포트를 지정하는 옵션이다.

#### OpenSSH에 대한 iptables 설정

OpenSSH의 보안을 강화하기 위해 **iptables**를 사용하여 다음과 같은 규칙을 적용할 수 있다:

* **특정 IP에서만 SSH 접근 허용**
* **기본 포트가 아닌 다른 포트에서 SSH 서비스 제공**
* **SSH 브루트 포스 공격 방어**

**특정 IP에서만 SSH 접근 허용**

특정 IP에서만 SSH 접근을 허용하고 나머지는 차단하려면 다음 명령을 사용할 수 있다:

```bash
iptables -A INPUT -p tcp -s <허용할 IP> --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
```

첫 번째 명령은 `<허용할 IP>` 주소에서 오는 트래픽에 대해 포트 22번 접근을 허용하는 규칙을 추가한다. 두 번째 명령은 그 외의 모든 IP에서 포트 22번에 대한 접근을 차단한다.

**기본 포트가 아닌 다른 포트에서 SSH 서비스 제공**

기본적으로 SSH는 포트 22를 사용하지만, 보안을 강화하기 위해 다른 포트를 사용하여 SSH 연결을 설정할 수 있다. 예를 들어, 포트 2222번을 사용하려면 다음과 같이 설정한다:

1. `/etc/ssh/sshd_config` 파일에서 포트를 변경한다:

```bash
Port 2222
```

2. **iptables**에서 새로운 포트를 허용하는 규칙을 추가한다:

```bash
iptables -A INPUT -p tcp --dport 2222 -j ACCEPT
```

이렇게 하면 포트 2222를 사용하여 SSH 연결을 허용하게 된다. 기본 포트 22에 대한 접근을 차단하려면 다음 명령을 사용한다:

```bash
iptables -A INPUT -p tcp --dport 22 -j DROP
```

#### SSH 브루트 포스 공격 방어

SSH 브루트 포스 공격은 비밀번호를 무작위로 시도해 SSH 서버에 접근하려는 시도로, 이를 방지하기 위해 **iptables**와 함께 다양한 방법을 적용할 수 있다. **iptables**를 사용하여 특정 시간 내에 일정 횟수 이상의 접속 시도를 차단하는 방법이 효과적이다.

다음은 SSH 포트에 대해 초당 3회 이상의 접속 시도를 차단하는 규칙이다:

```bash
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 3 -j DROP
```

이 설정은 다음과 같은 방식으로 동작한다:

* 첫 번째 명령은 새로운 연결이 발생할 때, 해당 IP 주소를 기록한다 (`--set`).
* 두 번째 명령은 해당 IP가 60초 이내에 3회 이상의 새로운 연결을 시도하면 차단한다 (`--hitcount 3`).

이 방법을 통해 동일한 IP 주소로부터의 다수의 접속 시도를 방어할 수 있다.

#### 특정 포트에서 SSH 트래픽 리디렉션

기본적으로 SSH는 포트 22를 사용한다. 그러나, 보안 강화를 위해 특정 포트로 SSH 트래픽을 리디렉션할 수 있다. 예를 들어, 외부에서 8080번 포트를 사용하여 SSH로 연결한 후, 이를 내부적으로 22번 포트로 리디렉션하려면 다음 명령을 사용할 수 있다:

```bash
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j REDIRECT --to-port 22
```

이 규칙은 외부에서 들어오는 8080번 포트로의 연결을 내부적으로 22번 포트로 리디렉션한다.

#### 특정 사용자 접근 제한

**iptables**는 IP 주소뿐만 아니라 특정 사용자에 대해서도 접근을 제한할 수 있다. 만약 특정 사용자만 SSH에 접근하도록 설정하려면, 아래와 같이 설정할 수 있다:

```bash
iptables -A INPUT -p tcp -m owner --uid-owner <사용자 ID> --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
```

여기서 `<사용자 ID>`는 SSH에 접근할 수 있도록 허용된 사용자의 ID이다. 이 설정은 해당 사용자의 프로세스만 포트 22에 접근할 수 있도록 허용하고, 나머지는 차단한다.

#### iptables 규칙 저장 및 복구

**iptables**를 통해 설정한 규칙은 서버가 재부팅될 경우 사라진다. 따라서 설정한 규칙을 저장하고, 서버가 다시 시작되었을 때 복원하는 과정이 필요하다.

**규칙 저장**

Debian 및 Ubuntu 계열에서는 `iptables-save` 명령을 사용하여 규칙을 저장할 수 있다:

```bash
iptables-save > /etc/iptables/rules.v4
```

이 명령은 현재 설정된 iptables 규칙을 `/etc/iptables/rules.v4` 파일에 저장한다.

**규칙 복원**

서버가 재부팅된 후, 저장된 규칙을 복원하려면 `iptables-restore` 명령을 사용한다:

```bash
iptables-restore < /etc/iptables/rules.v4
```

이 명령은 저장된 규칙 파일을 로드하여 iptables 규칙을 다시 적용한다.

**자동 복구 설정**

규칙을 자동으로 복원하기 위해서는 `netfilter-persistent` 패키지를 사용할 수 있다. 이 패키지는 서버 부팅 시 규칙을 자동으로 복원한다:

```bash
sudo apt-get install netfilter-persistent
sudo netfilter-persistent save
```

이 설정을 통해 iptables 규칙이 서버 재부팅 후에도 유지되도록 할 수 있다.
