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번을 사용하려면 다음과 같이 설정한다:
/etc/ssh/sshd_config
파일에서 포트를 변경한다:
Port 2222
- 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 규칙이 서버 재부팅 후에도 유지되도록 할 수 있다.