소개
UFW 또는 Uncomplicated Firewall은 방화벽 구성 프로세스를 단순화하는 데 중점을 둔 iptables
인터페이스입니다. iptables
는 견고하고 유연한 도구이지만, 초보자가 방화벽을 올바르게 구성하는 방법을 배우는 데 어려울 수 있습니다. 네트워크를 보안하는 것을 시작하려면 어떤 도구를 사용해야 할지 확신이 없다면 UFW가 적합한 선택일 수 있습니다.
이 튜토리얼에서는 Ubuntu v18.04 이상에서 UFW를 사용하여 방화벽을 설정하는 방법을 안내합니다.
전제 조건
Ubuntu 버전 16.04 이하를 사용 중이라면, 더 최신 버전으로 업그레이드하는 것이 좋습니다. Ubuntu는 이러한 버전에 대한 지원을 더 이상 제공하지 않습니다. 이 가이드 모음은 Ubuntu 버전을 업그레이드하는 데 도움이 될 것입니다.
이 튜토리얼을 따르려면 다음이 필요합니다:
-
Ubuntu를 실행하는 서버 및
sudo
권한을 가진 비 루트 사용자. 이를 설정하는 방법에 대한 안내는 이 목록에서 배포를 선택하고 초기 서버 설정 가이드를 따르십시오.를 참조하십시오. -
UFW는 기본적으로 Ubuntu에 설치됩니다. 어떤 이유로 인해 제거되었다면 다음 명령을 사용하여 다시 설치할 수 있습니다.
sudo apt install ufw
.
UFW를 사용하여 Ubuntu 방화벽 설정
- IPv6 활성화
- 기본 정책 설정
- SSH 연결 허용
- UFW 활성화
- 기타 필요한 연결 허용
- 연결 거부
- 방화벽 규칙 삭제하기
- UFW 상태 및 규칙 확인하기
- 우분투에서 방화벽 비활성화 또는 재설정하는 방법
단계 1 — IPv6가 활성화되어 있는지 확인하기
최근 우분투 버전에서는 IPv6가 기본적으로 활성화되어 있습니다. 실제로 서버에 추가된 대부분의 방화벽 규칙에는 IPv4 및 IPv6 버전이 모두 포함됩니다. 후자는 UFW의 상태 명령어 출력에서 v6
으로 식별됩니다. IPv6가 활성화되어 있는지 확인하려면 UFW 구성 파일인 /etc/default/ufw
를 확인할 수 있습니다. 이 파일을 nano
또는 선호하는 명령 줄 편집기를 사용하여 엽니다:
그런 다음 IPV6
값이 yes
로 설정되어 있는지 확인하십시오. 다음과 같이 보여야 합니다:
파일을 저장하고 닫습니다. nano
를 사용하는 경우 CTRL+X
를 입력한 다음 Y
를 입력하고 확인하려면 ENTER
를 누르세요.
이 안내서의 나중 단계에서 UFW가 활성화되면 IPv4 및 IPv6 방화벽 규칙을 모두 작성하도록 구성됩니다.
단계 2 — 기본 정책 설정
UFW를 처음 사용하는 경우 좋은 첫 번째 단계는 기본 방화벽 정책을 확인하는 것입니다. 이러한 규칙은 명시적으로 다른 규칙과 일치하지 않는 트래픽을 처리하는 방법을 제어합니다.
기본적으로 UFW는 모든 들어오는 연결을 거부하고 모든 나가는 연결을 허용하도록 설정되어 있습니다. 이는 서버에 연결하려는 누군가가 연결할 수 없지만 서버 내의 어떤 응용 프로그램이든 외부 세계에 연결할 수 있음을 의미합니다. 특정 서비스와 포트를 허용하는 추가 규칙은 이 일반 정책의 예외로 포함됩니다.
이 튜토리얼의 나머지 부분을 따라갈 수 있도록 지금 UFW의 기본 정책을 들어오는 및 나가는 트래픽에 대해 설정하겠습니다.
기본 UFW 들어오는 정책을 거부
로 설정하려면 다음을 실행하십시오:
OutputDefault incoming policy changed to 'deny'
(be sure to update your rules accordingly)
기본 UFW 나가는 정책을 허용
으로 설정하려면 다음을 실행하십시오:
OutputDefault outgoing policy changed to 'allow'
(be sure to update your rules accordingly)
이 명령은 기본적으로 들어오는 연결을 거부하고 나가는 연결을 허용으로 설정합니다. 이 방화벽 기본값만으로 개인용 컴퓨터에 충분할 수 있지만, 서버는 일반적으로 외부 사용자로부터의 들어오는 요청에 응답해야 합니다. 다음에 그것을 살펴보겠습니다.
단계 3 — SSH 연결 허용
지금 UFW 방화벽을 활성화하면 모든 들어오는 연결을 거부합니다. 이는 서버가 해당 유형의 요청에 응답하기를 원한다면 명시적으로 합법적인 들어오는 연결을 허용하는 규칙을 작성해야 함을 의미합니다. 예를 들어 SSH 또는 HTTP 연결을 허용하려면 이러한 유형의 요청에 응답하도록 서버를 설정해야 합니다. 클라우드 서버를 사용하는 경우 서버에 연결하고 관리하기 위해 들어오는 SSH 연결을 허용하려고 할 것입니다.
OpenSSH UFW 애플리케이션 프로필 허용
설치시 대부분의 네트워크 연결에 의존하는 응용 프로그램은 UFW 내에 응용 프로필을 등록합니다. 이는 사용자가 서비스에 대한 외부 액세스를 신속하게 허용하거나 거부할 수 있게 합니다. 현재 UFW에 등록된 프로필을 확인할 수 있습니다:
OutputAvailable applications:
OpenSSH
OpenSSH 응용 프로필을 활성화하려면 다음을 실행합니다:
OutputRule added
Rule added (v6)
이것은 SSH 데몬이 기본적으로 수신 대기하는 포트인 포트 22
에서 모든 연결을 허용하는 방화벽 규칙을 생성합니다.
서비스 이름으로 SSH 허용
UFW를 구성하여 수신되는 SSH 연결을 허용하는 또 다른 방법은 해당 서비스 이름인 ssh
를 참조하는 것입니다.
OutputRule added
Rule added (v6)
UFW는 /etc/services
파일을 기반으로 서비스가 사용하는 포트와 프로토콜을 알고 있습니다.
포트 번호별 SSH 허용
대안으로 응용 프로그램 프로필이나 서비스 이름 대신 포트를 지정하여 동등한 규칙을 작성할 수 있습니다. 예를 들어, 다음 명령은 이전 예제와 동일하게 작동합니다:
OutputRule added
Rule added (v6)
SSH 데몬을 다른 포트로 구성했다면 적절한 포트를 지정해야 합니다. 예를 들어, SSH 서버가 포트 2222
에서 수신 대기 중인 경우 해당 포트에 대한 연결을 허용하기 위해 다음 명령을 사용할 수 있습니다:
OutputRule added
Rule added (v6)
이제 방화벽이 수신되는 SSH 연결을 허용하도록 구성되었으므로 이를 활성화할 수 있습니다.
단계 4 — UFW 활성화
방화벽은 이제 SSH 연결을 허용하도록 구성되어야 합니다. 방화벽이 아직 비활성화된 상태에서도 추가된 규칙을 확인하려면 다음 명령을 사용할 수 있습니다:
OutputAdded user rules (see 'ufw status' for running firewall):
ufw allow OpenSSH
들어오는 SSH 연결을 허용하는 규칙이 있는지 확인한 후에 방화벽을 활성화할 수 있습니다:
OutputCommand may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup
기존의 SSH 연결에 영향을 줄 수 있다는 경고 메시지를 받게 될 것입니다. 이미 SSH 연결을 허용하는 방화벽 규칙을 설정했으므로 계속 진행해도 괜찮습니다. 프롬프트에 y
를 입력하고 ENTER
를 누르세요.
방화벽이 이제 활성화되었습니다. 설정된 규칙을 확인하려면 sudo ufw status verbose
명령을 실행하세요. 이 튜토리얼의 나머지 부분에서는 UFW를 자세히 사용하는 방법에 대해 다룹니다. 다른 종류의 연결을 허용하거나 거부하는 방법과 같은 사항이 포함됩니다.
단계 5 — 다른 연결 허용
이 시점에서 서버가 응답해야 하는 다른 모든 연결을 허용해야 합니다. 허용해야 하는 연결은 특정한 요구 사항에 따라 달라집니다. 응용 프로그램 프로필, 서비스 이름 또는 포트를 기반으로 연결을 허용하는 규칙을 작성하는 방법을 이미 알고 계십니다. SSH에 대해 이미 이 작업을 수행했습니다(포트 22
를 사용). 다음과 같은 항목에 대해서도 동일한 작업을 수행할 수 있습니다:
- 80번 포트(HTTP)는 암호화되지 않은 웹 서버에서 사용됩니다.
sudo ufw allow http
또는sudo ufw allow 80
을 사용하여 허용할 수 있습니다. - HTTPS는 암호화된 웹 서버가 사용하는 포트인 443번을 사용합니다.
sudo ufw allow https
또는sudo ufw allow 443
을 사용합니다. - HTTP와 HTTPS를 모두 사용하는 Apache를 사용할 경우,
sudo ufw allow 'Apache Full'
을 사용합니다. - HTTP와 HTTPS를 모두 사용하는 Nginx를 사용할 경우,
sudo ufw allow 'Nginx Full'
을 사용합니다.
서버에 사용 가능한 응용 프로그램 프로필을 확인하는 것을 잊지 마십시오. sudo ufw app list
를 사용합니다.
포트 또는 알려진 서비스 이름을 지정하는 것 외에도 연결을 허용하는 여러 가지 방법이 있습니다. 다음 중 일부를 살펴 보겠습니다.
특정 포트 범위
UFW에서 포트 범위를 지정할 수 있습니다. 일부 응용 프로그램은 단일 포트 대신 여러 포트를 사용합니다.
예를 들어 포트 6000
에서 6007
까지 사용하는 X11 연결을 허용하려면 다음 명령을 사용합니다.
UFW에서 포트 범위를 지정할 때 규칙이 적용될 프로토콜(tcp
또는 udp
)을 지정해야 합니다. 이전에 이것을 언급하지 않은 이유는 프로토콜을 지정하지 않으면 자동으로 두 프로토콜 모두를 허용하기 때문입니다. 대부분의 경우에는 괜찮습니다.
특정 IP 주소
UFW를 사용할 때 규칙 내에서 IP 주소를 지정할 수도 있습니다. 예를 들어 특정 IP 주소(예: 작업 또는 집 IP 주소)에서의 연결을 허용하려면 from
매개변수를 사용하여 허용하려는 IP 주소를 제공해야 합니다:
OutputRule added
또한 IP 주소가 연결할 수 있는 포트를 지정할 수도 있습니다. to any port
다음에 포트 번호를 추가하여 특정 포트를 지정합니다. 예를 들어 203.0.113.4
가 포트 22
(SSH)에 연결할 수 있도록 하려면 다음 명령을 사용하십시오:
OutputRule added
서브넷
IP 주소의 서브넷을 허용하려면 CIDR 표기법을 사용하여 넷마스크를 지정할 수 있습니다. 예를 들어 203.0.113.1
에서 203.0.113.254
까지의 모든 IP 주소를 허용하려면 다음 명령을 사용할 수 있습니다:
OutputRule added
마찬가지로, 서브넷 203.0.113.0/24
가 연결할 수 있는 대상 포트를 지정할 수도 있습니다. 다시 말하지만, 예제로 포트 22
(SSH)를 사용하겠습니다:
OutputRule added
특정 네트워크 인터페이스에 대한 연결
특정 네트워크 인터페이스에만 적용되는 방화벽 규칙을 만들고 싶다면 “allow in on” 뒤에 네트워크 인터페이스 이름을 지정하여 할 수 있습니다.
계속하기 전에 네트워크 인터페이스를 확인해야 할 수도 있습니다. 이를 위해 다음 명령을 사용하십시오:
Output Excerpt2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state
. . .
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default
. . .
강조된 출력은 네트워크 인터페이스 이름을 나타냅니다. 일반적으로 eth0
또는 enp3s2
와 같은 이름으로 지정됩니다.
따라서 서버에 eth0
이라는 공용 네트워크 인터페이스가 있다면 다음 명령을 사용하여 해당 인터페이스로 HTTP 트래픽(포트 80
)을 허용할 수 있습니다:
OutputRule added
Rule added (v6)
이렇게 하면 서버가 공용 인터넷에서 HTTP 요청을 수신할 수 있습니다.
또는 예를 들어 MySQL 데이터베이스 서버(포트 3306
)가 개인 네트워크 인터페이스 eth1
에서 연결을 수신하도록 원한다면 다음 명령을 사용할 수 있습니다:
OutputRule added
Rule added (v6)
이렇게 하면 개인 네트워크의 다른 서버가 MySQL 데이터베이스에 연결할 수 있습니다.
단계 6 — 연결 거부
들어오는 연결의 기본 정책을 변경하지 않았다면 UFW는 모든 들어오는 연결을 거부하도록 구성됩니다. 일반적으로 이는 특정 포트와 IP 주소를 명시적으로 허용하는 규칙을 만들어 안전한 방화벽 정책을 생성하는 과정을 간소화합니다.
그러나 때로는 서버가 공격 받고 있는 것을 알기 때문에 소스 IP 주소나 서브넷을 기반으로 특정 연결을 거부하고 싶을 수 있습니다. 또한 기본 들어오는 정책을 허용(권장되지 않음)으로 변경하려면 연결을 허용하고 싶지 않은 서비스나 IP 주소에 대한
거부 규칙을 작성해야 합니다. 거부 규칙을 작성하려면 이전에 설명한 명령을 사용하여 허용을 거부로 대체하면 됩니다.
예를 들어, HTTP 연결을 거부하려면 다음 명령을 사용할 수 있습니다:
OutputRule added
Rule added (v6)
또는 203.0.113.4
에서 모든 연결을 거부하려면 다음 명령을 사용할 수 있습니다:
OutputRule added
일부 경우에는 서버에서 나가는 연결을 차단하고 싶을 수도 있습니다. SMTP 트래픽에 대한 포트 25
와 같이 서버의 특정 포트를 사용하는 모든 사용자를 거부하려면 deny out
다음에 포트 번호를 사용할 수 있습니다:
OutputRule added
Rule added (v6)
이렇게 하면 서버에서 모든 나가는 SMTP 트래픽이 차단됩니다.
단계 7 — 규칙 삭제
방화벽 규칙을 삭제하는 방법을 알아야 하는 것은 규칙을 생성하는 것만큼 중요합니다. 삭제할 규칙을 지정하는 두 가지 다른 방법이 있습니다: 규칙 번호로 또는 사람이 읽을 수 있는 명칭으로 (규칙을 생성할 때 지정된 방식과 유사하게).
번호별 UFW 규칙 삭제
UFW 규칙을 번호별로 삭제하려면 먼저 방화벽 규칙의 번호가 매겨진 목록을 얻어야 합니다. UFW 상태 명령에는 각 규칙 옆에 번호를 표시하는 옵션이 있습니다. 다음과 같이 표시됩니다:
Numbered Output:Status: active
To Action From
-- ------ ----
[ 1] 22 ALLOW IN 15.15.15.0/24
[ 2] 80 ALLOW IN Anywhere
규칙 번호가 2인 즉, 포트 80(HTTP) 연결을 허용하는 규칙을 삭제하려고 결정하면, 다음과 같이 UFW 삭제 명령에 지정할 수 있습니다:
OutputDeleting:
allow 80
Proceed with operation (y|n)? y
Rule deleted
이 명령은 확인을 요청한 다음 HTTP 연결을 허용하는 규칙인 규칙 2를 삭제합니다. IPv6를 활성화한 경우 해당하는 IPv6 규칙도 삭제해야 합니다.
이름별 UFW 규칙 삭제
규칙 번호 대신에 인간이 읽을 수 있는 명칭으로 규칙을 참조할 수도 있습니다. 이는 규칙의 유형(일반적으로 허용
또는 거부
) 및 해당 규칙의 대상이 된 서비스 이름 또는 포트 번호 또는 사용된 경우 응용 프로그램 프로필 이름에 기반합니다. 예를 들어, 이전에 활성화된 Apache Full
이라는 응용 프로그램 프로필에 대한 허용
규칙을 삭제하려면 다음과 같이 할 수 있습니다:
OutputRule deleted
Rule deleted (v6)
delete
명령어는 서비스를 이름 또는 포트로 참조하여 생성된 규칙에 대해 동일한 방식으로 작동합니다. 예를 들어, 이전에 sudo ufw allow http
로 HTTP 연결을 허용하는 규칙을 설정했다면, 다음과 같이 해당 규칙을 삭제할 수 있습니다:
OutputRule deleted
Rule deleted (v6)
규칙을 지정할 때 서비스 이름이 포트 번호와 교환 가능하므로, 동일한 규칙을 allow http
대신 allow 80
으로도 참조할 수 있습니다:
OutputRule deleted
Rule deleted (v6)
이름으로 UFW 규칙을 삭제할 때, IPv4 및 IPv6 규칙이 존재한다면 둘 다 삭제됩니다.
단계 8 — UFW 상태 및 규칙 확인하기
언제든지 다음 명령어로 UFW 상태를 확인할 수 있습니다:
UFW가 기본적으로 비활성화되어 있는 경우, 다음과 같은 내용이 표시됩니다:
OutputStatus: inactive
UFW가 활성화된 경우, 단계 3을 따랐다면 활성화되어 있어야 합니다. 출력에는 활성화되었음을 나타내는 내용과 설정된 모든 규칙이 나열됩니다. 예를 들어, 방화벽이 어디에서든 SSH (포트 22
) 연결을 허용하도록 설정된 경우, 출력은 다음과 같을 수 있습니다:
OutputStatus: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip
To Action From
-- ------ ----
22/tcp ALLOW IN Anywhere
방화벽이 어떻게 구성되었는지 확인하려면 status
명령어를 사용하십시오.
단계 9 — 방화벽 비활성화 또는 재설정
UFW 방화벽을 사용하지 않기로 결정한 경우 다음 명령을 사용하여 비활성화할 수 있습니다:
OutputFirewall stopped and disabled on system startup
UFW로 생성한 모든 규칙이 더 이상 활성 상태가 아닙니다. 나중에 활성화해야 하는 경우 언제든지 sudo ufw enable
을 실행할 수 있습니다.
이미 UFW 규칙을 구성했지만 처음부터 다시 시작하고 싶은 경우 재설정 명령을 사용할 수 있습니다:
OutputResetting all rules to installed defaults. This may disrupt existing ssh
connections. Proceed with operation (y|n)? y
Backing up 'user.rules' to '/etc/ufw/user.rules.20210729_170353'
Backing up 'before.rules' to '/etc/ufw/before.rules.20210729_170353'
Backing up 'after.rules' to '/etc/ufw/after.rules.20210729_170353'
Backing up 'user6.rules' to '/etc/ufw/user6.rules.20210729_170353'
Backing up 'before6.rules' to '/etc/ufw/before6.rules.20210729_170353'
Backing up 'after6.rules' to '/etc/ufw/after6.rules.20210729_170353'
이로써 UFW가 비활성화되고 이전에 정의된 규칙이 삭제됩니다. 이렇게 하면 UFW로 새로 시작할 수 있습니다. 변경한 적이 있는 경우 기본 정책은 원래 설정으로 변경되지 않습니다.
DigitalOcean 앱 플랫폼을 사용하여 GitHub에서 프론트엔드 애플리케이션을 배포하세요. DigitalOcean이 앱을 확장하는 데 집중할 수 있도록 하세요.
결론
이제 방화벽이 SSH 연결(적어도)을 허용하도록 구성되었습니다. 서버가 필요로하는 다른 들어오는 연결을 허용하고, 불필요한 연결을 제한하여 서버가 기능적이고 안전하도록 하세요.
UFW 구성에 대해 더 알아보려면 UFW Essentials: 일반 방화벽 규칙 및 명령어 자습서를 확인하세요.
Source:
https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-with-ufw-on-ubuntu-22-04