여기서는 Nginx 웹서버 설치를 진행합니다. 리눅스에서 설치되는 웹 서버는 Nginx 웹서버와 apache 웹서버로 나눠지며 다음과 같은 차이점을 갖고 있습니다. 아파치는 오픈 소스 HTTP 서버인 반면 Nginx는 오픈 소스, 고성능 비동기 웹 서버 및 역방향 프록시 서버입니다.
아파치 HTTP 서버의 개발 및 발전은 전 세계 사용자 커뮤니티(Apache Software Foundation)에서 관리 및 유지되지만 Nginx는 2011년에 설립된 동일한 이름의 회사에서 유지 및 관리 됩니다.
Apache는 클라이언트 요청 및 웹 트래픽을 처리하는 다양한 다중 처리 모듈을 제공하지만 Nginx는 최소한의 하드웨어 리소스로 여러 클라이언트 요청을 동시에 처리하도록 설계되었습니다.
아파치에서 단일 스레드는 하나의 연결과 연결되지만 Nginx의 단일 스레드는 여러 연결을 처리할 수 있다. 이 프로세스는 메모리를 적게 소모하여 성능이 향상시킵니다.
아파치 HTTP Server에는 확장성이 없는 다중 스레드 아키텍처지만 Nginx는 여러 클라이언트 요청을 처리하기 위한 비동기 이벤트 기반 접근 방식을 따릅니다.
아파치 서버는 기존의 메서드를 사용하여 정적 콘텐츠를 제공하고 웹 서버 자체 내에서 기본적으로 동적 콘텐츠를 처리한다. 반면 Nginx는 동적 콘텐츠를 내부적으로 처리할 수 없고 위해 외부 프로세스에 의존합니다.
2. Nginx 웹서버 설치
apt update와 apt upgrade로 패키지 정보를 업데이트 합니다. list 옵션으로 nginx와 관련된 패키지를 확인합니다. nginx 설치 명령어로 nginx 웹서버를 설치합니다.
sudo netfilter-persistent save sudo netfilter-persistent reload
[Step 2] iptables 저장 및 reload
2) VirtualBox 포트 추가
VirtualBox에 포트를 추가해야 호스트 컴퓨터의 IP 또는 localhost(127.0.0.1)에서 접속이 가능합니다. 그리고 공유기를 사용하고 있다면 공유기의 DMZ기능이나 공유기 포트 포워딩 기능을 사용하면 외부에서도 접속이 가능합니다. 여기서는 공유기의 DMZ 설정에 대해서는 다루지 않습니다.
VirtualBox의 상세한 절차를 알고 싶다면 아래 링크를 클릭해서 확인할 수 있습니다.
여기서는 Ubuntu 방화벽 iptables 설정 및 관리에 대해 이야기 합니다. 방화벽 관리의 대부분은 네트워크에 트래픽 제한을 적용할 개별 규칙 및 정책을 결정하는 것입니다.
Ubuntu는 기본 방화벽으로 ufw를 제공하고 있으나 iptables을 사용하면 규칙이 적용되는 구조적 프레임워크를 상세하게 관리할 수 있습니다.
우선 ufw 방화벽 사용을 중지하고 iptables 패키지를 활용하여 방화벽을 구성하는 방법으로 진행됩니다. iptables은 합리적인 기본값을 제공하고 확장성을 장려하는 프레임워크를 설정하는 데 중점을 두고 있습니다.
2. Iptables 설정(초기)
방화벽은 두 가지 방법 중 하나로 구성할 수 있습니다. 기본 규칙을 설정하여 특정 규칙으로 원치 않는 트래픽을 허용한 다음 차단하거나 규칙을 사용하여 허용된 트래픽을 정의하고 다른 모든 것을 차단할 수 있습니다. 후자는 클라우드 서버에 액세스하려고 시도해서는 안 되는 연결을 반응적으로 거부하지 않고 선제적으로 트래픽을 차단할 수 있으므로 종종 권장되는 접근 방식입니다.
1) iptables 현재 규칙 확인
Ubuntu 서버는 어떠한 제한도 적용되지 않지만 나중에 참조할 수 있도록 현재 iptables 규칙을 확인합니다. 리스트 확인은 -L 옵션 또는 -S옵션으로 확인할 수 있습니다. -L 옵션은 체인에 대한 규칙의 리스트화 하여 보여주는 반면 -S 옵션은 체인을 출력합니다.
출력하면 input, forward, output의 세가지 체인 목록이 출력됩니다. 체인 이름은 각 목록의 규칙이 적용될 트래픽을 나타내며, 입력은 클라우드 서버로 들어오는 모든 연결입니다. 출력은 외부로 나가는 모든 트래픽이며 통과하는 모든 트래픽에 대한 연결입니다. 또한 트래픽이 특정 규칙과 일치하지 않는 경우 트래픽 처리 방법을 결정하는 정책 설정이 있으며 기본적 설정은 허용입니다.
PREROUTING: 패킷들은 라우팅 결정이 만들어지기 전에 이 체인에 포함됩니다..
INPUT: 패킷이 로컬상에서 전달될 경우 체인의 규칙을 따릅니다.
FORWARD: 라우팅되고 로컬 전달이 아닌 모든 패킷들은 전달됩니다.
OUTPUT: 서버에서 보내진 패킷들의 경우 체인의 규칙을 따릅니다.
POSTROUTING: 라우팅 결정이 만들어졌을 때, 패킷들은 하드웨어에 보내지기 전에 이 체인에 들어옵니다.
로컬 네트워크에 접속이 가능하도록 체인을 추가합니다. 체인을 추가 할때는 -A 옵션을 사용합니다. -i 옵션은 네트워크 인터페이스 이름을 지정하는 옵션입니다.
sudo iptables -A INPUT -i lo -j ACCEPT
[Step 3] 로컬 연결 추가
4) 인바운드 트래픽 규칙 추가
iptables 사용을 시작하려면 먼저 필요한 서비스에 대해 허용된 인바운드 트래픽에 대한 규칙을 추가해야 합니다. iptables는 연결 상태를 추적할 수 있으므로 아래 명령을 사용하여 설정된 연결을 계속할 수 있습니다. related, established 패킷의 접속을 허용하는 규칙을 추가하며 이는 필요한 서비스에 대해 허용하도록 설정된 연결입니다.
sudo iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
[Step 4] 서비스 연결 허용
5) 규칙 저장 및 재시작
체인을 추가했다고 바로 반영되는 것은 아닙니다. reload 명령어를 사용해서 저장된 체인이 반영되도록 해야 합니다. 하지만 reload 명령어만 사용하면 재시작 된 이후에는 추가된 체인이 사라지게 됩니다. 그래서 변경한 체인을 저장하고 재시작해야 합니다.
저장은 service+netfilter-persistent+save 명령어로 실행합니다. netfilter-persistent 명령은 flush, force-reload, reload, restart, save, start ,stop의 실행 명령어로 구성되어 있습니다.
변경된 체인을 저장하고 반영합니다.
sudo service netfilter-persistent save
sudo service netfilter-persistent reload
방화벽은 서버 보안에서 중요한 단계로 iptables 설치 및 활성화를 다룹니다. 방화벽 관리의 대부분은 네트워크에 트래픽 제한을 적용할 개별 규칙 및 정책을 결정하는 것입니다.
1. iptables 방화벽 이해 및 사전 준비
Ubuntu는 기본 방화벽으로 ufw를 제공하고 있으나 iptables을 사용하면 규칙이 적용되는 구조적 프레임워크를 상세하게 관리할 수 있습니다.
우선 ufw 방화벽 사용을 중지하고 iptables 패키지를 활용하여 방화벽을 구성하는 방법으로 진행됩니다. iptables은 합리적인 기본값을 제공하고 확장성을 장려하는 프레임워크를 설정하는 데 중점을 두고 있습니다.
1) 사전 준비
ufw 방화벽 상태를 확인하고 방화벽을 중지합니다. Ubuntu 설치부터 함께 따라왔다면 ufw 방화벽을 active(활성화) 되어 있습니다. 이때 sudo ufw status 명령을 입력하면 inactive(비활성화)로 나옵니다. iptables을 설치하는데 ufw 방화벽을 비활성화하지 않는다면 충돌이 발생합니다. 서비스를 관리하는 명령어는 systemctl 또는 [서비스명.service]의 형태로 관리할 수 있습니다.
서비스를 중지는 stop 명령어를 활용할 수 있지만 stop은 시작 활성화에 영향을 미치지 않습니다. 반면 disable 명령은 시작 시 서비스를 비활성화시키며 –now 명령어를 추가면 즉시 반영됩니다. 아래 명령어로 ufw 서비스를 비활성화하고 reboot 명령으로 재시작 합니다.
sudo systemctl disable --now ufw
reboot
[Step2] ufw 비활성화
sudo systemctl status ufw
[Step3] ufw 상태 확인
2. iptables 설치 및 활성화 문제 확인
1) iptables 설치(iptables-persistent)
ufw를 중지했다면 iptables 패키지를 설치합니다. Iptables 설치 후 규칙 세트를 저장하고 부팅 시 자동으로 적용되도록 할 수 있습니다.
sudo apt install iptables-persistent
[Step4] Y를 입력하여 계속 진행[Step5] IPv4 rules에 대해 YES 선택 후 Enter[Step6]IPv6 rules에 대해 YES 선택 후 Enter
2) iptables 시작 시 활성화(enable)
Iptables 상태 확인
sudo systemctl status iptables
[Step7]iptables 상태 확인
Iptables 상태 시작 시 활성화
sudo systemctl enable iptables
reboot
[Step8]iptables 활성화 명령어 및 재시작
3) iptables 활성화 문제 확인(시작 시 자동 활성화 안됨)
Iptables 상태 확인
ubuntu 20에서는 정상적으로 활성화되지만 ubuntu 22에서는 활성화가 안되어 있습니다. iptables의 상태를 확인하면 별칭(alias)이 등록되어 있지 않기 때문에 별칭을 등록해야 합니다.
sudo systemctl status iptables
[Step9]iptables 상태 확인
3. iptables 별칭 등록 및 시작 시 활성화
1) Iptables 시작 활성화를 위한 별칭(alias) 등록
iptables.service의 위치는 상태에서 확인이 가능하고 nano 편집기로 파일을 불러옵니다. vi 편집기를 사용해도 무방합니다. 파일 아래쪽 [install] 하단에 별칭을 등록해 줍니다. 여기서는 Alias=iptables.service로 등록합니다.
sudo nano /lib/systemd/system/iptables.service
[Step10]iptables 서비스 alias 등록[Step11]편집기를 활용하여 내용 추가(Alias=iptables.service)
Iptables를 비활성화 후 다시 활성화를 진행합니다. 이때 –now 명령을 추가하면 활성화와 함께 서비스가 함께 실행됩니다.
서버를 재시작하여 서비스가 시작 시 활성화 되는지 확인합니다. 아래 이미지처럼 netfilter-persistent.service와 dependency 충돌이 발생하면 netfilter-persistent.service를 재시작합니다. systemctl 명령어로 iptables 서비스가 정상적으로 활성화 된 것을 확인할 수 있습니다.
reboot
sudo systemctl status iptables
sudo systemctl restart netfilter-persistent.service
[Step12]재시작 후 iptables 자동 활성화 확인
3. iptables 모든 연결 차단
앞의 설정은 INPUT, FORWARD, OUTPUT가 모두 허용된 설정입니다. INPUT, FORWARD는 모두 닫아 주도록 하겠습니다. 구성을 출력하면 INPUT, FORWARD가 닫힘으로 표시되어 있습니다. 앞으로 서비스를 추가하면 관련 서비스에 대한 포트만 오픈하여 실행되도록 하겠습니다.
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -S
[Step13]INPUT, FORWARD DROP
변경된 설정을 저장하고 reload 합니다. reload는 재시작하지 않고 규칙을 적용하기 위한 명령입니다. 다음 코드를 실행하지 않으면 변경한 정보가 ubuntu 재시작시 적용되지 않습니다.
sudo netfilter-persistent save
sudo netfilter-persistent reload