Gom3rye

방화벽 생성 및 제어 본문

현대 오토에버 클라우드 스쿨

방화벽 생성 및 제어

Gom3rye 2025. 6. 5. 17:52
728x90

서버의 방화벽 설정

Linux의 방화벽

리눅스에서는 호스트 방화벽 기능을 위해 iptables를 사용하기도 한다.

  • CentOS7 이상은 iptables 대신에 firewalld를 사용하도록 되어 있고 Ubuntu에서는 UFW(Ubuntu FireWall)을 사용해서 방화벽 서비스를 제공한다.
  • 예전 사용자들은 iptables에 익숙하다.
    • UFW는 iptables의 FrontEnd 역할을 수행하기 때문에 iptables에 대한 기본적인 이해가 필요하다.
  • iptables가 방화벽의 역할처럼 패킷을 차단, 허용하는 등의 필터링 기능을 직접 수행하는 것은 아니고 리눅스 커널에 내장된 netfilter라는 리눅스 커널 모듈을 통해 필터링이 이루어진다.
  • iptables는 netfilter를 이용할 수 있도록 해주는 사용자 공간 응용 프로그램이다.
  • iptables나 firewalld나 UFW는 모두 netfilter의 frontend 역할이다.

(제일 큰 동그라미) Shell > Kernel > HW (안 동그라미)

커널에 netfilter가 있고 응용 프로그램에 iptables, firewalld가 있는 것. 우리는 응용 프로그램 가지고 조작을 하는 거지만 실제 일은 netfilter가 하는 것

iptables

서버에서 허용하거나 차단할 IP나 서비스 포트에 대한 정책을 수립한다.

  • 수립된 정책은 정책 그룹으로 관리한다.
  • 정책 그룹은 트래픽 구간 별로 생성되어, 각 방향에 대해 허용/차단 규칙을 설정한다.
    • INPUT (수신 트래픽)
      • 외부에서 서버로 유입되는 트래픽
      • 예: 클라이언트가 서버의 웹 서비스(80번 포트)에 접속하는 경우
    • OUTPUT (송신 트래픽)
      • 서버에서 외부로 나가는 트래픽
      • 예: 서버가 외부 API에 요청을 보내는 경우
    • FORWARD (포워딩 트래픽)
      • 서버(호스트)가 라우터 역할을 하며 다른 네트워크 간 트래픽을 중계하는 경우 (서버를 통과하는 구간)
      • 일반 서버에서는 잘 안 쓰이고, 라우팅/게이트웨이 역할을 하는 장비에서 사용
      • 예: 내부 네트워크를 NAT로 외부에 연결해주는 경우
  • iptables에는 Filter Table, NAT Table, Mangle Table, Raw Table, Security Table 5가지가 있다.
  • 테이블에는 방향성과 관련된 그룹이 있는데 이 그룹이 체인이다.
  • 필터 테이블에는 서버로 들어오는 트래픽, 나가는 트래픽, 통과하는 트래픽에 따라 INPUT 체인, OUTPUT 체인, FORWARD 체인이 있다.
  • Filter 테이블
    • iptables에서 패킷을 허용하거나 차단하는 역할을 선언하는 영역
  • INPUT, OUTPUT, FORWARD 체인
    • 호스트 기준으로 호스트로 들어오거나 나가거나 호스트를 통과할 때 사용하는 정책들의 그룹, 패킷의 방향성에 따라 각 체인에 정의된 정책이 적용된다.
  • MATCH
    • 제어하려는 패킷의 상태 또는 정보 값의 정의
  • TARGET
    • MATCH에 일치하는 패킷을 허용할지 차단할지에 대한 패킷 처리 방식

네트워크 설정

  • ip 확인
    • hostname -i
    • ifconfig (sudo apt install net-tools로 설치가 되어 있어야 하고 인터페이스 별로 할당된 정보를 출력)
  • 내 네트워크 인터페이스 확인 (Virtual Box에 Ubuntu를 설치하면 enp0s3라는 네트워크 인터페이스가 생성된다.)
    • ip a
  • 인터페이스 별 ip 설정
    • sudo nano /etc/netplan/00-installer-config.yaml
    • 실제로는 파일 이름은 상관없고 확장자만 yaml 이면 된다.

