Linux 실습일지

Linux 실습일지(14) - 방화벽과 Docker

s-jiun 2023. 2. 2. 16:15
반응형
실습과제 결과

 

이번 실습과제는 방화벽 컴퓨터를 구축하고 사설 IP를 통해 Server(b)에 구축된 웹 서버에 접속해보는 것이었다.

아래 사진은 Client에서 내부 웹 서버로 접속해본 것인데, 호스트 컴퓨터에서 접속하는 것은 성공하지 못했다...

실패 원인에 대한 분석은 아래 [문제가 발생하거나 고민한 내용]에서 작성하였다.

(+ 21.06.13 추가) 문제의 해결방법을 찾았다! 해결한 내용은 [문제가 발생하거나 고민한 내용]에 작성해놓았다.

 

새로 배운 내용

 

이번 수업에서는 방화벽과 도커에 대해 학습하였다. 방화벽이란 네트워크 트래픽을 모니터링하고 제어하는 네트워크 보안 시스템을 의미한다. 우리는 방화벽에 설정된 일정한 규칙을 통해 방화벽 내부의 사설IP에서 외부 네트워크와 통신할 수 있다. 방화벽은 구현 방법에 따라 SW 방화벽, HW 방화벽, NPU 방화벽으로 나눌 수 있으며 NPU 방화벽의 경우 SW와 HW를 결합한 방식이다.

방화벽이 발전해온 역사를 정리해보면 다음과 같다.

- 1세대 방화벽(패킷 필터) : 패킷 단위 검사를 통해 특정 IP와 PORT를 허용하거나 거부하는 방식

- 2세대 방화벽(스테이트풀 인스펙션) : 세션 단위 검사를 통해 패킷 단위 검사로 인한 접속시간 지연을 줄여주는 방식

- 3세대 방화벽 (애플리케이션 방화벽) : 응용 프로그램에 미칠 영향을 분석하는 방화벽으로, 도메인 주소를 이용하여 정책을 수집

방화벽은 사설 IP를 이용하여 내부 컴퓨터 사이의 통신은 허용하고 외부 인터넷과의 통신은 부분적으로 제한하는 방식으로 컴퓨터의 악성 코드 감염을 예방한다. 이때 사설 IP가 외부 인터넷에 접속하기 위해서 IP 마스커레이딩이 사용되는데, 이는 사설 IP가 공인된 IP주소로 변환되어 보이도록 하는 기능이다.

방화벽 컴퓨터를 구성하는 방법은 다음과 같다.

우선 VMware에서 server(b)의 Network Adapter 설정을 Bridged로 변경하여 준다.

server(b)에 접속한 후, root계정으로 로그인하고 /etc/netplan/00-installer-config.yaml 파일을 열어 아래와 같이 내용을 수정한다.

재부팅한 후 hostname -I 명령을 입력하면 다음과 같이 변경된 IP주소가 나타날 것이며 외부 네트워크로는 접속이 되지 않을 것이다.

다음으로 VMware에서 server(b)와 마찬가지로 Client(Kubuntu)의 Network Adapter 설정을 변경한다. 접속 후 '네트워크 연결 설정'에서 IPv4 설정을 다음과 같이 변경한다.

마찬가지로 Client도 재부팅해주고 server(b)로 ping을 보내보자.

다음으로 server를 설정해줄 차례이다. 우선 VMware에서 server의 Network Adapter 설정에 들어가 Network Adapter를 하나 더 추가해주고 이를 bridged로 설정한다. server에 로그인한 후 이더넷 설정에 들어가 아래와 같이 IPv4 설정을 변경한다.

server를 재부팅해주고 net-tools를 설치해준 후 ifconfig로 ens32와 ens35의 IP주소를 확인한다.

아래 사진들은 각각 server, server(b), 호스트 컴퓨터의 명령 프롬프트창에서 ping테스트를 한 것이다. 호스트 컴퓨터의 명령 프롬프트창에서 수행한 ping테스트는 외부 컴퓨터에서 방금 생성한 사설 네트워크 접속로 접속이 가능한지를 검사하기 위함이다. 마지막 사진을 확인해보면 server의 ens32(외부 네트워크와 통신이 가능한 IP)로는 통신이 되지만 사설 네트워크의 IP인 ens35와는 통신이 되지 않음을 확인할 수 있다.

이제는 방화벽 정책을 설정해줄 차례이다. 우선 server(방화벽 컴퓨터)에 root계정으로 접속한 후 다음과 같이 명령을 입력하여 외부 컴퓨터가 내부로 접속하는 것을 무시한다. 즉, 외부에서 내부 컴퓨터에 접속을 금지한다.

내부 컴퓨터는 외부 인터넷을 사용할 수 있도록 패킷 포워딩을 설정해준다. 이는 /etc/sysctl.conf 파일의 28행의 내용을 주석 제거해주면 된다.

echo 1 > /proc/sys/net/ipv4/ip_forward

명령을 입력하면 설정한 내용을 적용할 수 있으며

cat /proc/sys/net/ipv4/ip_forward

명령을 입력하여 제대로 설정되었는지 확인해볼 수 있다.

다음으로 ens35로 모든 패킷이 통과할 수 있도록 다음과 같이 설정한다.

규칙이 잘 적용되었는지 확인하고,

ens32로도 모든 패킷이 통과할 수 있도록 다음과 같이 설정한 후,

ens32의 마스커레이드를 허가한다.

