본문 바로가기

카테고리 없음

리눅스 방화벽 포트 열기 및 포트포워딩 설정 방법

 

리눅스 서버를 운영하다 보면 웹사이트를 외부에 공개하거나 SSH, 데이터베이스, 애플리케이션 서버에 접속하기 위해 특정 포트를 열어야 하는 경우가 있습니다.

하지만 방화벽에서 포트를 허용하는 것과 포트포워딩은 서로 다른 작업입니다. 이 차이를 정확하게 이해하지 못하면 설정을 모두 했는데도 외부에서 서버에 접속되지 않는 문제가 발생할 수 있습니다.

이번 글에서는 리눅스 초보자도 이해할 수 있도록 방화벽 포트 열기부터 포트포워딩의 개념과 기본 설정 방법, 보안상 주의사항까지 정리해보겠습니다.


1. 리눅스에서 포트란 무엇일까?

컴퓨터의 IP 주소가 건물의 주소라면 포트는 건물 안의 각각의 출입구라고 생각하면 이해하기 쉽습니다.

하나의 서버에서 여러 프로그램을 동시에 실행할 수 있는데, 각각 다른 포트를 사용할 수 있습니다.

대표적인 포트는 다음과 같습니다.

서비스기본 포트
SSH 22
HTTP 80
HTTPS 443
FTP 21
MySQL 3306
PostgreSQL 5432

예를 들어 Nginx 웹서버가 80번 포트를 사용하고 있다면 외부 사용자는 서버의 80번 포트를 통해 웹사이트에 접속할 수 있습니다.


2. 방화벽과 포트포워딩은 다르다

이 부분이 가장 중요합니다.

방화벽

→ 특정 포트로 들어오는 연결을 허용하거나 차단합니다.

포트포워딩

→ 외부에서 특정 포트로 들어온 연결을 내부의 다른 서버 또는 포트로 전달합니다.

예를 들어 공유기 아래에 리눅스 서버가 있다고 가정해보겠습니다.

인터넷
   ↓
공유기 공인 IP
   ↓
포트포워딩
   ↓
192.168.0.100:80
   ↓
리눅스 웹서버
 

이 경우 공유기에서는 80번 요청을 내부 서버인 192.168.0.100의 80번 포트로 전달해야 합니다.

그리고 리눅스 서버의 방화벽에서도 80번 포트를 허용해야 합니다.

즉,

포트포워딩 + 서버 방화벽 허용

두 가지가 모두 필요한 상황이 있을 수 있습니다.


3. 현재 열려 있는 포트 확인하기

방화벽 설정을 변경하기 전에 현재 서버에서 어떤 포트를 사용하고 있는지 확인하는 것이 좋습니다.

다음 명령어를 사용할 수 있습니다.

 
sudo ss -tuln
 

실행하면 현재 서버에서 대기 중인 네트워크 포트를 확인할 수 있습니다.

예를 들어 다음과 같은 결과가 나올 수 있습니다.

LISTEN 0 128 0.0.0.0:22
LISTEN 0 128 0.0.0.0:80
 

이 경우 SSH는 22번 포트, 웹서버는 80번 포트를 사용하고 있다는 의미입니다.


4. Ubuntu에서 UFW로 포트 열기

Ubuntu에서는 UFW(Uncomplicated Firewall)를 이용하면 비교적 간단하게 방화벽을 관리할 수 있습니다.

먼저 현재 상태를 확인합니다.

 
sudo ufw status
 

방화벽이 비활성화되어 있다면 필요한 규칙을 먼저 준비한 뒤 활성화하는 것이 좋습니다.

웹사이트를 운영한다면 다음처럼 HTTP와 HTTPS를 허용할 수 있습니다.

 
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
 

SSH 접속도 필요하다면 SSH 포트 역시 허용해야 합니다.

 
sudo ufw allow 22/tcp
 

그다음 방화벽을 활성화합니다.

 
sudo ufw enable
 

