iptables의 사용 방법 정리
1. 인바운드(Inbound)와 아웃바운드(Outbound)의 개념
- 네트워크 트래픽은 방향에 따라 인바운드와 아웃바운드로 나뉩니다. 방화벽 설정의 기본은 이 두 방향의 트래픽을 어떻게 제어할 것인지 결정하는 것입니다.
- 인바운드 (Inbound) 트래픽
- 방향: 외부 네트워크(인터넷 등)에서 나의 서버(또는 PC)로 들어오는 모든 연결.
- 예시:
- 외부 사용자가 웹 서버에 접속 (HTTP/HTTPS 요청).
- 관리자가 원격에서 SSH로 서버에 접속.
- 외부 메일 서버가 내 메일 서버로 이메일을 전송.
- 보안 관점: 가장 중요한 방어 지점입니다. 허가되지 않은 인바운드 연결을 차단하여 외부의 공격이나 무단 접근을 막는 것이 핵심입니다.
- 아웃바운드 (Outbound) 트래픽
- 방향: 나의 서버(또는 PC)에서 외부 네트워크로 나가는 모든 연결.
- 예시:
- 서버에서 apt update 명령으로 외부 저장소에 접속.
- 웹 서버가 외부 API 서버에 데이터를 요청.
- 서버 내 사용자가 웹 브라우저로 구글에 접속.
- 보안 관점: 악성코드 감염 시 정보 유출, DDoS 공격의 좀비 PC화 등 내부에서 시작되는 위협을 통제하는 데 중요합니다.
2. iptables의 기본 정책(Policy) 설정
- iptables는 체인(Chain)이라는 규칙의 묶음을 사용하며, 주요 체인은 다음과 같습니다.
- INPUT: 인바운드 트래픽에 적용되는 규칙 묶음.
- OUTPUT: 아웃바운드 트래픽에 적용되는 규칙 묶음.
- FORWARD: 서버를 통과하여 다른 곳으로 전달(라우팅)되는 트래픽에 적용.
- 기본 정책은 **"아무 규칙에도 해당하지 않는 트래픽을 어떻게 처리할 것인가"**를 정의하며, 두 가지 접근 방식이 있습니다.
방식 1: Default Allow (허용 후 차단)
- 설정: 모든 트래픽을 기본적으로 허용하고, 문제가 되는 특정 트래픽만 차단(DROP)합니다.
- 명령어:
sudo iptables --policy INPUT ACCEPT
sudo iptables --policy OUTPUT ACCEPT
- 장단점: 설정이 간단하지만, 예측하지 못한 위협에 노출될 수 있어 보안 수준이 낮습니다.
방식 2: Default Deny (차단 후 허용) - 권장
- 설정: 모든 트래픽을 기본적으로 차단하고, 필요한 서비스의 트래픽만 명시적으로 허용(ACCEPT)합니다. 이를 화이트리스트 방식이라고도 합니다.
- 명령어:
sudo iptables --policy INPUT DROP
sudo iptables --policy OUTPUT DROP
- 장단점
: 초기 설정이 복잡하지만, 허가된 트래픽 외에는 모두 차단되므로 보안성이 매우 높습니다. 서버 보안의 표준적인 접근 방식입니다.
3. 가상 시나리오별 iptables 설정 방법
- "Default Deny" 정책을 기반으로 한 두 가지 시나리오를 통해 인바운드와 아웃바운드 규칙 설정 방법을 알아보겠습니다.
시나리오 1: 공개 웹 서버 보안 강화 (인바운드 제어 중심)
- 목표: 외부 사용자는 웹(HTTP/S) 서비스만 이용할 수 있고, 관리자는 특정 IP에서만 SSH 접속이 가능하도록 인바운드 트래픽을 엄격히 통제합니다.
- 기본 정책 설정:
# 모든 들어오는 연결을 기본적으로 차단
sudo iptables --policy INPUT DROP
# 나가는 연결은 일단 모두 허용 (패키지 업데이트, 외부 API 호출 등)
sudo iptables --policy OUTPUT ACCEPT
# 포워딩은 사용하지 않으므로 차단
sudo iptables --policy FORWARD DROP
- 인바운드(INPUT) 규칙 추가:
# 1. 로컬호스트(loopback)의 모든 통신은 허용 (시스템 내부 통신용)
sudo iptables -A INPUT -i lo -j ACCEPT
# 2. 이미 연결된 세션의 패킷과 연관된 패킷은 허용 (양방향 통신 보장)
sudo iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
# 3. SSH(22번 포트)는 관리자 IP(예: 1.2.3.4)에서만 허용
sudo iptables -A INPUT -p tcp -s 1.2.3.4 --dport 22 -j ACCEPT
# 4. 웹 서비스(80, 443번 포트)는 모든 IP에서 허용
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
- 결과: 위 규칙에 명시된 SSH, HTTP, HTTPS를 제외한 모든 인바운드 연결 시도는 차단됩니다. 서버는 외부로 자유롭게 아웃바운드 통신을 할 수 있습니다.
시나리오 2: 내부망 PC 보안 강화 (아웃바운드 제어 중심)
- 목표: 내부 직원의 PC가 악성코드에 감염되더라도 정보 유출이나 외부 공격을 막기 위해 허가된 서비스(웹 서핑, DNS)로의 아웃바운드 트래픽만 허용합니다.
- 기본 정책 설정:
# 들어오고 나가는 모든 연결을 기본적으로 차단
sudo iptables --policy INPUT DROP
sudo iptables --policy OUTPUT DROP
sudo iptables --policy FORWARD DROP
- 공통 규칙 추가:
# 로컬호스트 및 이미 연결된 세션 허용 (인바운드/아웃바운드 공통)
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT
sudo iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
- 아웃바운드(OUTPUT) 규칙 추가:
# 1. 신뢰할 수 있는 DNS 서버(예: 8.8.8.8)로의 DNS 쿼리(53번 포트) 허용
sudo iptables -A OUTPUT -p udp -d 8.8.8.8 --dport 53 -j ACCEPT
sudo iptables -A OUTPUT -p tcp -d 8.8.8.8 --dport 53 -j ACCEPT
# 2. 외부로의 웹 서핑(80, 443번 포트) 허용
sudo iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT
- 결과: 이 PC는 외부로 웹 서핑과 DNS 요청 외에는 어떠한 아웃바운드 통신도 할 수 없습니다. 외부에서 이 PC로 들어오는 새로운 인바운드 연결 역시 모두 차단됩니다.
4. 규칙 저장
위와 같이 설정한 규칙들은 시스템을 재부팅하면 사라집니다. 변경된 규칙을 영구적으로 저장하려면 아래 명령어를 실행해야 합니다.
sudo netfilter-persistent save
5. iptables 규칙 추가 (포트 열기) - 시나리오 80, 443, 10051, 8080, 8000, 3000 포트 열기
- 아래 명령어들은 지정된 포트로 들어오는 모든 TCP 트래픽을 허용(ACCEPT)합니다. root 권한이 필요하므로 sudo를 사용합니다.
옵션 1: 각 포트를 개별 명령어로 추가 (가장 간단)
# 웹 서버 포트
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# Zabbix 서버 포트
sudo iptables -A INPUT -p tcp --dport 10051 -j ACCEPT
# 기타 웹 애플리케이션 포트
sudo iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 8000 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 3000 -j ACCEPT
- -A INPUT: 들어오는(INPUT) 트래픽에 대한 규칙을 추가합니다.
- -p tcp: 프로토콜을 TCP로 지정합니다.
- --dport <포트번호>: 목적지 포트를 지정합니다.
- -j ACCEPT: 해당 트래픽을 허용합니다.
옵션 2: multiport를 사용하여 한 번에 추가 (더 효율적)
- multiport 모듈을 사용하면 여러 포트를 하나의 규칙으로 묶을 수 있습니다.
sudo iptables -A INPUT -p tcp -m multiport --dports 80,443,10051,8080,8000,3000 -j ACCEPT
6. 현재 규칙 확인
- 규칙이 올바르게 추가되었는지 확인하려면 아래 명령어를 사용합니다.
sudo iptables -L -v -n
- -L: 규칙을 나열합니다.
- -v: 자세한 정보를 보여줍니다.
- -n: IP 주소나 포트 번호를 이름으로 변환하지 않고 숫자로 표시하여 더 빠르게 보여줍니다.
7. iptables 규칙 저장하기 (재부팅 후에도 유지)
- iptables로 추가한 규칙은 메모리에만 저장되므로 시스템을 재부팅하면 사라집니다. 규칙을 영구적으로 저장하는 방법은 운영체제에 따라 다릅니다.
1.1. Debian / Ubuntu (가장 가능성 높은 환경)
- iptables-persistent 패키지를 사용합니다.
1.1.1. 패키지 설치:
sudo apt-get update
sudo apt-get install iptables-persistent
- 설치 과정에서 현재 iptables 규칙(IPv4, IPv6)을 저장할지 묻는 대화 상자가 나타납니다.
- <Yes>를 선택하면 현재 설정된 규칙이 자동으로 저장됩니다.
1.1.2. 규칙 수동 저장 (이미 설치된 경우 또는 규칙 변경 후):
- iptables 규칙을 변경한 후에 수동으로 저장하려면 아래 명령어를 실행합니다.
sudo netfilter-persistent save
- 이 명령어는 현재 iptables 규칙을 /etc/iptables/rules.v4와 /etc/iptables/rules.v6 파일에 덮어씁니다.
8. 저장된 규칙 파일 내용 직접 확인 (가장 기본적인 방법)
- sudo netfilter-persistent save 명령은 현재 활성화된 iptables 규칙을 파일로 저장합니다. 이 파일의 내용을 직접 확인하여 규칙이 올바르게 기록되었는지 볼 수 있습니다.
- IPv4 규칙 확인:
sudo cat /etc/iptables/rules.v4
- IPv6 규칙 확인:
sudo cat /etc/iptables/rules.v6
9. 단일 포트 규칙을 업데이트하고 삭제하는 방법
9.1. iptables 규칙 삭제하는 방법
- 기존 규칙을 삭제하는 데는 크게 두 가지 방법이 있습니다.
방법 1: 규칙 내용 전체를 지정하여 삭제
- 가장 직관적인 방법으로, 추가할 때 사용했던 명령어에서 -A(Append, 추가)를 -D(Delete, 삭제)로 바꾸어 실행하면 됩니다.
sudo iptables -D INPUT -p tcp --dport 80 -j ACCEPT
- 이 명령어는 INPUT 체인에서 지정된 내용과 정확히 일치하는 첫 번째 규칙을 삭제합니다.
방법 2: 규칙 번호를 확인하고 삭제 (더 편리한 방법)
- 규칙이 복잡할 때 유용한 방법입니다.
1단계: 규칙 목록과 번호 확인
- --line-numbers 옵션을 사용하여 INPUT 체인의 규칙 목록을 번호와 함께 확인합니다.
sudo iptables -L INPUT --line-numbers
- 출력 결과에서 삭제하려는 규칙의 번호를 찾습니다.
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
2 ACCEPT tcp -- anywhere anywhere tcp dpt:http <-- 80번 포트 규칙
3 ...
2단계: 번호를 이용해 규칙 삭제
- 위에서 확인한 규칙 번호(예시에서는 2번)를 사용하여 규칙을 삭제합니다.
sudo iptables -D INPUT 2
10. iptables 규칙 업데이트하는 방법
- iptables는 기존 규칙을 직접 "수정"하는 기능 대신, 특정 위치의 규칙을 새로운 규칙으로 "교체(Replace)"하는 기능을 제공합니다.
방법 1: 규칙 번호를 이용하여 교체 (권장)
1단계: 규칙 목록과 번호 확인
- 삭제할 때와 마찬가지로 --line-numbers 옵션으로 교체할 규칙의 번호를 먼저 확인합니다.
sudo iptables -L INPUT --line-numbers
2단계: -R 옵션으로 규칙 교체
- 확인한 규칙 번호와 함께 -R(Replace) 옵션을 사용하여 새로운 규칙으로 교체합니다. 예를 들어, 80번 포트로 들어오는 트래픽을 허용(ACCEPT)하는 대신 거부(DROP)하도록 규칙을 업데이트하려면 다음과 같이 실행합니다.
# 예시: 2번 규칙을 DROP으로 변경
sudo iptables -R INPUT 2 -p tcp --dport 80 -j DROP
방법 2: 기존 규칙 삭제 후 새 규칙 추가
- 가장 확실하고 실수가 적은 방법은 기존 규칙을 완전히 삭제한 뒤, 원하는 내용으로 새로운 규칙을 추가하는 것입니다.
1단계: 기존 규칙 삭제
sudo iptables -D INPUT -p tcp --dport 80 -j ACCEPT
2단계: 새로운 규칙 추가
- 예를 들어, 특정 IP(192.168.1.100)에서 오는 트래픽만 허용하도록 업데이트하려면 다음과 같이 새 규칙을 추가합니다.
sudo iptables -A INPUT -p tcp -s 192.168.1.100 --dport 80 -j ACCEPT
- 중요: 변경 사항 영구 저장
- 위의 모든 명령어는 현재 시스템의 메모리에만 적용됩니다. 시스템을 재부팅하면 변경 사항이 사라지므로, 규칙을 삭제하거나 업데이트한 후에는 반드시 아래 명령어를 실행하여 변경된 내용을 영구적으로 저장해야 합니다.
sudo netfilter-persistent save
11. multiport로 설정된 iptables 규칙에서 특정 포트(8080)만 삭제하는 방법
방법 1: 규칙을 직접 지정하여 삭제 후 추가 (가장 일반적인 방법)
- 이 방법은 삭제할 규칙과 추가할 규칙을 명확히 알고 있을 때 사용합니다.
1단계: 기존 multiport 규칙 삭제
- -D 옵션을 사용하여 삭제하려는 규칙과 완전히 동일한 내용을 지정합니다
sudo iptables -D INPUT -p tcp -m multiport --dports 80,443,10051,8080,8000,3000 -j ACCEPT
2단계: 8080 포트가 제외된 새 규칙 추가
- -A 옵션을 사용하여 8080 포트를 제외한 나머지 포트들로 새로운 규칙을 추가합니다.
sudo iptables -A INPUT -p tcp -m multiport --dports 80,443,10051,8000,3000 -j ACCEPT
방법 2: 규칙 번호를 이용하여 삭제 후 추가 (더 간편한 방법)
- 규칙이 길고 복잡하여 직접 입력하기 번거로울 때 유용한 방법입니다.
1단계: 규칙 목록과 번호 확인
- -line-numbers 옵션을 추가하여 INPUT 체인의 규칙 목록을 번호와 함께 확인합니다
sudo iptables -L INPUT --line-numbers
- 실행하면 아래와 같이 규칙마다 번호가 붙어 출력됩니다.
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ...
2 ACCEPT tcp -- anywhere anywhere multiport dports 80,443,10051,8080,8000,3000
3 ...
2단계: 번호를 이용해 규칙 삭제
- 위에서 확인한 규칙 번호(예시에서는 2번)를 사용하여 -D 옵션으로 해당 줄의 규칙을 삭제합니다
sudo iptables -D INPUT 2
3단계: 새 규칙 추가
- 마지막으로 8080 포트가 제외된 새로운 규칙을 추가합니다.
sudo iptables -A INPUT -p tcp -m multiport --dports 80,443,10051,8000,3000 -j ACCEPT
마지막 단계: 변경된 규칙 영구 저장
- 위의 방법들로 규칙을 수정하면 현재 시스템에만 적용됩니다. 재부팅 후에도 변경 사항을 유지하려면 반드시 netfilter-persistent를 사용하여 규칙을 저장해야 합니다.
sudo netfilter-persistent save
'OS > linux' 카테고리의 다른 글
우분투에서 레거시 장비(그래픽카드)로 부팅이 안되는 경우 (0) | 2025.06.01 |
---|---|
curl로 메일 서비스 api를 이용해 전송 테스트 하는 방법 (0) | 2023.10.16 |
댓글