iptables 기본 개념

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

iptables의 주요 기능은 다음과 같다: - INPUT: 외부에서 시스템으로 들어오는 트래픽을 제어 - OUTPUT: 시스템에서 외부로 나가는 트래픽을 제어 - FORWARD: 네트워크를 통해 경유하는 트래픽을 제어

기본 명령어

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

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

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 접근을 허용하고 나머지는 차단하려면 다음 명령을 사용할 수 있다:

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 파일에서 포트를 변경한다:
Port 2222
  1. iptables에서 새로운 포트를 허용하는 규칙을 추가한다:
iptables -A INPUT -p tcp --dport 2222 -j ACCEPT

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

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

SSH 브루트 포스 공격 방어

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

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

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번 포트로 리디렉션하려면 다음 명령을 사용할 수 있다:

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

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

특정 사용자 접근 제한

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

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 명령을 사용하여 규칙을 저장할 수 있다:

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

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

규칙 복원

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

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

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

자동 복구 설정

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

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

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