NAT 네트워크 설정 → DHCP 활성화 uncheck

- /etc/hosts 파일에 ip에 알맞은 도메인 네임을 적어줬으니까 이름으로도 통신이 가능한 것!

iptables의 사용

ubuntu의 기존 방화벽 비활성화

  • 상태확인
sudo systemctl status ufw # active 상태
  • 부팅될 때 시작하지 않도록 설정
sudo systemctl disable --now ufw # inactive 되었다.
sudo reboot

  • 중지
sudo systemctl stop ufw

iptables 설치

sudo apt install iptables-persistent -y

상태 확인

sudo systemctl status iptables # Active: active (exited) 

부팅될 때마다 바로 시작하도록 만들어주기

sudo systemctl enable iptables

키고 끄기

sudo systemctl start|stop iptables

리눅스 방화벽 정책 확인

sudo iptables -L

(INPUT : 외부에서 서버로 들어올 때, FORWARD : 서버를 거쳐 갈 때

ACCEPT : 서버에서 외부로 나갈 때)

  • INPUT 작업 예시
    • ACCEPT all -- anywhere anywhere state RELATED, ESTABLISHED : 상태가 related, established인 경우는 모든 출발지에 대해서 허용하도록 룰을 설정한다.
    • ACCEPT icmp -- anywhere anywhere : ICMP 에 대한 허용
    • 거부는 ACCEPT 대신에 REJECT
  • 웹 서버 열어주기
iptables -A INPUT -p tcp --dport 80 -j ACCECT

→ 규칙을 추가할 때는 -A나 --append 옵션을 사용하고 그 뒤에 체인을 기재

→ -p 다음에 프로토콜을 추가하고 --dport 다음에 포트를 추가한 후 허용인지 불가인지를 추가

→ dport는 도착지 포트이고 sport로 출발지 포트를 설정할 수 있는데 출발지 포트는 랜덤이기 때문에 알 수 없다.

→ 출발지나 목적지 IP를 설정하고자 하는 경우는 -s(--source), -d(--destination)을 사용한다.

  • 아파치 웹 서버 설치
sudo apt update
sudo apt install apache2
  • 서비스 시작
sudo systemctl start apache2
master에서 wget localhost
slave1에서 wget http://10.0.2.101 해보기

  • 웹 서버에 외부에서 접근이 안되도록 설정

ex. slave1에서 못 가져오도록 하고 싶으면

kyla@master:~$ sudo iptables -A INPUT -p tcp --dport 80 -j DROP

→ slave1에서 wget http://10.0.2.101 해도 못 가져온다.

⇒ DROP 대신에 ACCEPT를 사용하면 허용

  • rule이 잘 들어갔는지 확인해보기
sudo iptables -L

  • rule 다시 지우기
sudo iptables -D INPUT 1

→ 다시 slave1에서 받을 수 있다. (외부에서 접근 가능)

 

원래 기본은 ufw인데 예전 사람들이 익숙해서 iptables를 많이 사용한다.

⇒ 방화벽의 룰은 위에서 아래로 순차적으로 적용되므로, 특정 트래픽만 통과시키고 나머지를 차단하려면 허용할 트래픽에 대한 룰을 먼저 작성해야 한다. 이후 차단(DROP) 룰은 뒤에 배치하여 나머지 트래픽을 모두 막을 수 있다.

  • 좋은 예시: SSH는 허용하고, 나머지는 차단
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -j DROP

원래 기본은 ufw인데 예전 사람들이 익숙해서 iptables를 많이 사용한다.

  • 특정한 IP만 허용
iptables -A INPUT -p tcp -s 네트워크대역 --dport 포트번호 -j ACCEPT

sudo iptables -A INPUT -p tcp -s 10.0.2.201/32 --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j DROP # 나머지는 다 막기

→ /32 : 단일 IP

→ slave1만 허용하고 나머지는 다 막았다.

  • 룰 삭제
    • iptables -D 체인 라인넘버
    • iptables -F: 모든 규칙 제거
sudo iptables -F
  • 특정 네트워크 대역에 대해서 거부
sudo iptables -A INPUT -p tcp -s 10.0.2.200/30 --dport 80 -j DROP

