소개
iptables는 리눅스 배포판을 위한 소프트웨어 방화벽입니다. 이 치트 시트 스타일의 가이드는 흔한 일상 시나리오에서 유용한 방화벽 규칙을 생성하는 iptables 명령어에 대한 빠른 참조를 제공합니다. 이에는 포트, 네트워크 인터페이스 및 소스 IP 주소별로 다양한 서비스를 허용하거나 차단하는 iptables 예제가 포함됩니다.
이 가이드 사용 방법
- 여기에 설명된 대부분의 규칙은 iptables가 기본 입력 정책을 통해 들어오는 트래픽을 DROP으로 설정하고 들어오는 트래픽을 선택적으로 허용하려는 것을 가정합니다
- 어떤 섹션이 당신이 이루고자 하는 것에 적용되는지에 따라 해당 섹션을 사용하십시오. 대부분의 섹션은 다른 섹션을 가정하지 않으므로 아래의 예제를 독립적으로 사용할 수 있습니다
- 이 페이지의 오른쪽에 있는 내용 메뉴(넓은 페이지 폭에서) 또는 브라우저의 찾기 기능을 사용하여 필요한 섹션을 찾을 수 있습니다
- 주어진 명령줄 예제를 복사하여 붙여 넣으십시오. 강조된 값을 자신의 값으로 대체하십시오
규칙의 순서가 중요함을 기억하십시오. 이 모든 iptables
명령어는 새 규칙을 체인의 끝에 추가하기 위해 -A
옵션을 사용합니다. 규칙을 체인의 다른 위치에 놓고 싶다면 새 규칙의 위치를 지정할 수 있는 -I
옵션을 사용할 수 있습니다(또는 규칙 번호를 지정하지 않고 체인의 시작에 놓을 수 있습니다).
참고: 방화벽을 다룰 때 자신의 서버에서 SSH 트래픽(기본적으로 포트 22)을 차단하여 자체적으로 접근이 차단되지 않도록 주의하세요. 방화벽 설정으로 인해 액세스 권한을 잃게 되면 웹 기반 콘솔을 통해 액세스를 복구해야 할 수도 있습니다. DigitalOcean을 사용하는 경우 Recovery Console 제품 설명서를 참조하십시오. 콘솔을 통해 연결된 후 방화벽 규칙을 변경하여 SSH 액세스를 허용하거나 모든 트래픽을 허용할 수 있습니다. 저장된 방화벽 규칙이 SSH 액세스를 허용하면 다른 방법으로 서버를 다시 부팅하는 것입니다.
현재의 iptables 규칙 세트를 확인할 수 있는 명령어는 sudo iptables -S
및 sudo iptables -L
입니다.
이제 iptables 명령어를 살펴보겠습니다!
규칙 저장
iptables 규칙은 일시적입니다. 이는 부팅 후에도 지속되려면 수동으로 저장해야 합니다.
Ubuntu에서 iptables 규칙을 저장하는 한 가지 방법은 iptables-persistent
패키지를 사용하는 것입니다. 다음과 같이 apt를 사용하여 설치하세요:
설치 중에 현재 방화벽 규칙을 저장할지 묻는 메시지가 표시됩니다.
방화벽 규칙을 업데이트하고 변경 사항을 저장하려면 다음 명령을 실행하세요:
다른 리눅스 배포판에서는 iptables 변경 사항을 영구적으로 만드는 대체 방법을 가질 수 있습니다. 자세한 정보는 관련 문서를 참조하십시오.
규칙 나열 및 삭제
iptable 규칙을 나열하고 삭제하는 방법을 배우려면 다음 자습서를 확인하십시오: iptables 방화벽 규칙 나열 및 삭제 방법.
일반적으로 유용한 규칙
이 섹션에는 대부분의 서버에서 일반적으로 유용한 규칙을 생성하는 다양한 iptables 명령이 포함되어 있습니다.
루프백 연결 허용
루프백 인터페이스 또는 lo
라고도하는 것은 컴퓨터가 자체에 네트워크 연결을 전달하는 데 사용하는 것입니다. 예를 들어 ping localhost
또는 ping 127.0.0.1
을 실행하면 서버가 루프백을 사용하여 자체에 핑을 보냅니다. 루프백 인터페이스는 또한 응용 프로그램 서버를 localhost
주소로 데이터베이스 서버에 연결하도록 구성하는 경우에도 사용됩니다. 따라서 방화벽이 이러한 연결을 허용하도록하는 것이 좋습니다.
루프백 인터페이스에서 모든 트래픽을 수락하려면 다음 명령을 실행하십시오:
수락되고 관련된 수신 연결 허용
일반적으로 네트워크 트래픽은 제대로 작동하려면 양방향(수신 및 송신)이 필요하므로 서버 자체에서 시작된 연결에 대한 리턴 트래픽을 허용하는 방화벽 규칙을 만드는 것이 일반적입니다. 이 명령은 그것을 허용할 것입니다:
수락된 아웃바운드 연결 허용
다음 명령어를 사용하여 일반적으로 정당한 들어오는 연결에 대한 응답인 모든 확립된 연결의 외부 트래픽을 허용할 수 있습니다:
내부 네트워크가 외부에 액세스할 수 있도록 허용하기
eth0
이 외부 네트워크이고 eth1
이 내부 네트워크인 경우, 다음은 내부 네트워크가 외부에 액세스할 수 있게 합니다:
유효하지 않은 패킷 삭제하기
일부 네트워크 트래픽 패킷은 유효하지 않음으로 표시될 수 있습니다. 때로는 이 유형의 패킷을 기록하는 것이 유용할 수 있지만 종종 그냥 삭제하는 것이 좋습니다. 다음 명령어를 사용하여 삭제하세요:
IP 주소 차단하기
특정 IP 주소(예: 203.0.113.51
)에서 시작되는 네트워크 연결을 차단하려면 다음 명령어를 실행하세요:
이 예에서 -s 203.0.113.51
은 “203.0.113.51”의 출발지 IP 주소를 지정합니다. 출발지 IP 주소는 허용 규칙을 포함한 모든 방화벽 규칙에서 지정할 수 있습니다.
연결을 거부하려면 대신 “DROP”을 “REJECT”로 바꿔서 연결 요청에 “연결 거부” 오류로 응답하는 것이 좋습니다:
네트워크 인터페이스로의 연결 차단
특정 IP 주소(예: 203.0.113.51
)에서 특정 네트워크 인터페이스(예: eth0
)로의 연결을 차단하려면 다음 명령을 사용합니다:
이전 예제와 동일하지만 -i eth0
이 추가되었습니다. 네트워크 인터페이스는 모든 방화벽 규칙에서 지정할 수 있으며 특정 네트워크로 규칙을 제한하는 좋은 방법입니다.
서비스: SSH
로컬 콘솔이 없는 서버를 사용하는 경우 서버로의 SSH 연결(포트 22)을 허용하여 서버에 연결하고 관리할 수 있습니다. 이 섹션에서는 다양한 SSH 관련 규칙으로 방화벽을 구성하는 방법을 다룹니다.
모든 수신 SSH 허용
모든 수신 SSH 연결을 허용하려면 다음 명령을 실행하십시오:
두 번째 명령은 OUTPUT
정책이 ACCEPT
로 설정되어 있지 않은 경우에만 필요합니다.설정된 SSH 연결의 외부 트래픽을 허용하는 두 번째 명령은 필요하지 않습니다.
특정 IP 주소 또는 서브넷에서 수신 SSH 허용
특정 IP 주소 또는 서브넷에서 수신 SSH 연결을 허용하려면 출처를 지정하십시오. 예를 들어, 전체 203.0.113.0/24
서브넷을 허용하려면 다음 명령을 실행하십시오:
두 번째 명령은 OUTPUT
정책이 ACCEPT
로 설정되어 있지 않은 경우에만 필요합니다.설정된 SSH 연결의 외부 트래픽을 허용하는 두 번째 명령은 필요하지 않습니다.
외부 SSH 허용
만약 당신의 방화벽 OUTPUT
정책이 ACCEPT
로 설정되어 있지 않고, 외부 SSH 연결을 허용하려면 – 즉, 당신의 서버가 다른 서버로 SSH 연결을 초기화하는 경우 – 다음 명령을 실행할 수 있습니다:
특정 IP 주소 또는 서브넷에서 들어오는 Rsync 허용
Rsync는 포트 873에서 실행되며 파일을 한 컴퓨터에서 다른 컴퓨터로 전송하는 데 사용할 수 있습니다.
특정 IP 주소 또는 서브넷에서 들어오는 rsync 연결을 허용하려면 소스 IP 주소와 대상 포트를 지정하십시오. 예를 들어, 203.0.113.0/24
전체 서브넷이 서버로 rsync를 실행할 수 있도록 하려면 다음 명령을 실행하십시오:
두 번째 명령은 OUTPUT
정책이 ACCEPT
로 설정되어 있지 않은 경우 established rsync 연결의 외부 트래픽을 허용하는 것만 필요합니다.
서비스: 웹 서버
Apache 및 Nginx와 같은 웹 서버는 일반적으로 HTTP 및 HTTPS 연결에 대해 각각 포트 80 및 443에서 요청을 수신합니다. 기본 수신 트래픽 정책이 드롭 또는 거부로 설정된 경우 서버가 해당 요청에 응답할 수 있도록 규칙을 생성해야 합니다.
모든 수신 HTTP 허용
모든 수신 HTTP (포트 80) 연결을 허용하려면 다음 명령을 실행하십시오:
두 번째 명령은 OUTPUT
정책이 ACCEPT
로 설정되어 있지 않은 경우에만 설정된 HTTP 연결의 아웃바운드 트래픽을 허용합니다.
모든 수신 HTTPS 허용
모든 수신 HTTPS (포트 443) 연결을 허용하려면 다음 명령을 실행하십시오:
두 번째 명령은 OUTPUT
정책이 ACCEPT
로 설정되어 있지 않은 경우에만 설정된 HTTP 연결의 아웃바운드 트래픽을 허용합니다.
모든 수신 HTTP 및 HTTPS 허용
HTTP 및 HTTPS 트래픽을 모두 허용하려면 multiport 모듈을 사용하여 두 포트를 허용하는 규칙을 생성할 수 있습니다. 모든 수신 HTTP 및 HTTPS (포트 443) 연결을 허용하려면 다음 명령을 실행하십시오:
두 번째 명령은 설정된 HTTP 및 HTTPS 연결의 발신 트래픽을 허용하는 명령이며, OUTPUT
정책이 ACCEPT
로 설정되지 않은 경우에만 필요합니다.
서비스: MySQL
MySQL은 클라이언트 연결을 포트 3306에서 수신 대기합니다. 원격 서버의 클라이언트에서 MySQL 데이터베이스 서버를 사용하는 경우 해당 트래픽을 허용해야 합니다.
특정 IP 주소 또는 서브넷에서 MySQL 허용
특정 IP 주소 또는 서브넷에서 들어오는 MySQL 연결을 허용하려면 출처를 지정하십시오. 예를 들어, 전체 203.0.113.0/24
서브넷을 허용하려면 다음 명령을 실행하십시오:
두 번째 명령은 설정된 MySQL 연결의 발신 트래픽을 허용하는 명령이며, OUTPUT
정책이 ACCEPT
로 설정되지 않은 경우에만 필요합니다.
특정 네트워크 인터페이스에 MySQL 허용
MySQL 연결을 특정 네트워크 인터페이스에 허용하려면 예를 들어 개인 네트워크 인터페이스 eth1
가 있는 경우 다음 명령을 사용하십시오:
설정된 MySQL 연결의 발신 트래픽을 허용하는 두 번째 명령은 OUTPUT
정책이 ACCEPT
로 설정되지 않은 경우에만 필요합니다.
서비스: PostgreSQL
PostgreSQL은 클라이언트 연결을 포트 5432에서 대기합니다. PostgreSQL 데이터베이스 서버가 원격 서버의 클라이언트에 의해 사용되는 경우 해당 트래픽을 허용해야 합니다.
특정 IP 주소 또는 서브넷에서의 PostgreSQL
특정 IP 주소 또는 서브넷에서의 수신 PostgreSQL 연결을 허용하려면 소스를 지정하십시오. 예를 들어, 전체 203.0.113.0/24
서브넷을 허용하려면 다음 명령을 실행하십시오:
설정된 PostgreSQL 연결의 발신 트래픽을 허용하는 두 번째 명령은 OUTPUT
정책이 ACCEPT
로 설정되지 않은 경우에만 필요합니다.
특정 네트워크 인터페이스에 PostgreSQL 허용
특정 네트워크 인터페이스에 PostgreSQL 연결을 허용하려면—예를 들어 개인 네트워크 인터페이스 eth1
가 있다고 가정할 때—다음 명령을 사용하십시오:
두 번째 명령은 OUTPUT
정책이 ACCEPT
로 설정되지 않은 경우에만 확립된 PostgreSQL 연결의 아웃 바운드 트래픽을 허용하는 것이 필요합니다.
서비스: 메일
메일 서버는 메일 전달에 사용되는 프로토콜에 따라 다양한 포트에서 청취합니다. 메일 서버를 실행하는 경우 사용 중인 프로토콜을 확인하고 적절한 유형의 트래픽을 허용해야 합니다. 또한 외부 SMTP 메일을 차단하는 규칙을 생성하는 방법을 안내해 드리겠습니다.
외부 SMTP 메일 차단
서버에서 외부 메일을 보내면 안 되는 경우 해당 유형의 트래픽을 차단하려 할 수 있습니다. 포트 25를 사용하는 외부 SMTP 메일을 차단하려면 다음 명령을 실행하십시오:
이 구성은 iptables를 사용하여 포트 25에서 모든 외부 트래픽을 거부합니다. 다른 서비스의 포트 번호를 거부해야 하는 경우, 포트 25 대신 해당 포트 번호로 위의 25
를 대체하십시오.
모든 수신 SMTP 허용
서버가 포트 25에서 SMTP 연결에 응답하도록 허용하려면 다음 명령을 실행하십시오:
두 번째 명령은 OUTPUT
정책이 ACCEPT
로 설정되어 있지 않은 경우 설정된 SMTP 연결의 외부 트래픽을 허용하는 것만 필요합니다.
모든 수신 IMAP 허용
서버가 포트 143에서 IMAP 연결에 응답하도록 허용하려면 다음 명령을 실행하십시오:
두 번째 명령은 OUTPUT
정책이 ACCEPT
로 설정되어 있지 않은 경우 설정된 IMAP 연결의 외부 트래픽을 허용하는 것만 필요합니다.
모든 수신 IMAPS 허용
서버가 IMAPS 연결(포트 993)에 응답하도록 허용하려면 다음 명령을 실행하십시오:
두 번째 명령은 OUTPUT
정책이 ACCEPT
로 설정되지 않은 경우 설정된 IMAPS 연결의 외부 트래픽을 허용하는 것만 필요합니다.
모든 수신 POP3 허용
서버가 POP3 연결(포트 110)에 응답하도록 허용하려면 다음 명령을 실행하십시오:
두 번째 명령은 OUTPUT
정책이 ACCEPT
로 설정되지 않은 경우 설정된 POP3 연결의 외부 트래픽을 허용하는 것만 필요합니다.
모든 수신 POP3S 허용
서버가 POP3S 연결(포트 995)에 응답하도록 허용하려면 다음 명령을 실행하십시오:
두 번째 명령은 OUTPUT
정책이 ACCEPT
로 설정되지 않은 경우 설정된 POP3S 연결의 외부 트래픽을 허용하는 것만 필요합니다.
결론
그것은 일반적으로 사용되는 명령어 중 많은 것을 다룰 것입니다. 물론, iptables는 매우 유연한 도구이므로 여기에서 다루지 않는 특정 요구 사항을 충족시키기 위해 다양한 옵션을 혼합하여 사용하십시오.
방화벽을 설정하는 방법에 대한 도움이 필요하다면 이 자습서를 확인하십시오: 서버를 보호하기 위한 효과적인 방화벽 정책 선택하기.