블로그로 돌아가기

Iptables 방화벽 설정: 기본 규칙 및 명령어

Iptables 방화벽 설정: 기본 규칙 및 명령어

소개

Iptables​은(는) 명령줄 ​방화벽 ​유틸리티입니다. 이는 시스템에 방화벽을 구성할 수 있도록 해주는 소프트웨어임을 의미합니다. 일반적으로 기본적으로 ​Linux​ 시스템에서 사용할 수 있습니다. 이 가이드에서는 ​iptables​ 방화벽과 함께 사용되는 몇 가지 일반적인 규칙과 명령에 대해 논의할 것입니다. 연결이 시스템과 설정을 시도할 때마다 방화벽은 이러한 규칙을 참조하여 다음 조치 단계가 무엇이어야 하는지 결정합니다.

Iptables 명령

이 가이드에서는 가장 필수적인 iptables 명령 중 일부를 소개합니다. 가이드를 따르려면 iptables가 무엇이고 어떻게 작동하는지에 대한 기본적인 이해가 필요합니다. 이는 다음 명령으로 구현하는 규칙을 더 잘 이해하는 데 도움이 될 것입니다. 아래에 제공된 명령은 단독으로 사용할 수 있습니다. 반면에 특정 요구 사항에 맞게 조합하여 사용할 수도 있습니다.

주의할 사항

계속 읽기 전에 염두에 두어야 할 몇 가지 사항은 다음과 같습니다.

  • iptables에서 규칙의 순서는 중요합니다.
  • 체인의 끝에 새 규칙을 추가하려면 ​iptables 명령에서 다음을 사용해야 합니다: ​-A.​​
  • 다른 위치에 규칙을 추가하려면 ​-I 옵션을 사용해야 합니다. 이 옵션을 사용하면 규칙의 정확한 위치를 지정할 수 있습니다. 체인의 시작 부분에 규칙을 배치하려면 규칙 번호를 제공하지 않으면 됩니다.
  • 서버에 지속적으로 액세스할 수 있도록 하려면 기본적으로 포트 22의 SSH 트래픽을 차단하십시오.
  • 그렇게 하지 못해 서버에 대한 액세스 권한을 잃은 경우 콘솔을 사용하여 다시 연결할 수 있습니다. 방화벽 설정을 변경하려면 SSH 트래픽을 허용하십시오.
  • 현재 적용된 규칙 세트를 검토하려면 다음 명령을 사용하십시오: sudo iptables -S​ 및 ​ ​sudo iptables -L.

또한, ​iptables 방화벽 규칙을 나열하고 삭제하는 방법에 대한 자세한 가이드​가 준비되어 있어, iptables 방화벽을 최대한 활용하는 데 더욱 도움이 될 것입니다.

이제 전제 조건을 마쳤으므로, 몇 가지 ​일반적인 iptables 명령​:

규칙을 저장하는 방법

먼저 규칙을 저장하는 방법을 알아보겠습니다. iptables 규칙은 일시적이라는 점에 유의하는 것이 중요합니다. 즉, 저장하지 않으면 시스템을 재부팅한 후 규칙이 손실됩니다. 다음은 각각 ​Ubuntu​ 및 ​CentOS​ 서버에서 새 규칙을 수동으로 저장하는 방법입니다:

  • Ubuntu

Ubuntu 서버에서 새 규칙을 저장하는 가장 쉬운 방법은 iptables-persistent​ 패키지를 사용하는 것입니다. 다음 ​튜토리얼을 따라 Ubuntu 서버를 쉽게 생성할 수 있습니다​.

이제 새 iptables 규칙을 저장하는 첫 번째 단계는 apt-get을 사용하여 iptables-persistent ​패키지를 설치하는 것입니다. 설치 방법은 다음과 같습니다:

Iptables Firewall 1

설치 과정에서 현재 적용된 방화벽 규칙을 저장할지 여부를 결정해야 합니다. 대신 규칙을 업데이트하고 변경 사항을 저장하려면 다음 명령을 사용하십시오:

Iptables Firewall 2

위 명령은 일반적으로 16.04 이후의 Ubuntu 버전에서 작동합니다. 이전 버전을 사용하는 경우 대신 다음 명령을 사용하십시오:

  • CentOS