현재 적용된 규칙은 다음 명령어로 확인할 수 있습니다.

 
sudo ufw status
 

5. 특정 포트만 직접 열기

예를 들어 애플리케이션 서버가 8080번 포트를 사용한다면 다음과 같이 설정할 수 있습니다.

 
sudo ufw allow 8080/tcp
 

다시 확인합니다.

 
sudo ufw status
 

필요한 포트만 허용하는 것이 기본적인 서버 보안 관리 방법입니다.

사용하지 않는 포트를 무작정 열어두는 것은 피하는 것이 좋습니다.


6. 특정 IP에서만 접근하도록 제한하기

관리자용 서비스나 SSH처럼 외부에 무조건 공개할 필요가 없는 서비스는 접근 가능한 IP를 제한하는 방법도 있습니다.

예를 들어 특정 IP 주소에서만 SSH 접속을 허용하려면 다음과 같이 구성할 수 있습니다.

 
sudo ufw allow from 203.0.113.10 to any port 22 proto tcp
 

이렇게 하면 지정한 IP에서 22번 포트로 접근하는 연결을 허용하는 방식으로 설정할 수 있습니다.

실제 운영 환경에서는 관리자가 사용하는 고정 IP나 VPN 등 자신의 네트워크 환경에 맞춰 접근 범위를 제한하는 것이 좋습니다.


7. CentOS 및 RHEL 계열에서 firewalld 사용하기

CentOS, RHEL 계열에서는 firewalld가 사용되는 경우가 많습니다.

먼저 현재 방화벽 상태를 확인합니다.

 
sudo firewall-cmd --state
 

예를 들어 HTTP 80번 포트를 허용하려면 다음과 같이 설정할 수 있습니다.

 
sudo firewall-cmd --permanent --add-port=80/tcp
 

HTTPS도 필요하다면:

 
sudo firewall-cmd --permanent --add-port=443/tcp
 

설정을 적용합니다.

 
sudo firewall-cmd --reload
 

현재 허용된 포트는 다음 명령어로 확인할 수 있습니다.

 
sudo firewall-cmd --list-ports
 

8. 포트포워딩이 필요한 경우

포트포워딩은 주로 공유기 또는 NAT 환경에서 내부 서버를 외부에 공개할 때 사용합니다.

예를 들어 집이나 사무실의 공유기 뒤에 리눅스 서버가 있다고 가정해보겠습니다.

서버의 내부 IP가 다음과 같다고 하겠습니다.

192.168.0.100
 

그리고 웹서버가 80번 포트를 사용하고 있다면 공유기에서 다음과 같이 설정할 수 있습니다.

외부 포트 80
      ↓
192.168.0.100
      ↓
내부 포트 80
 

외부 사용자가 공인 IP의 80번 포트로 접속하면 공유기가 내부 리눅스 서버의 80번 포트로 요청을 전달합니다.


9. 외부 포트와 내부 포트를 다르게 설정할 수도 있다

포트포워딩에서는 외부 포트와 내부 포트를 다르게 지정할 수도 있습니다.

예를 들어 외부에서 8080번 포트로 접속했을 때 내부 서버의 80번 포트로 전달하도록 설정할 수 있습니다.

외부
:8080
  ↓
공유기
  ↓
192.168.0.100:80
 

이 경우 외부에서는 다음과 같은 방식으로 접속합니다.

http://공인IP:8080
 

공유기는 해당 요청을 내부 서버의 80번 포트로 전달합니다.


10. AWS 같은 클라우드 서버는 조금 다르다

AWS EC2 같은 클라우드 서버에서는 일반적인 가정용 공유기 포트포워딩과 개념이 다릅니다.

EC2의 경우 인터넷 게이트웨이, VPC 네트워크 구성, 보안 그룹, 네트워크 ACL 등의 설정을 함께 고려해야 합니다.

예를 들어 Nginx 웹사이트를 외부에 공개한다면 일반적으로 80번과 443번 포트에 대한 접근을 허용해야 합니다.

