리눅스 서버 방화벽 설정 - iptables (2)

JIWON·2025년 6월 5일

Linux

목록 보기
16/20
post-thumbnail

🐼 방화벽 설정 - iptables 사용

1️⃣ Ubuntu의 기존 방화벽(UFW) 비활성화

  • 상태확인
    sudo systemctl status ufw

    • active 상태
  • 부팅될 때 시작하지 않도록 설정
    sudo systemctl disable --now ufw
    reboot

  • 다시 상태확인
    sudo ufw status

    • status 결과가 inactive 이면 비활성화 완료.

2️⃣ iptables 설치

  • iptables 설치
    sudo apt install iptables-persistent -y

    • 설치 중에 현재 iptables 규칙을 저장할지 물어보면 "Yes"를 선택합니다.

    • 현재 설정된 iptables 규칙이 아래 경로에 저장됩니다:
      IPv4 규칙: /etc/iptables/rules.v4
      IPv6 규칙: /etc/iptables/rules.v6

    • 그리고 이 파일들은 부팅 시 자동으로 적용됩니다.

  • 상태확인
    sudo systemctl status iptables

    • active 상태

3️⃣ iptables 정책 확인

💠 리눅스 방화벽 정책 확인

  • sudo iptables -L

  • INPUT : 외부에서 서버로 들어올 때

  • FORWARD : 서버를 거쳐갈 때

  • OUTPUT : 서버에서 외부로 나갈 때

💠 INPUT 예시

Chain INPUT (policy DROP)
num  target     prot opt source        destination
1    ACCEPT     all  --  anywhere      anywhere     state RELATED,ESTABLISHED
2    ACCEPT     icmp --  anywhere      anywhere     
3    REJECT     all  --  anywhere      anywhere     reject-with icmp-port-unreachable
  • 상태가 RELATED, ESTABLISHED 인 경우는 모든 출발지에 대해 허용하도록 룰을 설정
  • ICMP 에 대한 허용
  • 거부 ,...
  • 방화벽의 룰은 위에서부터 적용한다

4️⃣ iptables 규칙 기본 구조

💠 규칙 기본 구조

sudo iptables -A [체인] -p [프로토콜] --dport [포트번호] -j [동작]
  • 구성 요소의미
    -A--append규칙 추가 (Append)
    [체인]INPUT, OUTPUT, FORWARD 중 하나
    -p프로토콜 (tcp, udp, icmp 등)
    --dport목적지 포트 번호
    --sport출발지 포트번호(출발지포트는 랜덤이기 때문에 알 수 x )
    -j동작(ACCEPT, DROP, REJECT 등)
    -s--source출발지 IP 설정
    -d--destination목적지 IP 설정
  • 주요 동작( -j 옵션)

    동작설명
    ACCEPT패킷 허용
    DROP패킷 버림 (상대방은 응답 없음)
    REJECT패킷 거부 + 거절 메시지 전송 (ICMP 등으로 응답)

5️⃣ 아파치 웹 서버 실행

💠 아파치 웹 서버 설치

sudo apt update
sudo apt install apache2

💠 서비스 시작

sudo systemctl start apache2

💠 HTTP 요청

  • wget localhost
    현재 컴퓨터(localhost)에서 HTTP 요청을 보내는 명령어

💠 slave1에서 master 서버 http 요청

  • wget http://10.0.2.101 : 마스터에서 가져옴
    -> 성공

6️⃣ 규칙 설정 후 다시 요청 확인

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

  • sudo iptables -A INPUT -p tcp --dport 80 -j DROP
  • iptables -L

💠 slave1에서 master 서버 http 요청

  • wget http://10.0.2.101
    -> 방화벽 설정으로 실패

7️⃣ 규칙 지우기

  • sudo iptables -D INPUT -p tcp --dport 80 -j DROP

🥑 iptables 규칙 설정 실습

일단 규칙이 전부 없는 상태로 시작한다.

💠 특정 IP만 허용

  • 구조:
    iptables -A INPUT -p tcp -s 네트워크대역 --dport 포트번호 -j ACCEPT

  • 설정:
    iptables -A INPUT -p tcp -s 10.0.2.102/32 --dport 80 -j ACCEPT : 특정 IP 허용
    sudo iptables -A INPUT -p tcp --dport 80 -j DROP : 모든 IP 막기

다른 IP는 막고 특정 IP(slave1, 10.0.2.102/32)만 허용했다.
룰은 위에서부터 적용되기 때문에 허용해주는 규칙이 모든 IP를 거부하는 규칙보다 위에 있어야한다.


💠 룰 삭제

iptables -D 체인 라인넘버 : 룰 삭제

  • 예시:
    sudo iptables -D INPUT 1

iptables -F : 모든 규칙 제거


💠 특정 네트워크 대역에 대해서 거부

  • IP 10.0.2.10210.0.2.103만 포트 80 (HTTP) 접근을 차단하려는 것.
    iptables -A INPUT -p tcp -s 10.0.2.102/31 --dport 80 -j DROP

📌 10.0.2.102/31 이 의미하는 IP 범위

  • /31은 서브넷 마스크가 255.255.255.254

  • 이는 딱 두 개의 IP만 포함:

    • 10.0.2.102
    • 10.0.2.103
10.0.2.102 = 01100110
10.0.2.103 = 01100111
                    ↑ 마지막 비트만 다름

/31 마스크는 마지막 비트만 호스트 비트이므로, 이 두 IP가 포함됨.

이 규칙을 적용하고 slave1(10.0.2.102)slave2(10.0.2.103)에서 http 요청을 보내면 거부당한다.

하지만 이 네트워크 대역안에 없는 master1(10.0.2.104)는 http 요청이 가능하다


💠 특정 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.102-10.0.2.103 -j DROP

이 규칙을 적용해도 slave1(10.0.2.102)slave2(10.0.2.103)에서 http 요청을 보내면 거부당한다.


💠 특정 포트 범위를 막기

-m multiport --dports 시작포트-끝포트
-m multiport --sports 포트1 포트2 포트3 : 포트 나열


🥨 영구적인 방화벽 설정

  • iptables 명령으로 설정한 방화벽은 재부팅 되거나 방화벽이 새로 시작되면 소멸된다
  • 반 영구적으로 설정하고자 하는 경우는 /etc/sysconfig/iptables 파일에 기록을 하면 된다.

0개의 댓글