CentOS 6 또는 그 이전 버전에서는 iptables로 방화벽을 구성할 수 있습니다. CentOS 7은 대신 FirewallD를 사용합니다. 다음 튜토리얼을 통해 CentOS 7에서 FirewallD를 설정하는 방법을 알아보십시오.

CentOS에서는 ​iptables 초기화 스크립트를 사용하여 새 규칙을 저장할 수 있습니다. 다음 명령을 참조하십시오:

이 명령은 iptables 방화벽에 대한 새 규칙을 저장합니다. 현재 활성화된 iptables 규칙은 /etc/sysconfig/iptables​ 파일에서 찾을 수 있습니다.

유용한 Iptables 명령

이제 서버에서 사용해야 할 수도 있는 매우 유용한 iptables 방화벽 명령 몇 가지를 살펴보겠습니다.

  • 루프백 연결

먼저 루프백 연결을 허용하는 방법을 살펴보겠습니다. 시스템은 자체적으로 연결을 보내기 위해 루프백 인터페이스를 사용합니다. 예를 들어, 다음 명령을 실행했다고 가정해 보겠습니다: ​ping localhost​ 또는 ​ping 127.0.0.1​. 서버는 루프백 인터페이스 또는 lo​,를 사용하여 기본적으로 자체적으로 핑을 보냅니다. 다른 경우에는 애플리케이션 서버가 'localhost' 주소에 연결하도록 구성된 경우 서버가 이를 사용할 수 있습니다.

상황이 어떠하든, iptables 방화벽이 이러한 연결을 차단하지 않도록 해야 합니다. 따라서 이러한 기능이 작동할 수 있도록 루프백 연결을 허용해야 합니다.

루프백 인터페이스로 들어오는 모든 트래픽을 허용하기 위해 실행할 명령은 다음과 같습니다.

Iptables Firewall 3

  • 기존 및 관련 수신 연결

허용해야 할 수 있는 또 다른 유형의 연결은 송신 연결입니다. 서버가 수신 및 송신 트래픽을 각각 올바르게 수신하고 전송하도록 하려면 기존(established) 및 관련(related) 수신 연결을 허용해야 합니다. 이를 통해 서버는 송신 연결에 대한 회신 트래픽을 보낼 수 있습니다. 기존 및 관련 수신 연결을 허용하려면 다음 명령을 사용하십시오.

Established and Related Incoming Connections

  • 기존 송신 연결

서버는 일반적으로 기존 연결의 송신 트래픽 형태로 수신 연결에 대한 응답을 보냅니다. 이를 허용하려면 다음 명령을 사용하십시오.

Established Outgoing Connections

  • 내부에서 외부로

때로는 내부에서 외부로의 액세스를 허용하도록 방화벽을 구성해야 할 수도 있습니다. 기본적으로 외부 네트워크는 ​eth0​ 이고 ​eth1 은 내부 네트워크여야 합니다. 이 경우 다음 명령을 사용하여 액세스를 활성화하십시오.

Internal to External

  • 유효하지 않은 패킷 드롭

때로는 일부 네트워크 트래픽 패킷이 유효하지 않은 것으로 표시될 수 있습니다. 대부분의 경우 이러한 유효하지 않은 패킷은 그냥 드롭하면 됩니다. 그렇게 하려면 다음 명령을 사용하십시오.

Dropping Invalid Packets

IP 주소 차단 규칙

다음으로, 특정 IP 주소에서 들어오는 연결을 차단하는 데 사용할 수 있는 몇 가지 명령을 살펴보겠습니다. 이해를 돕기 위해 명령 예시에서는 ​15.15.15.51 IP 주소를 예로 사용하겠습니다. 이 값을 실제 IP 주소로 대체하여 사용할 수 있습니다.

-s 15.15.15.51에서, ​-s​는 출발지(source)를 의미합니다. 따라서 이 명령은 출발지 IP 주소 '15.15.15.51'을 지정하고 있습니다. 마찬가지로 모든 방화벽 규칙에서 출발지 IP 주소를 지정할 수 있습니다. 여기에는 허용(allow) 및 거부(reject) 규칙이 포함됩니다.

연결을 거부하려면 다음과 같이 명령에서 DROP 대신 REJECT를 사용합니다.

결과적으로, 해당 특정 IP 주소에서 연결 요청을 보낼 때마다 서버는 '연결 거부(connection refused)' 오류를 반환합니다.

  • 특정 인터페이스로의 연결 차단