설정이 끝난 후 iptables-save > /etc/iptables.rules 명령어로 설정 내용을 적용시켜주고 Client로 들어가면 인터넷을 이용할 수 있는 것을 확인할 수 있다.

이제는 server(b)에 웹 서버를 구축할 것이다. 저번에는 APACHE로 웹 서버를 구축해 보았으니 이번에는 docker를 활용하여 웹 서버를 구축해볼것이다. 우선 server(b)에서 apt update를 해주고 다음과 같은 순서대로 명령어를 입력해준다.

1. apt install apt-transport-https ca-certificates curl gnupg lsb-release

2. curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg--dearmor-o /usr/share/keyrings/docker-archive-eyring.gpg

3. echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

4. apt update

5. apt install docker-ce docker-ce-cli containerd.io

위 과정을 수행하고 나면 docker가 잘 설치되어 있을 것이다. docker run hello-world 명령을 입력하여 docker를 실행시켜보자.

다음으로 docker run -it ubuntu bash 명령으로 docker의 bash를 설치한다.

exit 명령을 입력하여 server(b) root 계정으로 되돌아온 뒤 docker pull ubuntu:18.04 명령을 입력하여 ubuntu 이미지를 다운받는다. 18.04는 버전을 의미하며, 이를 입력하지 않을 시 자동으로 최신 버전이 설치된다.

이제는 docker에 mysql 이미지를 다운받아야 한다. 위처럼 pull 명령을 입력하여 다운받아도 되고, 바로 docker run mysql 명령을 입력하면 설치와 실행을 한 번에 수행할 수 있다.

mysql을 설치했으면 컨테이너를 생성해야 한다.

docker run --name mysql -container -e MYSQL_ROOT_PASSWORD=1234 -d -p 3306:3306 mysql:latest

위 명령은 mysql-container 라는 이름의 컨테이너를 비밀번호 1234, 연결 포트 3306으로 설정하여 생성한다는 의미이다. 이 때 실행 버전은 mysql:latest 버전으로 설정해주었다.

다음으로 도커 컴포즈를 설치해주었다. 도커 컴포즈는 다중 컨테이너 도커 애플리케이션을 실행하기 위한 도구이다. 아래와 같은 명령을 입력하면 된다.

chmod +x /usr/local/bin/docker-compose 명령으로 docker-compose에 대한 권한 설정을 해준다. 마지막으로 도커 컴포즈를 통해 워드프레스를 설치하기 위해서 yml파일을 생성해야 한다. 아래와 같이 docker-compose.yml 파일을 생성해준다.

작성이 끝났으면 저장 후 docker-compose up -d 명령으로 워드프레스를 설치해준다. 설치가 끝난 후 docker ps 명령을 입력하면 워드프레스가 설치된 것을 확인할 수 있다.

server(방화벽 컴퓨터)로 돌아가

iptables --table nat --append PREROUTING --in-interface ens32 --jump DNAT --proto tcp --dport 80 --to-destination 172.16.1.20

ufw allow http

명령으로 외부 컴퓨터가 방화벽 서버의 공인된 IP로 웹 서버롤 요청할 경우 내부에서 서비스할 수 있도록 해준다.

iptables-save 명령으로 설정 내용을 적용시켜 준다.

 

문제가 발생하거나 고민한 내용

 

이번 실습에서는 리눅스를 두 번 다시 설치하였다.

첫 번째 ) server(b)에 웹 서버가 구축되어 있는 채로 방화벽 컴퓨터를 설치했던 것이 문제였다. 방화벽 컴퓨터 설치 후 웹 서버로 접속하려다 보니 자꾸 웹 서버가 기존의 IP주소(방화벽 서버 설치 전 server(b)의 IP주소)로 접속하려고 하여 아예 모두 지우고 다시 설치한 후 다시 실습을 진행하였다.

두 번째) 방화벽 서버 구축 후 server(b)에 도커를 설치하고 워드프레스를 설치하였다. 설치 후 Client(Kubutu)에서는 웹 서버로 접속이 되지만 호스트 컴퓨터에서는 웹 서버로 접속이 되지 않았다. 그래서 iptables 규칙 설정부터 다시 해줬는데, 아래와 같이 호스트 컴퓨터에서 접속이 되지 않았다.

그래서 server에 다시 들어가보았는데, server의 ens32에서 무언가 문제가 발생한 듯하다.

하지만 이더넷 설정에 들어가 보아도 문제를 발견할 수가 없었다. 외부로 ping을 보내보아도 네트워크가 외부로 연결이 되지 않음을 알 수 있다.

구글링을 해보아도 원인을 찾을 수가 없어, 계속 알아보는 중이다. 정 안되면 지우고 다시 설치해야지... 이를 해결하게되면 블로그에 추가로 포스팅하겠다.

(+ 21.06.13 추가 포스팅)

ens32 연결 불량의 해결 방법을 찾았다. 방화벽을 일단 disabled하고 ens32의 연결을 끊어 버렸다가 다시 연결하였더니 잘 되더라...

 

회고

 

1학기 동안의 리눅스 서버 실습 수업이 끝났다. 많이 힘들 때도 있었지만 그것을 이겨내고 오류를 찾아내어 성공시키면 그만큼 기쁨도 큰 수업이었던 것 같다. 아직 부족한 것이 많지만, 앞으로도 계속 리눅스를 사용해보면서 익숙해질 수 있도록 노력해야겠다. 한 학기 동안 모두 수고 많으셨습니다!

반응형

 

반응형