리눅스 네트워크 트래픽 통제 Netfilter, iptables, firewalld 방화벽 도구
Netfilter, iptables, 그리고 firewalld는 모두 Linux 시스템에서 방화벽 관리를 위해 사용되는 도구 및 기술입니다. 각각의 역할과 차이점을 살펴보겠습니다.
Netfilter
역할 및 기능
- Netfilter는 Linux 커널에서 동작하는 패킷 필터링 프레임워크입니다.
- 네트워크 스택의 핵심 부분으로, 패킷을 분석하고 판단하는 역할을 합니다.
용도
- 패킷 필터링, 네트워크 주소 변환(NAT), 연결 추적 및 조작 등 다양한 네트워크 작업을 수행하는 데 사용됩니다.
iptables
역할 및 기능
- iptables는 Netfilter를 사용하여 패킷 필터링 및 NAT 등을 구현하기 위한 커맨드 라인 도구입니다.
- 규칙을 정의하여 어떤 패킷이 수락되고 거부되는지를 제어합니다.
용도
- 방화벽 규칙 정의, 패킷의 포워딩 및 NAT 설정, 포트 포워딩 등을 통한 네트워크 트래픽 관리에 사용됩니다.
차이점
- iptables는 기본적으로 명령행 인터페이스를 제공하며, 복잡한 규칙을 작성하기 위해서는 약간의 명령어 스크립팅이 필요합니다.
- iptables는 네트워크 규칙을 직접 관리하기 위해 강력하고 유연한 도구입니다.
firewalld
역할 및 기능
- firewalld는 Red Hat 계열의 Linux 시스템에서 사용되는 동적 방화벽 관리 도구입니다.
- iptables를 기반으로 하며, 간단한 설정 변경을 통해 동적으로 방화벽 규칙을 조절할 수 있습니다.
용도
- 서비스 및 포트를 기반으로 한 규칙 정의, 동적 규칙 관리, 서비스 재시작 없이 규칙 변경 등을 위해 사용됩니다.
차이점
- firewalld는 동적으로 방화벽 규칙을 관리하는 데 중점을 두며, 서비스 기반의 규칙 정의를 쉽게 처리할 수 있습니다.
- 단순한 설정 변경으로 규칙을 조절할 수 있어서 사용자 친화적입니다.
- iptables보다는 상위 수준의 추상화를 제공하여 사용자가 더 쉽게 규칙을 관리할 수 있도록 합니다.
요약하면, Netfilter는 Linux 커널의 일부로 네트워크 패킷을 처리하는 데 사용되고, iptables는 Netfilter를 이용하여 명령행에서 방화벽을 설정하는 도구이며, firewalld는 iptables를 기반으로 하면서 더 사용자 친화적이고 동적인 방화벽 설정을 제공하는 도구입니다.
iptables를 사용한 접근 제어 설정 예시
예시 1: SSH 트래픽 허용하기
# SSH(포트 22) 트래픽을 허용
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 기본 정책 설정: 나머지 모든 트래픽 거부
iptables -A INPUT -j DROP
예시 2: 웹 서버 포트(포트 80) 트래픽 허용하기
# 웹 서버(포트 80) 트래픽을 허용
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# 기본 정책 설정: 나머지 모든 트래픽 거부
iptables -A INPUT -j DROP
firewalld를 사용한 접근 제어 설정 예시
예시 1: SSH 서비스 허용하기
# SSH 서비스를 허용
firewall-cmd --add-service=ssh --permanent
# 변경 사항 적용
firewall-cmd --reload
예시 2: HTTP 서비스 허용하기
# HTTP 서비스를 허용
firewall-cmd --add-service=http --permanent
# 변경 사항 적용
firewall-cmd --reload
참고사항
--permanent
옵션은 설정을 영구적으로 저장하기 위한 것입니다. 변경 후에는firewall-cmd --reload
명령을 통해 적용해야 합니다.- firewalld는 서비스 이름을 사용하여 간편하게 규칙을 추가할 수 있습니다.
- iptables는 더 상세한 규칙을 작성해야 하지만, 더 정밀한 제어가 가능합니다.
이는 간단한 예시이며, 실제 환경에 따라 필요한 서비스와 포트에 맞게 규칙을 추가하고 적용해야 합니다. 또한, 보안 상 꼭 필요한 서비스만을 열어두도록 설정하는 것이 좋습니다.
네트워크 주소 변환(NAT)은 주로 라우터나 방화벽에서 사용되어 내부 네트워크의 프라이빗 IP 주소를 외부 네트워크에서 보이는 퍼블릭 IP 주소로 변환하거나, 특정 포트를 다른 포트로 매핑하는 등의 작업을 수행합니다. NAT를 설정하는 방법을 각각의 도구에 대해 설명하겠습니다.
iptables를 사용한 NAT 설정
1. 포트 포워딩 예시
# 내부 서버의 192.168.1.2에서 외부로 들어오는 80번 포트 트래픽을 포트 8080으로 포워딩
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.2:8080
# NAT된 트래픽이 내부 서버로 전달되도록 설정
iptables -t nat -A POSTROUTING -p tcp --dport 8080 -d 192.168.1.2 -j SNAT --to-source 외부퍼블릭IP
# 변경 사항 저장
service iptables save
2. 소스 주소 변환(NAT)
# 내부 네트워크에서 외부로 나가는 트래픽의 소스 주소를 내부 서버의 IP에서 라우터의 외부 인터페이스 IP로 변환
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
# 변경 사항 저장
service iptables save
firewalld를 사용한 NAT 설정
1. 포트 포워딩 예시
# 내부 서버의 192.168.1.2에서 외부로 들어오는 80번 포트 트래픽을 포트 8080으로 포워딩
firewall-cmd --zone=public --add-forward-port=80:proto=tcp:toaddr=192.168.1.2:toport=8080 --permanent
# 변경 사항 적용
firewall-cmd --reload
2. 소스 주소 변환(NAT)
# 내부 네트워크에서 외부로 나가는 트래픽의 소스 주소를 내부 서버의 IP에서 라우터의 외부 인터페이스 IP로 변환
firewall-cmd --zone=public --add-masquerade --permanent
# 변경 사항 적용
firewall-cmd --reload
위의 예시는 간단한 설정이며, 실제 환경에 따라 적절한 설정을 선택하고 적용해야 합니다. 주의할 점은 NAT 설정 시 포트 포워딩이나 주소 변환에 대한 보안 고려 사항을 반드시 고려해야 합니다.
iptables
와 firewalld
는 각각 독립적인 방화벽 관리 도구로서 기능합니다. 그러나 firewalld
는 iptables
를 기반으로 하며, 실제로 firewalld
를 사용하면서 iptables
규칙도 함께 사용할 수 있습니다.
firewalld
는 간단한 설정을 통해 방화벽 규칙을 동적으로 관리하고, iptables
는 더 복잡하고 상세한 규칙을 작성하는 데 사용됩니다. 따라서, firewalld
를 사용하면서 필요한 경우에 iptables
를 직접 사용하여 추가적인 세부 설정을 수행할 수 있습니다.
다만, 주의해야 할 점은 firewalld
가 활성화된 상태에서 iptables
명령을 사용하면 firewalld
의 규칙이 무시될 수 있습니다. 따라서 iptables
를 사용할 때는 firewalld
의 설정을 고려하고 조정해야 합니다.
예를 들어, firewalld
서비스를 중지하면 iptables
명령만 활성화될 수 있습니다. 다음은 firewalld
를 중지하고 iptables
규칙을 사용하는 예시입니다:
# firewalld 서비스 중지
systemctl stop firewalld
# iptables 규칙 추가
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 변경 사항 저장
service iptables save
이러한 혼합된 사용은 주로 특별한 경우에 필요하며, 기본적으로는 firewalld
또는 iptables
중 하나를 선택하여 사용하는 것이 좋습니다.
iptables
에서 firewalld
로 전환하는 과정은 몇 가지 단계로 구성됩니다. 아래는 간단한 가이드라인입니다. 주의: 이러한 변경은 시스템에 영향을 줄 수 있으므로 주의하고 실제 환경에서 테스트해 보는 것이 좋습니다.
- firewalld 설치
sudo yum install firewalld # Red Hat 계열 # 또는 sudo apt-get install firewalld # Debian 계열
- firewalld 서비스 시작 및 부팅 시 자동 실행 설정
sudo systemctl start firewalld sudo systemctl enable firewalld
- firewalld로 전환
iptables
에서 사용 중인 규칙을firewalld
로 변환해야 합니다. 이 작업은 수동으로 수행되어야 하며,iptables
규칙 구문을firewalld
규칙으로 변환해야 합니다.
- 기존 iptables 규칙 확인 및 백업
sudo iptables -L -n -v # 현재 iptables 규칙 확인 sudo service iptables save # iptables 규칙을 저장하여 백업
- firewalld 규칙 추가
- 기존 iptables 규칙을 확인하고, 이를 기반으로
firewalld
규칙을 추가합니다.# 예: SSH 포트(22번) 트래픽을 허용 sudo firewall-cmd --zone=public --add-service=ssh --permanent
- 기존 iptables 규칙을 확인하고, 이를 기반으로
- 필요한 규칙 추가 및 설정 적용
- 기존 iptables 규칙이나 필요한 새로운 규칙을
firewalld
로 추가합니다.# 예: HTTP 포트(80번) 트래픽을 허용 sudo firewall-cmd --zone=public --add-service=http --permanent
- 기존 iptables 규칙이나 필요한 새로운 규칙을
- 변경사항 적용 및 확인
sudo firewall-cmd --reload # 변경 사항 적용 sudo firewall-cmd --list-all # 적용된 규칙 확인
- 기존 iptables 비활성화 (옵션)
- 만약,
firewalld
로의 전환 후에도iptables
를 완전히 비활성화하려면 아래 명령을 사용합니다.sudo systemctl stop iptables sudo systemctl disable iptables
- 만약,
전환 후에는 시스템이 firewalld
를 사용하도록 설정되었을 것입니다. 이후에는 firewall-cmd
명령어를 사용하여 방화벽 규칙을 추가하고 관리하면 됩니다.
iptables save
로 저장된 룰셋을 firewalld
룰셋으로 전환하는 것은 직접 변환 작업이 필요하며, 두 도구 간의 문법 및 규칙 구조가 약간 다르기 때문에 자동으로 변환되지 않습니다. 아래는 간단한 스크립트를 사용하여 iptables
룰셋을 firewalld
로 변환하는 방법을 보여줍니다. 이 스크립트는 기본적인 규칙만을 변환하므로 복잡한 규칙이 있는 경우에는 수동으로 조정해야 합니다.
#!/bin/bash
# iptables 룰셋 파일 경로
iptables_file="/etc/sysconfig/iptables"
# iptables 룰셋을 읽어오고 firewalld로 변환
while read line; do
if [[ $line == *"-A INPUT"* ]]; then
# INPUT 체인에 대한 규칙
port=$(echo "$line" | grep -oP -- "-p tcp --dport \K[0-9]+")
firewall-cmd --zone=public --add-port=$port/tcp --permanent
elif [[ $line == *"-A FORWARD"* ]]; then
# FORWARD 체인에 대한 규칙
# FORWARD 규칙을 추가하려면 여기에 코드 추가
# 예: firewall-cmd --zone=public --add-forward-port=...
elif [[ $line == *"-A OUTPUT"* ]]; then
# OUTPUT 체인에 대한 규칙
# OUTPUT 규칙을 추가하려면 여기에 코드 추가
# 예: firewall-cmd --zone=public --add-port=...
fi
done < "$iptables_file"
# 변경 사항 적용
firewall-cmd --reload
이 스크립트는 iptables
룰셋 파일에서 INPUT
체인에 대한 TCP 포트 규칙을 읽어와서 firewalld
로 변환합니다. FORWARD
및 OUTPUT
체인에 대한 규칙이 있다면 해당 부분에 코드를 추가하여 변환할 수 있습니다. 스크립트를 사용하기 전에 백업을 만들고 테스트를 신중히 진행하는 것이 좋습니다.