특정 IP 주소에서 특정 네트워크 인터페이스로 들어오는 모든 연결 요청을 차단할 수 있습니다. 이 예에서 IP 주소는 15.15.15.51​ 이고 네트워크 인터페이스는 ​eth0​ 입니다. 연결을 차단하려면 다음 명령을 사용하십시오.

가장 좋은 점은 모든 규칙에서 네트워크 인터페이스를 지정할 수 있다는 것입니다. 즉, 모든 규칙을 특정 네트워크에만 적용하고 제한할 수 있습니다.

서비스 규칙: SSH

SSH ​는 클라우드 서버를 사용하는 경우 관련이 있습니다. 이 경우 22번 포트에서 수신 SSH 연결을 허용해야 합니다. 이러한 연결을 활성화하면 서버에 연결하고 관리할 수 있습니다. 여기서는 SSH와 관련된 몇 가지 일반적인 규칙에 대해 설명합니다.

  • 모든 수신 SSH 허용

다음 명령은 모든 수신 SSH 연결을 허용합니다:

위의 세트에서, ​OUTPUT​ 정책이 ​ACCEPT​로 설정되어 있지 않은 경우에만 두 번째 명령을 사용하면 됩니다. 이 명령은 이미 연결된 SSH 연결의 발신 트래픽을 허용합니다.

  • 서브넷에서 들어오는 SSH 허용

이전 명령은 모든 수신 연결을 허용합니다. 다음 명령을 사용하여 특정 IP 주소 또는 서브넷에서 들어오는 연결만 허용할 수 있습니다. 예를 들어, 다음 ​15.15.15.0/24​ 서브넷에서 들어오는 연결만 허용하려는 경우:

이전과 마찬가지로, ​OUTPUT​ 정책이 ​ACCEPT​로 설정되어 있지 않은 경우에만 두 번째 명령을 사용하면 됩니다. 이 명령은 이미 연결된 SSH 연결의 발신 트래픽을 허용합니다.

  • 발신 SSH 허용

방화벽 ​OUTPUT​ 정책이 ​ACCEPT​로 설정되어 있지 않고 SSH 연결을 활성화하려는 경우 이 명령을 사용하십시오. 이렇게 하면 서버가 다른 서버로 SSH 연결을 시작할 수 있습니다:

클라우드 서버에서 SSH를 추가로 활용하려면 다음 튜토리얼을 참조하십시오: ​ Ubuntu에서 SSH를 사용하여 원격 서버에 연결하는 방법 ​및 SSH 키 기반 인증을 사용하도록 Linux 서버를 구성하는 방법​.

  • 서브넷에서 들어오는 Rsync 허용

Rsync​은 한 시스템에서 다른 시스템으로 파일을 전송하는 데 사용할 수 있는 기능입니다. 이 기능은 873번 포트에서 실행됩니다. 따라서 특정 IP 주소나 서브넷에서 873번 포트로 들어오는 Rsync 연결을 허용하려면 다음 명령을 사용하십시오:

보시다시피 대상 포트와 함께 소스 IP 주소를 지정했습니다. 방화벽 ​OUTPUT​ 정책이 ​ACCEPT​로 설정되어 있지 않은 경우에만 두 번째 명령을 사용하면 됩니다. 이 명령은 이미 연결된 Rsync 연결의 발신 트래픽을 허용합니다. 또한, 다음 ​Rsync를 사용하여 VPS에서 로컬 및 원격 디렉터리를 동기화하는 방법에 대한 튜토리얼​.

서비스 규칙: 웹 서버

HTTP 연결은 일반적으로 80번 포트에서 수신됩니다. 마찬가지로 HTTPS는 보통 443번 포트로 들어옵니다. 다음과 같은 웹 서버는 ​Apache​ 및 ​Nginx​ 이러한 포트를 수신 대기하여 연결 요청을 포착합니다. 때로는 기본 설정으로 인해 서버가 이러한 수신 요청을 거부하거나 드롭할 수 있습니다. 그렇기 때문에 트래픽을 허용하기 위해 새로운 규칙을 설정해야 합니다.

  • 모든 수신 HTTP 연결 허용

다음 명령을 사용하여 80번 포트에서 들어오는 모든 HTTP 연결을 허용할 수 있습니다:

방화벽 ​OUTPUT​ 정책이 ACCEPT​로 설정되어 있지 않은 경우에만 두 번째 명령을 사용하면 됩니다. 이 명령은 이미 연결된 HTTP 연결의 발신 트래픽을 허용합니다.

  • 모든 수신 HTTPS 연결 허용

