본문으로 바로가기



안녕하세요, 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 옵션에 대한 설정에 대해서 다루도록 하겠습니다.




댓글을 달아 주세요

  1. tawaki 2020.05.02 23:32

    SATAz님이 설명한
    "쉽게 말씀드리자면 빨간색으로 표시된 정책이 먼저 허용되고, 굵게 표시한 정책으로 다시 차단을 해버린 것입니다."
    부분에서, 다시 차단이라기 보단, 적용되는 룰 맨 처음 것만 적용되고, 나머지 룰은 pass되는 것이죠?

    • SATAz 2020.05.02 23:55 신고

      흐음.... '나머지 룰은 pass'라는 표현은 다소 무리가 있습니다.

      예를들어 전체차단을 밑에 깔고 1.1.1.1 아이피 허용룰을 위에 올리면..... 1.1.1.1만 허용하고 나머지는 차단하는 정책이 만들어지기 때문에........ 맨 처음것만 허용하고 나머지는 무시한다고 할 수 없습니다.

      언급하신 그 문구 위에 "맨 위에 있는 정책일 수록 우선순위를 갖는다" 라는 표현이 더 정확할 것 같습니다

      일단 '다시차단' 이라는 말은 이해하기 쉽게 비유적으로 표현한 것입니다.
      - 원래는 허용정책으로 접근이 가능했을진 몰라도....... 맨 위에 전체차단 룰을 추가해버리면 다시 차단돼버린다- 는 느낌으로 봐주시기 바랍니다.