(sudo iptables -A INPUT -p tcp --dport 80 -j DROP 은 전체가 못 들어오는 것)

0.0.0.0/0 : ip 전체, anywhere

ip/32, ip/255.255.255.255 : ip 1개

⇒ 10.0.2.201, 10.0.2.202를 막고 싶음 → 10.0.2.200/30 으로 해야 200,201,202,203를 막으므로 slave1, 2 다 막을 수 있다.

(10.0.2.203/30 도 똑같다. → ip는 범위 내 아무거나 하나만 들어가면 된다.)

⇒ sudo iptables -A INPUT -p tcp -s 10.0.2.201/31 --dport 80 -j DROP 하면 slave1은 못 하지만 slave2는 받아와버린다.

  • 특정한 IP 범위에 대해서 설정
sudo iptables -A INPUT -p all -m iprange --src-range 시작IP-끝IP -j DROP

sudo iptables -A INPUT -p all -m iprange --src-range 10.0.2.201-10.0.2.202 -j DROP

→ -m 옵션: 패턴 매칭

  • 특정 포트 범위를 막기
    • -m multiport --dports 시작포트:끝포트
    • -m multiport --sports 포트나열
sudo iptables -A INPUT -p all -m iprange --src-range 시작IP-끝IP -j DROP

sudo iptables -A INPUT -p all -m iprange --src-range 10.0.2.201-10.0.2.202 -j DROP
  • 껐다가 키면 룰이 다 reset 된다. (sudo reboot하면)

영구적인 방화벽 설정

iptables 명령으로 설정한 방화벽은 재부팅 되거나 방화벽이 새로 시작되면 소멸된다.

  • 반 영구적으로 설정하고자 하는 경우는 /etc/sysconfig/iptables 파일에 기록하면 된다.

ufw

우분투의 기본 방화벽 서비스

  • 관리 명령
    • ufw 서브명령
  • 옵션
    • enable: 방화벽을 활성화
    • disable: 방화벽을 비활성화
    • default allow | deny | reject [incoming | outgoing]: 방화벽의 기본 동작을 설정
    • status [verbose]: 방화벽의 상태를 출력
    • allow 서비스 | 포트/프로토콜
    • deny 서비스 | 포트/프로토콜
    • delete 명령: 명령으로 설정한 규칙을 제거
  • 사용
sudo apt install ufw
sudo ufw enable
sudo systemctl start ufw # ufw 서비스를 강제로 띄움, 일반적으로 필요 없음

  • http 허용
sudo ufw allow http

  • telnet 거부
sudo ufw deny telnet

  • 2개의 규칙 삭제
sudo ufw delete allow http
sudo ufw delete deny telnet

확인은 sudo ufw status

→ slave1, 2에서 wget 10.0.2.101 안됨

sudo ufw allow http를 해야 slave1, 2에서 가져올 수 있다.

kyla@slave1:~$ ssh kyla@10.0.2.101 도 안됨 → 방화벽 때문에

  • 포트 번호로 허용하기
sudo ufw allow 80/tcp

→ slave1, 2에서 다시 가져올 수 있음 (wget 10.0.2.101 가능)

  • 특정 IP 주소에만 설정
    • ex. 10.0.2.201만 허용 (slave1만 허용)
    sudo ufw allow from 10.0.2.201 to any port http
    

 

 

 

 

 

참고)

어디에 있는지 위치를 찾고 싶을 때

which iptables # 파일 위치 나올 것
ls -l 파일 위치 # 어떤 파일인지 볼 수 있다.

항목                                                     NAT 네트워크                                 NAT + 포트 포워딩

인터넷 접속 가능 여부 가능 (내부 → 외부) 가능
외부에서 접근 가능 여부 불가능 가능 (포트 포워딩 필요)
사용 목적 내부에서 인터넷 사용 외부에서 내부 시스템에 접근 허용
일반 사용 예 웹 브라우징, 업데이트 웹 서버, SSH 접속 등
728x90
반응형

'현대 오토에버 클라우드 스쿨' 카테고리의 다른 글

클라우드  (4) 2025.06.09
방화벽 생성 및 제어  (0) 2025.06.09
보안  (0) 2025.06.04
네트워크  (0) 2025.06.02
네트워크 장비  (0) 2025.05.30