본문으로 바로가기

방화벽 관리, 포트포워딩, 리치 규칙

category MLOps/Linux 2022. 1. 28. 15:52

1. 방화벽

1) 개념

- 시스템 보안을 위해 네트워크 패킷 제어

- 시스템 외부에 별도의 장비로 존재할 수 있음

- 시스템 자체적으로 방화벽 규칙 설정이 필요

- CentOS의 경우 firewalld라는 서비스를 이용해서 규칙 제어

 

2) 구조

- 커널에 netfilter 라는 장치로 실질적인 패킷을 제어

- 해당 장치를 사용자가 제어하기 위해 firewalld 서비스 사용 (이전에는 iptables 사용)

 

2. firewalld

1) 장점

- 사용자 공간에서의 설정 방식 제공
- 서비스 이름에 대한 포트매핑 설정 제공
- 여러 가지 영역 설정으로 다양한 규칙 세팅 가능
- 규칙을 변경해도 서비스를 재시작할 필요가 없음

 

2) firewalld 파일 경로 (xml 파일형태로 보관)

- /usr/lib/firewalld: firewalld 기본 구성 + 관련된 파일 + 대비용 파일 등

- /etc/firewalld: 설정파일과 규칙

 

3) frewalld 설정

가) 실행중(runtime)설정과 영구(permanent)설정

- runtime 설정은 시스템 재부팅 또는 firewalld.service 재시작 시 삭제

- permanent 설정은 /etc/firewalld/services 디렉토리에 저장된 규칙을 유지시켜주는 설정

 

나) 사전에 정의된 영역 (pre-defined zone)

- firewalld는 zone이라는 개념 사용 -> 패킷을 카테고리처럼 분류해서 처리

- public (default zone), internal, home, external 등이 있음

- 기본적으로 들어오는 모든 패킷 거부하지만 관리자가 추가하거나 사전에 정의된 영역에는 이미 규칙이 추가돼있음

 

다) 사전에 정의된 서비스 (pre-defined service)

- firewalld는 서비스 이름과 포트번호 및 프로토콜을 미리 매핑시켜 놓은 pre-defined service 제공

ex) 서비스 이름인 http만 알고 있으면 자동으로 매핑되어 있는 80 포트의 TCP프로토콜을 방화벽 규칙에 추가 가능

 

라) D-Bus API 사용

- 메세지 버스 시스템

- 애플리케이션 간의 통신을 지원하는 D-Bus 인터페이스를 사용하여 서비스나 애플리케이션에 방화벽 규칙 설정 용이

 

4) 동작 원리

- active zone (활성화된 영역)의 규칙을 바탕으로 처리

- 네트워크 패킷이 들어오면 출발지 주소 (source address)를 살펴보고 패킷의 출발지 주소에 해당하는 규칙이 설정된 영역을 찾음

-> 만약 어떤 영역에도 출발지 주소에 해당하는 규칙이 없으면 해당 패킷의 인터페이스 규칙이 존재하는 영역으로 전달

ex) ip주소 192.241.2.128으로 firewalld가 설정된 시스템으로 ssh 접속 시도

- 시스템 주소에 해당하는 네트워크 규칙을 포함한 영역이 있는지 확인

- pre-defined zone이 기본값이라고 가정하면 public 영역으로 전달

- public 영역에서 요청한 서비스를 허용하고 있는지 판단

- public 영역은 기본적으로 ssh 서비스 허용하기 때문에 접속 허용

 

3. firewall-cmd

1) 상태 및 정보확인

# 실행 상태 확인
firewall-cmd --state

# pre-defined zone check
firewall--cmd --get_zones

# pre-defined service check
firewall--cmd --get-services

# active zone check
firewall-cmd --get-active-zones

# default zone check
firewall-cmd --get-default-zone

# 설정된 규칙 확인
firewall-cmd --list-all --zone=home

 

2) 규칙 설정

# default zone 설정
firewall-cmd --set-default-zone=<zone-name>

# 특정 영역에 인터페이스 연결 추가
# 출발지 주소규칙을 적용받지 않는 특정 네트워크 인터페이스를 통해 전송된 패킷을 특정 영역으로 연결하여 방화벽 규칙 적용
firewall-cmd --add-interface=<interface-name> --zone=<zone-name>

# 영역에 연결된 인터페이스 변경
firewall-cmd --change-interface=<interface-name> --zone=<zone-name>

 

