Ubuntu 방화벽 iptables 설정 및 관리

1.  iptables 방화벽 이해 및 설치

여기서는 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: 라우팅 결정이 만들어졌을 때, 패킷들은 하드웨어에 보내지기 전에 이 체인에 들어옵니다.
sudo iptables -L
sudo iptables -S
iptables 설정
[Step 1] 현재 설정 확인

2) 모든 규칙 삭제

현재 설정된 모든 규칙을 삭제합니다. -F 옵션은 모든 체인에 포함되어 있는 규칙을 삭제합니다. -X 옵션은 사용자 정의된 체인을 모두 삭제합니다.

-F 옵션과 -X 옵션으로 모든 체인을 삭제합니다. 모든 규칙을 삭제하고 체인에 연결된 규칙이 있는지 -L 옵션과 -S 옵션으로 확인합니다. 초기 설치 후 명령어를 실행했다면 설정된 규칙이 없기 때문에 출력은 동일합니다.

sudo iptables -F
sudo iptables -X
sudo iptables -L
sudo iptables -S
iptables 설정
[Step 2] 모든 체인 삭제

3) 로컬 체인 추가

로컬 네트워크에 접속이 가능하도록 체인을 추가합니다. 체인을 추가 할때는 -A 옵션을 사용합니다. -i 옵션은 네트워크 인터페이스 이름을 지정하는 옵션입니다.

sudo iptables -A INPUT -i lo -j ACCEPT
iptables 설정
[Step 3] 로컬 연결 추가

4) 인바운드 트래픽 규칙 추가

iptables 사용을 시작하려면 먼저 필요한 서비스에 대해 허용된 인바운드 트래픽에 대한 규칙을 추가해야 합니다. iptables는 연결 상태를 추적할 수 있으므로 아래 명령을 사용하여 설정된 연결을 계속할 수 있습니다. related, established 패킷의 접속을 허용하는 규칙을 추가하며 이는 필요한 서비스에 대해 허용하도록 설정된 연결입니다.

sudo iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables 설정
[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 설정
[Step 5] 설정 저장 및 재시작

3. Iptables 설정(사용법)

  • iptables – [ACD] 체인 규칙 사양 [옵션]
  • iptables -I 체인 [규칙 번호] 규칙 사양 [옵션]
  • iptables -R 체인 규칙 번호 규칙 사양 [옵션]
  • iptables -D 체인 규칙 번호 [옵션]
  • iptables -[LS] [체인 [규칙 번호]] [옵션]
  • iptables – [FZ] [체인] [옵션]
  • iptables -[NX] 체인
  • iptables -E 이전 체인 이름 새 체인 이름
  • iptables -P 체인 타겟 [옵션]
  • iptables -h 도움말 출력

5. Iptables 설정(명령어)

  • –append -A chain      :  체인에 추가
  • –check -C chain          :  체인의 규칙 존재 여부 확인
  • –delete -D chain        :  일치하는 체인 규칙 삭제
  • –delete  -D chain rulenum : 체인의 룰 번호로 삭제  
  • –insert  -I chain [rulenum]  :  규칙 번호로 체인에 삽입 (기본값 1 = 첫 번째)
  • –replace -R chain rulenum : 체인에서 규칙 규칙 번호(1 = 첫 번째) 바꾸기
  • –list -L [chain [rulenum]] : 체인 또는 모든 체인의 규칙 나열
  • –list-rules -S [chain [rulenum]] :  체인 또는 모든 체인에서 규칙 인쇄
  • –flush -F [chain] : 체인의 모든 규칙 또는 모든 체인 삭제
  • –zero -Z [chain [rulenum]] : 체인 또는 모든 체인의 제로 카운터
  • –new -N chain : 새 사용자 정의 체인 만들기
  • –delete-chain -X [chain] : 사용자 정의 체인 삭제
  • –policy  -P chain target : 체인에서 대상으로 정책 변경
  • –rename-chain -E old-chain new-chain : 체인 이름 변경(참조 이동)

6. Iptables 명령어(옵션)

  • –ipv4  -4  :  없음(ip6tables-restore에서 라인이 무시됨)
  • –ipv6  -6  :  오류(iptables-restore에서 라인이 무시됨)
  • –protocol  -p proto  : 프로토콜 번호 또는 이름으로, 예. `tcp’
  • –source  -s : address[/mask][…]   소스 사양
  • –destination  -d : address[/mask][…]   대상 지정
  • –in-interface  -i : 입력 name[+]  네트워크 인터페이스 name ([+] for wildcard)
  •  –jump  -j : 대상, 규칙의 대상(대상 확장 프로그램을 로드할 수 있음)
  • –goto  -g :   체인, 리턴 없이 체인으로 점프
  • –match  -m : 일치 확장 일치(확장 프로그램을 로드할 수 있음)
  • –numeric  -n : 주소 및 포트의 숫자 출력
  • –out-interface  -o : 출력 name[+]  네트워크 인터페이스 name ([+] for wildcard)
  • –table  -t : 테이블, 조작할 테이블 (default: `filter’)
  • –verbose  -v : 자세한 정보 표시 모드
  • –wait  -w [seconds] : 포기하기 전에 xtables 잠금을 획득하기 위한 최대 대기 시간
  • –wait-interval -W [usecs] :xtables 잠금을 획득하기 위한 대기 시간 기본값은 1초
  • –line-numbers : 나열할 때 줄 번호 인쇄
  • –exact  -x : 숫자 확장(정확한 값 표시)
  • –fragment  -f : 두 번째 또는 추가 조각만 일치
  • –modprobe=<command>  : 이 명령을 사용하여 모듈을 삽입
  • –set-counters PKTS BYTES :  삽입/추가 중에 카운터 설정
  • –version   -V : 패키지 버전 출력

7. Iptables 포트 활용

1) openssh 포트