그리고 서버 내부의 Linux 방화벽에서도 해당 포트를 허용해야 할 수 있습니다.

따라서 클라우드 서버에서는 다음과 같은 구조로 이해하면 쉽습니다.

인터넷
   ↓
AWS 네트워크
   ↓
Security Group
   ↓
EC2 서버
   ↓
Linux 방화벽
   ↓
Nginx
 

즉, 클라우드에서는 단순히 리눅스에서 포트 하나를 여는 것만으로 끝나지 않을 수 있습니다.


11. 포트를 열었는데 접속이 안 된다면?

방화벽 포트를 열었는데도 외부에서 접속되지 않는 경우가 있습니다.

이때는 한 곳만 확인하지 말고 단계별로 확인해야 합니다.

첫 번째, 프로그램이 실행 중인지 확인

 
sudo ss -tuln
 

원하는 포트가 실제로 LISTEN 상태인지 확인합니다.

두 번째, Linux 방화벽 확인

Ubuntu라면:

 
sudo ufw status
 

firewalld라면:

 
sudo firewall-cmd --list-all
 

세 번째, 클라우드 방화벽 확인

AWS EC2라면 Security Group을 확인합니다.

네 번째, 공유기 포트포워딩 확인

내부 서버를 공유기 뒤에서 운영하고 있다면 포트포워딩 규칙을 확인합니다.

다섯 번째, 서버의 IP 주소 확인

내부 IP와 공인 IP를 혼동하지 않았는지도 확인해야 합니다.


12. 모든 포트를 열어도 될까?

절대 권장하지 않습니다.

예를 들어 다음과 같이 모든 포트를 모든 IP에 공개하는 설정은 보안상 위험할 수 있습니다.

0.0.0.0/0
 

특히 SSH, MySQL, PostgreSQL 같은 관리 및 데이터베이스 포트는 외부에 무분별하게 공개하지 않는 것이 좋습니다.

웹서비스처럼 반드시 외부에서 접근해야 하는 서비스만 필요한 범위에서 공개하고, 관리용 포트는 접근 가능한 IP를 제한하는 것이 좋습니다.


13. 데이터베이스 포트는 특히 주의하기

MySQL의 기본 포트는 3306번입니다.

하지만 웹서버와 데이터베이스가 같은 서버에서 실행된다면 굳이 3306번 포트를 인터넷에 공개할 필요가 없는 경우가 많습니다.

가능하다면 데이터베이스는 외부에서 직접 접근하지 못하도록 구성하고 애플리케이션 서버를 통해서만 접근하도록 하는 것이 더 안전합니다.

예를 들어 다음과 같은 구조입니다.

인터넷
   ↓
Nginx :443
   ↓
웹 애플리케이션
   ↓
MySQL :3306
 

MySQL을 인터넷에 직접 노출하는 구조보다 훨씬 관리하기 쉽습니다.


마무리

리눅스 서버의 포트를 관리할 때는 방화벽과 포트포워딩의 차이를 이해하는 것이 가장 중요합니다.

방화벽은 접근을 허용하거나 차단하는 역할을 하고, 포트포워딩은 외부에서 들어온 연결을 내부 서버로 전달하는 역할을 합니다.

기본적인 구성은 다음과 같이 기억하면 쉽습니다.

인터넷 → 포트포워딩 → 서버 → 방화벽 → 서비스

AWS와 같은 클라우드 환경에서는 여기에 Security Group 같은 추가적인 네트워크 보안 설정이 들어갈 수 있습니다.

그리고 서버 운영에서는 필요한 포트만 열고, 관리용 포트는 접근 범위를 제한하는 것이 중요합니다.

포트를 많이 여는 것이 편리한 서버가 아니라, 필요한 포트만 정확하게 열어둔 서버가 안전한 서버입니다.


소개 및 문의 · 개인정보처리방침 · 면책조항

© 2026 블로그 이름