3) 출발지 주소 규칙 추가 및 제거

# source address 규칙 추가
firewall-cmd --add-source=192.168.0.0/24 --zone=<zone-name> --permanent

# source address 규칙 제거
firewall-cmd --remove-source=192.168.0.0/24
# --permanent 옵션 사용하지 않으면 runtime 설정만 변경
# permanent 설정에 설정된 규칙은 반드시 --perrmanent 옵션 추가하여 제거

 

4) pre-defined service 규칙 추가 및 제거

# pre-defined service 추가
firewall-cmd --add-service=ssh --zone=<zone-name>

# pre-defined service 제거
firewall-cmd --list-services --zone=<zone-name>
firewall-cmd --remove-service=ssh

 

5) port 규칙 추가 및 제거

# 포트 규칙 추가
firewall-cmd --add-port=4000/tcp --zone=<zone-name>

# 포트 규칙 제거
firewall-cmd --remove-port=4000/tcp --zone=<zone-name>

 

6) 프로토콜 규칙 추가 및 제거

- TCP/UDP 프로토콜과는 다른 의미로 사용

-> 통신규약 프로토콜 자체를 의미

- /etc/protocols에서 확인가능

# 프로토콜 규칙 추가
firewall-cmd --add-protocol=icmp --zone=<zone-name>

# 제거
firewall-cmd --remove-protocol=icmp --zone=<zone-name>

 

4. 포트 포워딩

- 포트번호를 이용해서 외부에서도 내부의 시스템으로 접근 가능한 경로를 제공
- 접근하는 포트와 실제 사용하는 다른 포트를 연결하기 위해 사용

# 포트 포워딩 규칙 추가
firewall-cmd --add-forward-port=Port-Forwarding-Rule [--zone=ZONE] [--permanent]

# Port-Forwarding-Rule
port=PORT[-PORT]:proto=PROTOCOL:toport=PORT[-PORT][:toaddr=IP[/MASK]]

# port=PORT[-PORT] -> 접근하는 포트번호 (2000-2010)

# proto=PROTOCOL -> 접근 시 사용하는 프로토콜 정보 (TCP or UDP)

# toport=PORT[-PORT] -> 전달되는 포트 지정

# toaddr=IP[/MASK] -> 전달되는 시스템 주소

# ex) 모든 대상이 8888/tcp 포트로 접근하면 22/tcp 포트로 포트포워딩
firewall-cmd --add-forward-port=port=8888:proto=tcp:toport=22

# 포트 포워딩 규칙 제거
firewall-cmd --remove-forward-port=Port-Forwarding-Rule [--zone=ZONE] [--permanent]

# port-forwarding-rule 찾기
firewall-cmd --list-all --zone=<zone-name> | grep 'forward-ports'

- 중요1: 영구설정으로 규칙 변경 후 reload하여 영구설정 규칙 적용: firewall-cmd --reload

 

- 중요2: runtime 설정 -> permanent 설정 변경: firewall-cmd --runtime-to-permanent

 

5. Rich Rule

- 다양한 규칙들을 복합적으로 사용해서 세밀한 설정 가능

 

1) 관련 옵션

- 리치 규칙 추가: firewall-cmd --add-rich-rule='rule <rule-name>' [--zone=ZONE] [--permanent]

- 리치 규칙 제거: firewall-cmd --remove-rich-rule='rule <rule-name>' [--zone=ZONE] [--permanent]

- 리치 규칙 확인: firewall-cmd --list-rich-rule [--zone=ZONE]

 

2) 예제

# 문법 메뉴얼
man firewalld.richlanguage(5)에서 확인 가능

# 192.168.0.0/24 대역에서 80/tcp 포트로 접근하면 허용하도록 설정
firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.0.0/24 service name=http accept'

# 192.168.0.0/24 대역에서 2222/tcp로 접근하면 192.168.0.10 시스템의 22/tcp로 연결하도록 포트포워딩 설정
firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.0.0/24 forward-port port=2222 protocol=tcp to-port=22 to-addr=192.168.0.10'

'MLOps > Linux' 카테고리의 다른 글

SELinux (리눅스 보안)  (0) 2022.01.29
네트워크 티밍  (0) 2022.01.29
NTP 서버 관리  (0) 2022.01.28
네트워크 관리  (0) 2022.01.28
소프트웨어 패키지 (RPM, YUM)  (0) 2022.01.27