iptables
iptables는 리눅스에서 네트워크 패킷 필터링과 방화벽 기능을 담당하는 커맨드라인 도구이다. 실제 동작은 리눅스 커널 안의 netfilter 프레임워크에서 처리되고, iptables는 그 규칙을 설정, 조회, 관리하는 역할을 한다. 즉, 리눅스에서 “어떤 네트워크 패킷을 허용할지, 차단할지, 수정할지” 결정하는 방화벽 도구이다.
OPTIONS
옵션 | 설명 | 예시 |
-p | 프로토콜 지정 (tcp, udp, icmp) | -p tcp |
-s / -d | 출발지 / 목적지 IP 주소 (또는 대역) 지정 | -s 192.168.1.0/24 -d 10.0.0.5 |
--sport / --dport | 출발지 / 목적지 포트 지정 | --dport 22 |
-i / -o | 입력 / 출력 인터페이스 지정 | -i eth0 -o eth1 |
-m state --state | 상태 모듈: 연결 상태 기반 필터링 (NEW, ESTABLISHED, RELATED) | -m state --state ESTABLISHED |
-m limit | 속도 제한 모듈 | -m limit --limit 5/min |
모든 테이블에 대해서 특정 옵션을 지정하는 내용은 동일하기 때문에 해당 옵션을 익혀 하단 테이블 설명에 참고하여 적용하면 된다.
filter
iptables에서 가장 기본적이고 많이 쓰는 테이블로, 주로 패킷의 허용/차단을 담당한다. filter Table을 사용하기에 -t filter를 작성하고 그 이후 원하는 체인(상황), 원하는 옵션(조건)들, 마지막으로 해당 옵션이 성립할 때 행할 action을 선택해주면 된다.
꼭 해당 트리를 기억해두고 상황에 맞는 체인, 옵션, 액션을 조합해서 작성하자.
ACTION
액션 | 설명 |
ACCEPT | 패킷 허용 |
DROP | 패킷 무응답으로 버림 (상대방은 모름) |
REJECT | 패킷 거부 (거부 응답을 보냄, ICMP 메시지 사용) |
LOG | 패킷을 로그에 기록 (/var/log/messages) |
RETURN | 사용자 정의 체인에서 상위 체인으로 복귀 |
해석해보자!
1) $ iptables -A INPUT -p tcp --dport 22 -j ACCEPT
2) $ iptables -A INPUT -p tcp --dport 80 -s 192.168.1.100 -j DROP
1) -t가 생략되어 있으므로 filter table이고, 들어오는 패킷이 tcp - 22port면 허용한다.
2) -t가 생략되어 있으므로 filter table이고, 들어오는 패킷이 tcp - 80에 source ip가 192.168.1.100이면 무응답으로 버린다.
nat
NAT (Network Address Translation)은 네트워크에서 IP 주소나 포트 번호를 다른 값으로 변환하는 기술이다.
공유기에서 내부 사설 IP를 공인 IP로 바꾸어 외부와 통신하거나, 하나의 공인 IP로 여러 내부 호스트가 외부와 통신하는 것. 그리고, 특정 외부 요청을 내부 서버로 포워딩 하는 것과 같은 설정이 가능하다.
CHAIN
체인 | 설명 |
PREROUTING | 패킷이 라우팅 결정 전에 처리됨 (목적지 IP/포트 변경, DNAT/REDIRECT) |
OUTPUT | 로컬에서 발생한 패킷 처리 (예: 서버에서 생성된 패킷의 목적지 변경) |
POSTROUTING | 패킷이 라우팅 결정 후 처리됨 (출발지 IP/포트 변경, SNAT/MASQUERADE) |
ACTION
액션 | 설명 |
DNAT | 목적지 IP 또는 포트를 변경 (Destination NAT, 예: 포트포워딩) |
REDIRECT | 패킷의 목적지를 로컬 머신으로 돌림 (예: 80포트 → 8080 리다이렉트) |
SNAT | 출발지 IP 또는 포트를 변경 (Source NAT, 예: 서버 외부 통신 시 공용 IP로 변경) |
MASQUERADE | 동적 IP 환경에서 출발지 IP를 자동으로 변경 (예: 공유기에서 NAT) |
tip, nat 꼭 알아두자!
들어오는 것 = 들어오기 직전(PREROUTING)에 DNAT (destination IP 변경)
$ iptables -t nat -A PREROUTING [OPTIONS] -j DNAT --to-destination [IP]
나가는 것 = 나가기 직전(POSTROUTING)에 SNAT(source IP 변경)
$ iptables -t nat -A POSTROUTING [OPTIONS] -j SNAT --to [IP]
테스트 문제
$ iptables (?) -o eth0 (?) --to 201.23.5.11
1) 첫 번째 이더넷카드(eth0)를 통해 외부로 나가는 패킷에 201.23.5.11번 IP주소를 부여한다.
$ iptables (?) -p tcp -d 203.200.1.14 --dport 80 (?) --to 201.23.5.11:80
2) 203.200.1.14의 80포트로 들어오는 패킷을 201.23.5.11의 80 포트로 연결한다.
1) $ iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 201.23.5.11
2) $ iptables -t nat -A PREROUTING -p tcp -d 203.200.1.14 --deport 80 -j DNAT --to 201.23.5.11:80
mangle
raw
관련 명령어
규칙 초기화
# filter 테이블 모든 체인 삭제
$ iptables -F
# nat 테이블 모든 체인 삭제
$ iptables -t nat -F
# nat 테이블 POSTROUTING 체인 삭제
$ iptables -t nat -F POSTROUTING
규칙 확인
# filter 테이블의 모든 체인 확인
$ iptables -L
# filter 테이블의 모든 체인 확인 (port와 같은 내용은 숫자값으로 변경)
$ iptables -nL
# filter 테이블의 모든 체인을 자세히 확인
$ iptables -vL
# nat 테이블의 모든 체인을 확인
$ iptables -t nat -L
# nat 테이블의 POSTROUTING 체인 확인
$ iptables -t nat -L POSTROUTING
규칙 수정
# INPUT 체인 맨 앞에 443 허용 삽입
iptables -I INPUT -p tcp --dport 443 -j ACCEPT
# INPUT 체인 2번째 위치에 53번 포트 허용 삽입
iptables -I INPUT 2 -p udp --dport 53 -j ACCEPT
# INPUT 체인 2번째 규칙을 "80번 포트 허용"으로 교체
$ iptables -R INPUT 2 -p tcp --dport 80 -j ACCEPT
# INPUT 체인 3번째 규칙 삭제
iptables -D INPUT 3
# INPUT 체인에서 ssh(22) 허용 규칙 삭제
iptables -D INPUT -p tcp --dport 22 -j ACCEPT
-I 옵션은 -A처럼 추가하는 옵션이지만, -A는 체인 맨 끝에 추가하는 방식이고 -I는 맨 앞에 추가 혹은 추가 지점을 지정할 수 있는 옵션이다.
파일 저장 및 불러오기
$ iptables-save > sample-firewall.sh
$ iptables-restore < smaple-firewall.sh
문제
iptables
아래 iptables에 관련된 조건에 맞는 명령어를 작성하세요.
1) FILTER 테이블의 모든 체인에 설정된 정책 정보를 출력한다.
2) FILTER 테이블의 모든 체인에 설정도니 정책 정보 (포트, 프로토콜 등)을 숫자값으로 출력한다.
3) FITLER 테이블의 모든 체인에 설정된 정책 정보를 패킷, 바이트 등을 추가하여 자세히 출력한다.
4) FILTER 테이블의 INPUT 체인에 설정된 정책 정보를 출력한다.
5) NAT 테이블에 설정된 정책 정보를 출력한다.
6) FILTER 테이블에 설정된 INPUT 체인에 설정된 정책 정보의 앞부분에 번호를 붙여 출력한다.
1) $ iptables -L
2) $ iptables -nL
3) $ iptables -vL
4) $ iptables -L INPUT
5) $ iptables -t NAT -L
6) $ iptables -L INPUT --line-numbers
아래 조건에 맞는 iptables 명령어를 작성하세요.
$ iptables ① INPUT ②
$ iptables ③ INPUT -s 192.168.10.24 ④
[조건]
외부로 들어오는 패킷을 모두 거부하고, IP 주소가 192.168.10.24인 호스트에서 들어오는 패킷에 대해서만 허용하는 정책을 설정한다.
1) -P
2) REJECT 혹은 DROP
3) -A
4) ACCEPT
iptables NAT에 관련하여 아래 조건에 맞는 명령어를 작성하세요.
1) POSTROUTING 체인의 규칙 확인
2) PREROUTING 체인의 규칙 초기화
3) PREROUTING 체인에 80포트로 들어오는 트래픽을 192.168.10.1로 전달하는 규칙 추가
1) $ iptables -t nat -L POSTROUTING
2) $ iptables -t nat -F PREROUTING
3) $ iptables -t nat -A PREROUTING --dport 80 -j DNAT --to-destination 192.168.10.1
iptables 기반으로 하나의 공인 IP 주소를 공유해서 다수의 컴퓨터를 사용하려고 한다. 이에 맞는 명령어를 작성하세요.
$ iptables -t ① -A ② ③ eth0 -j ④ --to 200.100.51.4
[조건]
해당 시스템에는 이더넷 카드 두개가 장착되어 있고, 외부망과 연결된 첫 번째 이더넷 카드(eth0)의 공인 IP 주소는 200.100.51.4이다.
$ iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 200.100.51.4
1) nat
2) POSTROUTING
3) -o
4) SNAT
하나의 공인 IP 주소를 이용하여 다수의 서버를 연결하여 구성한 상태에서, iptables를 이용하여 방화벽 규칙을 설정하는 과정을 알맞게 작성하세요.
$ iptables -t ① -A ② -p ③ -d 203.20.13.100 ④ -j ⑤ --to ⑥
[조건]
외부에서 들어오는 웹 서비스 요청을 내부 192.168.0.12인 웹 서버로 전달한다.
$ iptables -t nat -A PREROUTING -p tcp -d 203.20.13.100 --dport 80 -j DNAT --to 192.168.0.12
1) nat
2) PREROUTING
3) tcp
4) --deport 80
5) DNAT
6) 192.168.0.12
아래 iptables와 관련하여 해당 조건에 해당되는 명령어를 작성하세요
1) 현재 설정되어 있는 iptables의 규칙을 iptables_v01.backup 파일로 저장한다.
2) 현재 설정되어 있는 iptables의 filter 테이블의 규칙을 전부 제거한다.
3) iptables_v01.backup 파일에 저장되어 있는 iptables의 규칙을 불러와 반영한다.
4) 적용된 iptables의 filter 테이블 규칙을 확인한다.
1) $ iptables-save > iptables_v01.backup
2) $ iptables -F
3) $ iptables-restore < iptables_v01.backup
4) $ iptables -L
다음 iptables와 관련하여 해당 조건에 해당되는 명령어를 작성하세요.
$ iptables (?) (?) -j DROP
1) filter 테이블의 INPUT 체인 2번째 정책의 source ip 주소를 192.168.20.5로 수정하려고 한다.
$ iptables (?)
2) filter 테이블의 INPUT 체인 5번째 정책을 제거한다
$ iptables (?) -j LOG
3) filter 테이블의 INPUT 사슬에 설정한 2번째 정책에 연관된 로그를 기록하도록 설정한다.
1) $ iptables -R INPUT 2 -s 192.168.20.5 -j DROP
2) $ iptables -D INPUT 5
3) $ iptables -I INPUT 2 -j LOG
'자격증' 카테고리의 다른 글
[리눅스마스터 1급] 17. 슈퍼 데몬 (0) | 2025.05.05 |
---|---|
[리눅스마스터 1급] 16. DHCP 서비스 (0) | 2025.05.05 |
[리눅스마스터 1급] 15. 프록시 서비스 (Squid) (0) | 2025.05.05 |
[리눅스마스터 1급] 14. 인증 서비스 (NIS) (0) | 2025.05.05 |
[리눅스마스터 1급] 13. DNS 서비스 (bind) (0) | 2025.05.05 |