안녕하세요. 썬구루입니다. 이 게시물에서는 CentOS 리눅스 iptable 방화벽 구성 방법에 대해 간단하게 알아보도록 하겠습니다.
요즘에는 보안이 많이 중요해졌습니다. 일 년에 한두 번은 대형 해킹 사고가 터지고 있습니다. 전산실에는 네트워크 보안을 담당하는 방화벽이 있긴 하지만 개별 서버 시스템에 대해서도 보안에 각별한 신경을 쓰고 있습니다. 서버 보안, 네트워크 보안, 응용 보안, 코드 보안 등등..
요즘 운영체제는 보안 기능이 기본 탑재되어 있습니다. 윈도우는 윈도우 방화벽이, 솔라리스는 IPFilter가 리눅스는 iptables이 보안 기능을 제공합니다. 또는 Red Castle이나 Red Owl 같은 상용 보안 프로그램을 운영체제에 설치하여 운영하는 곳도 있습니다. 우리는 이 게시물에서 iptables을 가지고 간단하게 보안 설정하는 방법에 대해 알아보도록 하겠습니다. 상세 내용은 다른 것과 마찬가지로 올해 말 또는 내년 초에 올리도록 하겠습니다.
■ iptables이란?
리눅스 운영체제에 기본 탑재된 패킷 필터링 툴(Tool)이자 OS 방화벽입니다. iptables는 방화벽 기능을 구현할 수 있게 해주는 프레임워크를 제공하는 Netfilter이며 이는 프로젝트명입니다.
1). iptables 기능
iptables는 아래와 같은 기능을 제공합니다.
▶ 상태 추적 기능
- 방화벽을 통과하는 모든 패킷에 대한 상태를 추적하여 메모리에 기억
- 기존의 연결을 가장하여 접근할 경우 메모리와 저장된 목록과 비교 후 차단
▶ 포트 포워딩 기능 내장
- NAT 기능을 자체적으로 포함 ( 공유기 기능으로 생각하면 편리함. )
▶ 향상된 매칭 기능
- 기본 매칭 정보인 IP 주소와 포트 주소뿐만 아니라 다양한 매칭 기능 제공
- 현재 연결 상태, MAC 주소, IP 헤더의 TOS 등 여러 가지 조건을 이용한 세부적인 필터링 가능
2). iptables의 4개 테이블
다른 방화벽 프로그램에 비해 빠르며 IP 패킷에 대한 제어가 가능합니다. Iptables는 다음과 같은 4개 테이블이 존재합니다. 그리고 이 게시물에서 Filter만 다룹니다.
▶ Filter : iptables의 패킷 필터링 담당
▶ NAT : 네트워크 주소 변환(Network Address Translation)의 약자로 IP 주소를 변환시키는 역할
▶ Mangle : 패킷 데이터를 변경하는 특수 규칙을 적용하거나 성능 향상을 위한 TOS 설정
▶ Raw : 넷필터의 연결 추적 하위시스템과 독립적으로 동작해야 하는 규칙을 설정
3). iptables의 Filter table 3개 체인 (Chain)
▶ INPUT : 외부에서 들어오는 패킷을 담당하는 체인
▶ OUTPUT : 외부로 나가는 패킷을 담당하는 체인
▶ FORWARD : 외부에서 다른 시스템 또는 네트워크로 전달되는 패킷을 담당하는 체인
4). iptables이 적용되는 시기
▶ iptables 서비스가 적용될 때
▶ iptables 명령을 통해 규칙을 적용시킬 때 즉시 적용
■ iptables 기본 명령
1). iptables 기본 명령
기본 명령
|
내 용
|
-A Chain
|
규칙을 아래에 추가하기 위해 사용 |
-D Chain
|
규칙을 삭제 |
-D Chain RULENUM
|
해당 번호 규칙을 삭제 |
-I Chain
|
규칙 삽입 |
-R Chain RULENUM
|
해당 번호 규칙 변경 |
-L [Chain]
|
전체 또는 특정 체인 규칙보기 |
-F [Chain]
|
전체 또는 특정 체인 초기화 |
2). iptables 명령어 Match 옵션
Match
|
내 용
|
-p PROTOCOL
|
프로토콜 이름 또는 숫자 (tcp, udp, icmp, all 등) |
-s ADDRESS/MASK
|
근원지 IP 주소 |
-d ADDRESS/MASK
|
목적지 IP 주소 |
--sport PORT
|
근원지 포트 주소 |
--dport PORT
|
목적지 포트 주소 |
3). iptables 명령어 Target
Target은 매치되는 패킷을 어떻게 처리할지 지정하는 부분입니다.
Target 옵션
|
내 용
|
-j ACCEPT
|
패킷 허용 |
-j DROP
|
패킷 폐기 |
-j REJECT
|
패킷 거부 |
4). ping(IPMP) 신호 거부 테스트
WAS01(192.168.80.22) 가상머신에 iptables를 활성화한 후 방화벽 정책 추가로 ping 신호가 거부되는지 테스트합니다.
[root@was01 ~]# hostname
was01 [root@was01 ~]# ifconfig eth0 eth0 Link encap:Ethernet HWaddr 00:0C:29:3E:63:0B inet addr:192.168.80.22 Bcast:192.168.80.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fe3e:630b/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:29787 errors:0 dropped:0 overruns:0 frame:0 TX packets:16687 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:30793923 (29.3 MiB) TX bytes:4034939 (3.8 MiB) [root@was01 ~]# service iptables start iptables: Applying firewall rules: [ OK ] [root@was01 ~]# [root@was01 ~]# chkconfig iptables on [root@was01 ~]# [root@was01 ~]# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED ACCEPT icmp -- anywhere anywhere ACCEPT all -- anywhere anywhere ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh REJECT all -- anywhere anywhere reject-with icmp-host-prohibited Chain FORWARD (policy ACCEPT) target prot opt source destination REJECT all -- anywhere anywhere reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT) target prot opt source destination [root@was01 ~]# [root@was01 ~]# iptables -I INPUT -p icmp -j DROP [root@was01 ~]# [root@was01 ~]# iptables -L | grep icmp DROP icmp -- anywhere anywhere ACCEPT icmp -- anywhere anywhere REJECT all -- anywhere anywhere reject-with icmp-host-prohibited REJECT all -- anywhere anywhere reject-with icmp-host-prohibited [root@was01 ~]# |
Windows 8.1 가상머신에서 WAS01로 ping 테스트를 하면 ping 신호가 처리가 되지 않는 것을 확인할 수 있습니다.
아래와 같은 명령을 사용하여 추가한 정책을 삭제하면 다시 ping 테스트가 정상 처리되는 것을 확인할 수 있습니다.
[root@was01 ~]# iptables -D INPUT -p icmp -j DROP
[root@was01 ~]# [root@was01 ~]# iptables -L | grep icmp ACCEPT icmp -- anywhere anywhere REJECT all -- anywhere anywhere reject-with icmp-host-prohibited REJECT all -- anywhere anywhere reject-with icmp-host-prohibited [root@was01 ~]# |
■ CentOS 가상머신 iptables 활성화
1). WEB01 가상머신 ( HTTPD : 80 포트 사용 )
[root@web01 ~]# vi /etc/sysconfig/iptables
# Firewall configuration written by system-config-firewall # Manual customization of this file is not recommended. *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT [root@web01 ~]# [root@web01 ~]# service iptables start iptables: Applying firewall rules: [ OK ] [root@web01 ~]# [root@web01 ~]# chkconfig iptables on [root@web01 ~]# |
또는
[root@web01 sysconfig]# iptables -L --line-number
Chain INPUT (policy ACCEPT) num target prot opt source destination 1 ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED 2 ACCEPT icmp -- anywhere anywhere 3 ACCEPT all -- anywhere anywhere 4 ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh 5 REJECT all -- anywhere anywhere reject-with icmp-host-prohibited Chain FORWARD (policy ACCEPT) num target prot opt source destination 1 REJECT all -- anywhere anywhere reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT) num target prot opt source destination [root@web01 sysconfig]# iptables -I INPUT 5 -p tcp -m tcp --dport 80 -j ACCEPT [root@web01 sysconfig]# [root@web01 sysconfig]# iptables -L --line-number Chain INPUT (policy ACCEPT) num target prot opt source destination 1 ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED 2 ACCEPT icmp -- anywhere anywhere 3 ACCEPT all -- anywhere anywhere 4 ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh 5 ACCEPT tcp -- anywhere anywhere tcp dpt:http 6 REJECT all -- anywhere anywhere reject-with icmp-host-prohibited Chain FORWARD (policy ACCEPT) num target prot opt source destination 1 REJECT all -- anywhere anywhere reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT) num target prot opt source destination [root@web01 sysconfig]# [root@web01 sysconfig]# service iptables save iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ] [root@web01 sysconfig]# [root@web01 sysconfig]# more iptables # Generated by iptables-save v1.4.7 on Mon Oct 17 11:48:38 2016 *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [10:1155] -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT # Completed on Mon Oct 17 11:48:38 2016 [root@web01 sysconfig]# |
2). WEB01 가상머신 (mod_jk : 8009 포트 사용(HTTPD와 Tomcat 연동), Tomcat : 8080 포트 사용)
[root@was01 ~]# vi /etc/sysconfig/iptables
# Firewall configuration written by system-config-firewall # Manual customization of this file is not recommended. *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 8009 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT [root@was01 ~]# [root@was01 ~]# service iptables start [root@was01 ~]# service iptables stop iptables: Setting chains to policy ACCEPT: filter [ OK ] iptables: Flushing firewall rules: [ OK ] iptables: Unloading modules: [ OK ] [root@was01 ~]# [root@was01 ~]# service iptables start iptables: Applying firewall rules: [ OK ] [root@was01 ~]# [root@was01 ~]# chkconfig iptables on [root@was01 ~]# |
Windows 8.1 가상머신의 웹브라우저를 사용하여 주소창에 웹서버 IP 또는 도메인 이름을 입력하여 접속되는지 확인을 합니다. 아래와 같이 나온다면 iptables이 WEB01과 WAS01에 잘 구성된 것입니다.
3). DB01 가상머신 (MySQL : 3306 포트 사용)
[root@db01 ~]# vi /etc/sysconfig/iptables
# Firewall configuration written by system-config-firewall # Manual customization of this file is not recommended. *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT [root@db01 ~]# service iptables start iptables: Applying firewall rules: [ OK ] [root@db01 ~]# [root@db01 ~]# chkconfig iptables on [root@db01 ~]# |
Windows 8.1 가상머신의 웹브라우저를 사용하여 주소창에 도메인 주소와 파일을 입력하여 서비스가 되는지 확인합니다.
4). DB02 가상머신 (Oracle 11g Express : 1521 포트 사용)
[root@db02 ~]# vi /etc/sysconfig/iptables
# Firewall configuration written by system-config-firewall # Manual customization of this file is not recommended. *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 1521 -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT [root@db02 ~]# [root@db02 ~]# service iptables start iptables: Applying firewall rules: [ OK ] [root@db02 ~]# [root@db02 ~]# chkconfig iptables on [root@db02 ~]# |
Windows 8.1 가상머신의 웹브라우저를 사용하여 주소창에 도메인 주소와 Oracle 11g Express 접속 테스트를 확인할 수 있는 파일인 oracle.jsp을 입력하여 서비스가 되는지 확인합니다.
5). DB03 가상머신 (Oracle 12c Standard : 1521 포트 사용)
[root@db03 ~]# vi /etc/sysconfig/iptables
# Firewall configuration written by system-config-firewall # Manual customization of this file is not recommended. *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 1521 -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT [root@db03 ~]# [root@db03 ~]# service iptables start iptables: Applying firewall rules: [ OK ] [root@db03 ~]# [root@db03 ~]# chkconfig iptables on [root@db03 ~]# |
6). DNS 가상머신 (BIND : 53 포트 사용)
[root@dns ~]# vi /etc/sysconfig/iptables
# Firewall configuration written by system-config-firewall # Manual customization of this file is not recommended. *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 53 -j ACCEPT -A INPUT -m state --state NEW -m udp -p udp --dport 53 -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT [root@dns ~]# service iptables start iptables: Applying firewall rules: [ OK ] [root@dns ~]# chkconfig iptables on [root@dns ~]# |
Windows 8.1 가상머신의 명령창(cmd)에서 아래와 같이 도메인 이름 풀이가 잘 되는지 확인합니다.
7). NFS01 가상머신 (NFS : 111, 2049 포트 사용)
WEB01 가상머신에서 마운트 된 /data01을 아래와 같이 언마운트 합니다.
[root@web01 ~]# df
Filesystem 1K-blocks Used Available Use% Mounted on /dev/mapper/vg_os-root 16177064 2696240 12652408 18% / tmpfs 957724 224 957500 1% /dev/shm /dev/sda1 194241 33170 150831 19% /boot 192.168.80.12:/data01 16177152 2743552 12605184 18% /data01 [root@web01 ~]# [root@web01 ~]# umount /data01 |
NFS01 가상머신에서 아래와 같이 iptables을 설정하고 서비스를 시작합니다.
[root@nfs01 ~]# vi /etc/sysconfig/iptables
# Firewall configuration written by system-config-firewall # Manual customization of this file is not recommended. *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 2049 -j ACCEPT -A INPUT -m state --state NEW -m udp -p udp --dport 2049 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 111 -j ACCEPT -A INPUT -m state --state NEW -m udp -p udp --dport 111 -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT [root@nfs01 ~]# [root@nfs01 ~]# service iptables start iptables: Applying firewall rules: [ OK ] [root@nfs01 ~]# [root@nfs01 ~]# chkconfig iptables on [root@nfs01 ~]# |
WEB01에서 NFS01 공유 디렉터리를 다시 마운트 합니다. 마운트가 된다면 방화벽 정책이 정상적으로 설정된 것입니다.
[root@web01 ~]# mount /data01
[root@web01 ~]# df Filesystem 1K-blocks Used Available Use% Mounted on /dev/mapper/vg_os-root 16177064 2696236 12652412 18% / tmpfs 957724 224 957500 1% /dev/shm /dev/sda1 194241 33170 150831 19% /boot 192.168.80.12:/data01 16177152 2743552 12605184 18% /data01 [root@web01 ~]# |
8). Samba01 가상머신 (Samba : 137, 138, 139, 445 포트 사용)
아래와 같이 Samba 서비스 포트를 설정하고 그리고 iptables 서비스를 실행합니다.
[root@samba01 ~]# vi /etc/sysconfig/iptables
# Firewall configuration written by system-config-firewall # Manual customization of this file is not recommended. *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 137 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 138 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 139 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 445 -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT [root@samba01 ~]# [root@samba01 ~]# service iptables start iptables: Applying firewall rules: [ OK ] [root@samba01 ~]# [root@samba01 ~]# chkconfig iptables on [root@samba01 ~]# |
Windows 8.1 가상머신에서 탐색기를 이용하여 Samba01 가상머신의 공유 디렉터리에 접근한 후 파일을 생성합니다.
Samba01 서버에서 관련 디렉터리(폴더)가 잘 생성되었는지 확인합니다. 생성이 되었다면 정상적으로 Samba 서비스가 되는 것입니다.
[root@samba01 samba]# ls -l /public01/
total 30844 drwxr-xr-x. 2 nobody nobody 4096 Jul 27 16:35 새 폴더 -rw-r--r--. 1 root root 31580160 Jul 27 06:22 etc.tar [root@samba01 samba]# |
9). DHCP NTP 가상머신 (DHCP : 67 포트 사용, NTP : 123 포트 사용)
[root@dhcpntp ~]# vi /etc/sysconfig/iptables
# Firewall configuration written by system-config-firewall # Manual customization of this file is not recommended. *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT -A INPUT -m state --state NEW -m tcp -p udp --dport 67 -j ACCEPT -A INPUT -p udp --dport 123 -m state --state NEW -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT [root@dhcpntp ~]# [root@dhcpntp ~]# [root@dhcpntp ~]# service iptables start iptables: Applying firewall rules: [ OK ] [root@dhcpntp ~]# [root@dhcpntp ~]# chkconfig iptables on [root@dhcpntp ~]# |
DHCP 테스트를 위해 Windows 8.1 가상머신을 DHCP 클라이언트로 구성한 후 DHCP 서버로부터 IP 주소를 받을 수 있도록 설정합니다. IP를 정상적으로 받아오면 아래와 같이 출력됩니다.
여기까지 iptables 리눅스 방화벽 간단 구성에 대해 알아보았습니다.
No comments:
Post a Comment