443번 포트에서 모든 수신 HTTPS 연결 요청을 허용하려면 다음 명령어를 사용하십시오:

iptables 방화벽 ​OUTPUT​ 정책이 ACCEPT​로 설정되어 있지 않은 경우에만 두 번째 명령어를 사용합니다. 이 명령어는 이미 연결된 HTTP 연결의 송신 트래픽을 허용합니다.

  • HTTP 및 HTTPS의 모든 수신 연결 허용

HTTP 및 HTTPS 포트 모두에서 트래픽을 허용하려면 multiport 모듈을 사용할 수 있습니다. 이 경우 다음 명령어를 사용하십시오:

방화벽 ​OUTPUT​ 정책이 ACCEPT​로 설정되어 있지 않은 경우에만 두 번째 명령어를 사용합니다. 이 명령어는 이미 연결된 HTTP 및 HTTPS 연결의 송신 트래픽을 허용합니다.

서비스 규칙: MySQL

때로는 클라이언트가 원격 서버를 사용하여 귀하의 ​MySQL​ 데이터베이스 서버에 액세스할 수 있습니다. 이 경우 관련 포트의 수신 트래픽을 수동으로 허용해야 합니다. MySQL은 3306번 포트에서 연결 요청을 대기합니다.

  • 서브넷에서 수신되는 MySQL 연결 허용

특정 서브넷에서 MySQL 연결을 허용하려면 소스를 지정해야 합니다. 이 예제에서는 다음 명령어를 사용하여 15.15.15.0/24​ 서브넷에서 들어오는 수신 트래픽을 허용합니다:

방화벽 ​OUTPUT​ 정책이 ACCEPT​로 설정되어 있지 않은 경우에만 두 번째 명령어를 사용합니다. 이 명령어는 이미 연결된 MySQL 연결의 송신 트래픽을 허용합니다.

  • 인터페이스에 대한 MySQL 연결 활성화

MySQL 연결을 수신할 네트워크 인터페이스를 지정하려면 다음 명령어를 사용할 수 있습니다:

이 경우, 당사는 다음과 같은 사설 네트워크 인터페이스에 대한 연결을 허용하고 있습니다: eth1​.

방화벽 ​OUTPUT​ 정책이 ACCEPT​로 설정되어 있지 않은 경우에만 두 번째 명령어를 사용합니다. 이 명령어는 이미 연결된 MySQL 연결의 송신 트래픽을 허용합니다.

당사의 ​서버에 MySQL을 쉽게 설치하는 튜토리얼​.

서비스 규칙: PostgreSQL

클라이언트가 원격 서버를 사용하여 귀하의 ​PostgreSQL​ 데이터베이스 서버에 액세스할 수 있습니다. 이 경우 이러한 수신 연결을 허용해야 합니다. 이 연결은 5432번 포트를 통해 들어옵니다.

  • 서브넷에서 수신되는 PostgreSQL 연결 허용

특정 서브넷 또는 IP 주소에서 들어오는 PostgreSQL 연결을 허용하려면 다음 명령어를 사용할 수 있습니다. 보시다시피, 당사는 소스로 ​15.15.15.0/24​ 서브넷을 지정했습니다.

방화벽 ​OUTPUT​ 정책이 ACCEPT​로 설정되어 있지 않은 경우에만 두 번째 명령어를 사용합니다.. 이는 이미 연결된 PostgreSQL 연결의 아웃바운드 트래픽을 허용합니다.

  • 특정 인터페이스에 대한 PostgreSQL 연결 활성화

특정 네트워크 인터페이스에 대해서만 PostgreSQL 연결을 허용하려면 다음 명령어를 사용하십시오:

이 경우, 다음과 같은 사설 네트워크 인터페이스에 대한 연결을 허용합니다: eth1​. 두 번째 명령어는 방화벽 OUTPUT​ 정책이 ACCEPT​로 설정되어 있지 않은 경우에만 사용합니다. 이는 이미 연결된 PostgreSQL 연결의 아웃바운드 트래픽을 허용합니다.

튜토리얼을 따라 Ubuntu 서버에 PostgreSQL을 설치하십시오​.

서비스 규칙: 메일

