Linux 방화벽 구성 가이드

Linux 방화벽 구성 가이드입니다. firewalld zone, service와 port 허용, source 제한, masquerade, nftables 확인과 되돌리기 명령을 정리했습니다.

Linux 방화벽 구성 가이드: firewalld와 nftables 기준

Linux 방화벽 구성은 단순히 port를 여는 작업이 아니라, 어떤 interface가 어느 zone에 속하는지, 임시 설정과 영구 설정이 어떻게 다른지, 서비스 단위 허용과 source 제한을 어떻게 조합하는지 이해해야 한다. RHEL 계열에서는 일반적으로 firewalld가 기본 관리 계층이고, 내부 packet filter backend는 nftables를 사용한다.

방화벽 구성은 웹 서버, SSH 관리망, 내부망 접근 제한을 기준으로 명령어와 검증 순서를 함께 본다. 웹 서버, SSH 관리망, 내부망 접근 제한을 예시로 든다.

1. 현재 상태 확인

sudo systemctl status firewalld --no-pager
firewall-cmd --state

firewall-cmd --get-default-zone
firewall-cmd --get-active-zones
firewall-cmd --list-all

ip -br addr
ss -lntup

ss -lntup로 실제 listening service를 먼저 확인하고, 필요한 port만 열어야 한다. 열려 있지 않은 서비스 port를 방화벽에서 허용하는 것은 의미가 없다.

2. zone 개념 정리

zone용도 예시
public외부 또는 신뢰하지 않는 네트워크
internal사내/실습 내부망
trusted거의 모든 연결을 신뢰하는 특수 환경
drop응답 없이 폐기
block거부 응답과 함께 차단

서버 NIC가 어느 zone에 붙어 있는지 먼저 확인한다.

firewall-cmd --get-active-zones
nmcli dev status

3. interface를 zone에 배치

예를 들어 ens33은 외부망, ens34는 내부망으로 쓴다고 가정한다.

sudo firewall-cmd --zone=public --change-interface=ens33 --permanent
sudo firewall-cmd --zone=internal --change-interface=ens34 --permanent
sudo firewall-cmd --reload

firewall-cmd --get-active-zones

4. 서비스 단위 허용

가능하면 port 번호보다 firewalld service definition을 먼저 사용한다.

sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --zone=public --add-service=https --permanent
sudo firewall-cmd --zone=internal --add-service=ssh --permanent
sudo firewall-cmd --reload

firewall-cmd --zone=public --list-services
firewall-cmd --zone=internal --list-services

5. port 번호로 허용

정의된 service가 없거나 임시 테스트 port라면 직접 port를 열 수 있다.

sudo firewall-cmd --zone=internal --add-port=8080/tcp --permanent
sudo firewall-cmd --reload
firewall-cmd --zone=internal --list-ports

6. runtime과 permanent 차이

--permanent 없이 넣은 설정은 즉시 적용되지만 reload나 재부팅 후 사라진다. 장애 대응 중 임시 허용을 넣었다면 영구 설정으로 남길지 반드시 결정해야 한다.

sudo firewall-cmd --zone=public --add-port=8443/tcp
firewall-cmd --zone=public --list-ports

sudo firewall-cmd --runtime-to-permanent
sudo firewall-cmd --reload
firewall-cmd --zone=public --list-ports

7. 특정 source만 SSH 허용

관리용 SSH는 전체 공개보다 관리망 source를 제한하는 편이 낫다. 예시는 192.168.10.0/24에서만 SSH를 허용한다.

sudo firewall-cmd --zone=public --remove-service=ssh --permanent
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.10.0/24" service name="ssh" accept' --permanent
sudo firewall-cmd --reload

firewall-cmd --zone=public --list-rich-rules

8. masquerade와 라우터형 Linux

Linux 서버를 라우터처럼 쓰는 실습에서는 IP forwarding과 masquerade를 같이 본다. 운영망에서는 변경 영향이 크므로 격리된 lab에서만 적용한다.

echo "net.ipv4.ip_forward = 1" | sudo tee /etc/sysctl.d/90-lab-router.conf
sudo sysctl --system

sudo firewall-cmd --zone=public --add-masquerade --permanent
sudo firewall-cmd --reload

firewall-cmd --zone=public --query-masquerade

9. nftables backend 확인

firewalld가 실제로 어떤 규칙을 backend에 반영했는지 볼 때는 nftables 규칙을 확인한다.

sudo nft list ruleset | less
sudo nft list ruleset | grep -E 'ssh|http|masquerade|192\\.168\\.10'

단, firewalld가 관리하는 시스템에서는 직접 nft add rule로 임의 규칙을 섞기보다 firewalld 명령으로 관리하는 편이 일관성이 좋다.

10. 접속 테스트

서버 내부와 외부 클라이언트 양쪽에서 확인한다.

ss -lntp | grep -E ':22|:80|:443|:8080'

curl -I http://192.168.10.10/
nc -vz 192.168.10.10 22
nc -vz 192.168.10.10 8080

Windows 클라이언트에서는 다음처럼 확인할 수 있다.

Test-NetConnection 192.168.10.10 -Port 22
Test-NetConnection 192.168.10.10 -Port 80
Test-NetConnection 192.168.10.10 -Port 8080

11. 되돌리기 명령

실습 후에는 열었던 port와 rich rule을 정리한다.

sudo firewall-cmd --zone=internal --remove-port=8080/tcp --permanent
sudo firewall-cmd --zone=public --remove-rich-rule='rule family="ipv4" source address="192.168.10.0/24" service name="ssh" accept' --permanent
sudo firewall-cmd --zone=public --add-service=ssh --permanent
sudo firewall-cmd --reload

firewall-cmd --list-all-zones

마무리

Linux 방화벽은 service, port, source, zone을 따로 이해해야 실수를 줄일 수 있다. 서버에 어떤 daemon이 떠 있는지 ss로 확인하고, 어느 zone에 NIC가 묶였는지 확인한 뒤, 필요한 통신만 permanent 설정으로 남기는 순서가 좋다. 방화벽 문제를 볼 때는 firewall-cmd --list-all, ss -lntup, 클라이언트 접속 테스트를 같이 봐야 원인을 정확히 분리할 수 있다.

문서 링크

BGM EVER