안녕하세요, SATAz입니다.
이번 포스팅은 IPTables에 대해서 소개드리는 세 번째 내용입니다.
지난 포스팅에서는 특정 IP에 대한 차단 및 허용하는 룰셋을 추가/삭제의 설명까지 진행되었습니다.
이번 포스팅에서는 IPTables를 이용한 특정 서비스 포트 차단/허용하는 내용을 중점적으로 다룰 예정입니다.
▣주의!!! : 이 블로그에 작성된 IPTables 포스팅들은 교육용으로 작성된 내용입니다.
서비스 중인 서버에 아래의 내용만 갖고 바로 적용하지 마시고, 서버에 적용 전에 반드시 테스트를 거치시기 바랍니다. IPTables도 방화벽인지라, 무턱대고 서버에 적용했다가는 서비스 중단되는 사태가 발생할 수 있습니다. 필히 주의하셔야합니다!!!
1. 기본 제공되는 IPTables 체인
Chain(체인)이란.... 패킷이 서버로 들어오기 전에 거치는 문(?) 정도로 생각하시면 될 것 같습니다.
IPTables에서는 아래의 3개 체인을 기본적으로 제공하고 있으며, 체인별로 방화벽 방화벽 룰을 관리합니다.
1) INPUT Chain : 외부->서버 내부 서버로 들어오는 패킷들을 필터링합니다.
2) OUTPUT Chain : 서버 내부->외부로 나가는 패킷들을 필터링합니다.
3) FORWARD Chain : 자신을 통과하는 모든 패킷들을 필터링합니다. (브릿지 인터페이스 구성에서 사용됩니다.)
(*FORWARD 체인 특 주의사항! : 자기 자신에게 직접 들어오는 패킷들은 INPUT에서 관리합니다. 자세한 내용은 추후 포스팅에서 다루겠습니다.)
2. IPTables의 명령어 구조 - 명령어를 이용한 특정 서비스포트의 차단과 허용
#IPTables 설정를 위한 환경
- 테스트 머신 : VMware WorkStation 12 Player
- 운영체제 : CentOS/RHEL 7 - 64bit ( Minimal 설치 )
- 메모리 : 2GB
- IPTables Version : iptables v1.4.21
- 서버 아이피 : 192.168.0.18
- 현재까지의 방화벽 설정
[root@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 192.168.0.1 192.168.0.18 <- 게이트웨이 허용
ACCEPT all -- 8.8.8.8 192.168.0.18 <- DNS 조회를 위한 아이피 허용 (구글 DNS)
DROP all -- 0.0.0.0/0 192.168.0.18 <- 전체 차단
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
# 명령어 구조
[root@localhost ~]# iptables -[옵션] [체인명] -p [프로토콜] -s [출발지 IP주소] -d [도착지 IP주소] -dport [포트번호] -j [정책]
###옵션설명###
-p : 프로토콜을 결정한다 [예) tcp / udp]
--dport : 정책을 적용할 서비스 포트를 결정한다 [예) 80 / 22 / 21 등...]
지난 포스팅의 명령어와 달라진 점은, -p옵션과 --dport옵션이 추가되었다는 점입니다.
이제 예제와 함께 -p와 --dport 사용법에 대해서 설명드리겠습니다.
예제)
Source IP : 192.168.0.2 -> Destination IP : 192.168.0.18, Destination Port : 22 - 허용
Source IP : Any -> Destination IP : 192.168.0.18, Destination Port : 80 - 허용
Source IP : Any -> Destination IP : 192.168.0.18, Destination Port : Any - 차단
기본적으로, 전체적인 접근을 차단하고,
192.168.0.2 아이피는 서버 관리를 위해 22번(SSH) 포트를 허용, 80번(웹서비스) 포트에 대해서만 전체적으로 접근이 허용되도록
설정할 예정입니다.
전체 차단은 이미 설정되어있기 때문에, 방화벽에서 허용하는 명령어를 위쪽으로 추가하기 위해 -I 옵션을 사용하였습니다.
# 룰 추가를 위한 명령어
iptables -I INPUT -p tcp -s 0.0.0.0/0 -d 192.168.0.18 --dport 80 -j ACCEPT
iptables -I INPUT -p tcp -s 192.168.0.2 -d 192.168.0.18 --dport 22 -j ACCEPT
# 적용사항 확인
[root@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 192.168.0.1 192.168.0.18
ACCEPT all -- 8.8.8.8 192.168.0.18
DROP all -- 0.0.0.0/0 192.168.0.18
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@localhost ~]# iptables -I INPUT -p tcp -s 0.0.0.0/0 -d 192.168.0.18 --dport 80 -j ACCEPT
[root@localhost ~]# iptables -I INPUT -p tcp -s 192.168.0.2 -d 192.168.0.18 --dport 22 -j ACCEPT
[root@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 192.168.0.2 192.168.0.18 tcp dpt:22
ACCEPT tcp -- 0.0.0.0/0 192.168.0.18 tcp dpt:80
ACCEPT all -- 192.168.0.1 192.168.0.18
ACCEPT all -- 8.8.8.8 192.168.0.18
DROP all -- 0.0.0.0/0 192.168.0.18
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
그리고 반드시 iptables-save 명령어를 이용해, 설정파일에도 적용해줍니다.
#iptables 설정파일에, 현재 방화벽 상태를 저장하는 명령어
iptables-save > /etc/sysconfig/iptables
2. 만약 명령여를 -A옵션으로 적용하게 된다면? - 잘못된 옵션 적용의 결과
iptables 명령어로 -I옵션이 아닌 -A옵션을 주게 될 경우, 허용한 정책들이 힘을 발휘할 수가 없습니다.
그 이유는 아래의 설정 과정을 통해 알려드리겠습니다.
# 잘못된 룰 추가를 위한 명령어
iptables -A INPUT -p tcp -s 0.0.0.0/0 -d 192.168.0.18 --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -s 192.168.0.2 -d 192.168.0.18 --dport 22 -j ACCEPT
# 적용사항 확인
[root@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 192.168.0.1 192.168.0.18
ACCEPT all -- 192.168.0.2 192.168.0.18
ACCEPT all -- 8.8.8.8 192.168.0.18
DROP all -- 0.0.0.0/0 192.168.0.18
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@localhost ~]# iptables -A INPUT -p tcp -s 0.0.0.0/0 -d 192.168.0.18 --dport 80 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -p tcp -s 192.168.0.2 -d 192.168.0.18 --dport 22 -j ACCEPT
[root@localhost ~]#
[root@localhost ~]#
[root@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 192.168.0.1 192.168.0.18
ACCEPT all -- 8.8.8.8 192.168.0.18
DROP all -- 0.0.0.0/0 192.168.0.18
ACCEPT tcp -- 0.0.0.0/0 192.168.0.18 tcp dpt:80
ACCEPT tcp -- 192.168.0.2 192.168.0.18 tcp dpt:22
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
위의 결과를 해석을 하게 되면 다음과 같습니다.
# 잘못된 결과 정리
Source IP : 192.168.0.1 -> Destination IP : 192.168.0.18, Destination Port : Any - 허용
Source IP : 8.8.8.8 -> Destination IP : 192.168.0.18, Destination Port : Any - 허용
Source IP : Any -> Destination IP : 192.168.0.18, Destination Port : Any - 차단
Source IP : Any -> Destination IP : 192.168.0.18, Destination Port : 80 - 허용
Source IP : 192.168.0.2 -> Destination IP : 192.168.0.18, Destination Port : 22 - 허용
빨간색으로 표시한 결과가, -A 옵션으로 새롭게 추가한 룰 현황입니다.
굵게 표시한 "차단" 정책이 빨간색으로 표시한 허용 정책보다 위에 있기 때문에, 위에 있는 룰이 우선순위를 높게 받아서 전체차단이 됩니다.
쉽게 말씀드리자면 빨간색으로 표시된 정책이 먼저 허용되고, 굵게 표시한 정책으로 다시 차단을 해버린 것입니다.
방화벽 룰을 설정할 때에는, 위치가 중요하다는 것을 잊지 말아야합니다.
4. IPTables 설정파일을 이용하는 방법
/etc/sysconfig/iptables 파일에서 아래와 같이 수정합니다.
# 설정파일 수정
[root@localhost sysconfig]# view /etc/sysconfig/iptables
*filter
:INPUT ACCEPT [28:2410]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [46:4240]
-A INPUT -p tcp -s 0.0.0.0/0 -d 192.168.0.18 --dport 80 -j ACCEPT
-A INPUT -p tcp -s 192.168.0.2 -d 192.168.0.18 --dport 22 -j ACCEPT
-A INPUT -s 192.168.0.1 -d 192.168.0.18 -j ACCEPT
-A INPUT -s 8.8.8.8 -d 192.168.0.18 -j ACCEPT
-A INPUT -d 192.168.0.18 -j DROP
COMMIT
설정파일에서는 관리가 용이하게 -A옵션으로 설정했습니다.
필자는 각 룰들을 순차적으로 밑쪽으로 배치하기 위하여 -A 옵션을 사용합니다.
# 변경된 설정 적용을 위한 iptables 재시작
[root@localhost ~]# systemctl restart iptables
[root@localhost ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 192.168.0.18 tcp dpt:80
ACCEPT tcp -- 192.168.0.2 192.168.0.18 tcp dpt:22
ACCEPT all -- 192.168.0.1 192.168.0.18
ACCEPT all -- 8.8.8.8 192.168.0.18
DROP all -- 0.0.0.0/0 192.168.0.18
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
이제 의 방화벽 룰셋을 설정을 완료했습니다 ^^
4. 자주 사용되는 포트번호
0 ~ 1024포트(Well-Known 포트)는 IANA에서 할당한 TCP/UDP 번호입니다.
네트워크를 이용하는 사람들끼리, 0~1024 포트는 어떤 용도로 사용할지 미리 정해놓고 사용하는 포트입니다.
그의 목록들 중 일부는 아래와 같습니다.
# 포트 목록
80/tcp,udp : http (웹서비스)포트
443/tcp : HTTPS (HTTPS over SSL 암호화 전송)
20/tcp: FTP 데이터 전송 포트
21/tcp : FTP 인증(제어) 포트
22/tcp : SSH 포트
23/tcp : 텔넷 포트
25/tcp : SMTP 이메일 전송 포트
53/tcp,udp : DNS 포트
69/udp : TFTP 포트
88/tcp : 케로베로스(인증 에이전트) 포트
109/tcp : POP2 전자우편 가져오는 포트
110/tcp : POP3 전자우편 가져오는 포트
123/udp : NTP 포트
139/tcp : 넷바이오스 포트
143/tcp : IMAP4 전자우편 가져오는 포트
161/udp : SNMP 에이전트 포트
162/udp : SNMP 매니저 포트
179/tcp : BGP포트
389/tcp : LADP (인증) 포트
445/tcp : Microsoft AD (Active Directory), Windows 공유 포트
445/udp : Microsoft SMB 파일공유 포트
465/tcp : SSL을 이용한 SMTP 암호화 메일 전송 포트 (Cisco 프로토콜과 충돌)
514/udp : syslog 시스템로그 작성 포트
지금까지 두서없는 글을 읽어주셔서 감사합니다 ^^
다음 시간에는 -m 옵션에 대한 설정에 대해서 다루도록 하겠습니다.
'보안 Story > IPTables' 카테고리의 다른 글
[IPTables] 6. IPTables를 사용해서 접속이 느려진다면? [INPUT] (2) | 2017.07.23 |
---|---|
[IPTables] 5. IPTables에 의해 FTP가 차단되는 경우를 확인하자 [INPUT] (4) | 2017.07.22 |
[IPTables] 4. -m 옵션의 사용 방법 [INPUT] (3) | 2017.07.08 |
[IPTables] 2.특정 아이피의 차단과 허용 [INPUT] (3) | 2017.06.25 |
[IPTables] 1.공짜방화벽 IPTables 설치하기 - CentOS 6/7 (1) | 2017.06.24 |