사용 중인 메일 서버에 맞춰 방화벽을 구성해야 할 수도 있습니다. 예를 들어, Sendmail​ 및 Postfix​는 여러 다른 포트에서 연결을 수신할 수 있습니다. 이는 메일 전송에 사용하는 프로토콜에 따라 다릅니다. 특정 메일 연결을 차단하거나 허용하려면 사용 중인 프로토콜이 무엇인지 알아야 합니다.

  • 인바운드 SMTP 연결 허용

SMTP 연결은 일반적으로 25번 포트로 들어옵니다. 단, SMTP는 아웃바운드 메일용으로 587번 포트도 흔히 사용합니다. 서버가 이러한 연결에 응답할 수 있도록 허용하려면 다음 명령어를 사용하십시오:

두 번째 명령어는 방화벽 OUTPUT​ 정책이 ACCEPT​로 설정되어 있지 않은 경우에만 사용합니다. 이는 이미 연결된 SMTP 연결의 아웃바운드 트래픽을 허용합니다.

  • 모든 인바운드 IMAP 허용

서버가 143번 포트의 모든 인바운드 IMAP 연결에 응답할 수 있도록 허용하려면 다음을 입력하고 실행하십시오:

두 번째 명령어는 방화벽 ​OUTPUT​ 정책이 ACCEPT​로 설정되어 있지 않은 경우에만 사용합니다. 이는 이미 연결된 IMAP 연결의 아웃바운드 트래픽을 허용합니다.

  • 모든 인바운드 IMAPS 허용

서버가 993번 포트의 IMAPS 연결에 응답할 수 있도록 하려면 다음 명령어를 사용하십시오:

두 번째 명령어는 방화벽 OUTPUT​ 정책이 ACCEPT​로 설정되어 있지 않은 경우에만 사용합니다. 이는 이미 연결된 IMAPS 연결의 아웃바운드 트래픽을 허용합니다.

  • 모든 인바운드 POP3 허용

이러한 연결은 993번 포트로 들어옵니다. 서버가 IMAPS 연결 요청에 응답하도록 하려면 다음 명령어를 사용하십시오:

두 번째 명령어는 방화벽 OUTPUT​ 정책이 ACCEPT​로 설정되어 있지 않은 경우에만 사용합니다. 이는 이미 연결된 POP3 연결의 아웃바운드 트래픽을 허용합니다.

  • 모든 인바운드 POP3S 허용

서버가 995번 포트로 들어오는 POP3S 요청과 연결을 형성할 수 있도록 하려면 다음 명령어를 사용하십시오:

두 번째 명령은 방화벽 ​OUTPUT 정책이 ACCEPT​로 설정되어 있지 않은 경우에만 사용합니다. 이는 수립된 POP3S 연결의 아웃바운드 트래픽을 허용합니다.

  • 아웃바운드 SMTP 메일을 차단하는 방법

인바운드 연결을 허용하고 서버 응답을 활성화하는 대신, 아웃바운드 메일을 완전히 차단하고 싶을 수 있습니다. 다음 명령을 사용하여 25번 포트의 모든 아웃바운드 SMTP 메일을 차단할 수 있습니다:

결과적으로 25번 포트의 모든 아웃바운드 트래픽은 iptables 방화벽에 의해 거부됩니다. 다른 서비스를 거부하려는 경우에도 동일한 명령 구조를 사용할 수 있습니다. 25번 포트를 해당 포트 번호로 바꾸기만 하면 됩니다.

결론

이 가이드에서는 필수적인 iptables 방화벽 명령을 다루었습니다. 이는 iptables 방화벽을 효과적으로 구성하는 데 필요한 필수 도구를 제공합니다. 모든 상황에 적용되는 단 하나의 해결책은 없다는 점을 기억하세요. 이 명령들은 매우 유연합니다. 즉, 귀하와 귀하의 요구 사항에 가장 적합한 방식으로 사용할 수 있습니다.

즐거운 컴퓨팅 되세요!

author

Manpreet Singh

작성자 · CloudSigma

Preslav Dobrev는 CloudSigma의 크리에이티브 디자이너로서, 전통적이고 혁신적인 마케팅 채널을 활용하여 일관된 비즈니스 정체성을 구축하는 데 중점을 두고 있습니다. 그는 영향력 있는 브랜드 내러티브를 창출하기 위해 예술적 비전과 전략적 마케팅을 결합하는 데 능숙합니다.

댓글

아직 댓글이 없습니다. 첫 번째로 작성해 보세요.