본문으로 바로가기


안녕하세요, SATAz입니다.

이번 포스팅은 IPTables에 대해서 소개드리는 두 번째 내용입니다.




지난 포스팅에서는 IPTables를 설치하는 방법에 대해서 소개해 드렸는데요, 

이번 포스팅에서는 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 -[옵션] [체인명] -s [출발지 IP주소] -d [도착지 IP주소] -j [정책]


###옵션설명###

-A    : 추가할 룰을 맨 아래의 줄에 추가

-I     : 추가할 룰을 맨 위의 줄에 추가

-D    : 특정 룰을 삭제

-n    : IP를 reverse DNS에 등록된 도메인으로 검색해서 보여주지 않는 옵션 (순수 IP로 보여줌)

-L     : 입력된 체인 or 전체 체인에 설정된 룰을 출력

-N    : 이미 정의된 체인 외적으로, 사용자 정의 체인을 생성

-X    : -N 명령어로 추가생성한 체인을 삭제

-E     : 체인의 이름을 바꾼다.


[정책] 부분에 "-j ACCEPT"가 들어가면 허용이고, "-j DROP"이 들어가면 차단입니다. 뒤의 내용을 한번 읽어보시고, 방화벽 룰을 설정하실 때 적절하게 이용하시면 됩니다.


3. IPTables 방화벽 룰의 우선순위

IPTables방화벽 룰의 위치가 위에쪽에 있을 경우에 우선순위가 높습니다. 

("우선순위가 높다"는 표현이 햇갈리시는 분은, "힘이 세다" 정도로 생각해보시면 쉽습니다 ^^)


예제 1)

출발지 : 1.1.1.1 -> 도착지 : 10.10.10.10 = 허용

출발지 : 2.2.2.2 -> 도착지 : 10.10.10.10 = 허용

출발지 : 3.3.3.3 -> 도착지 : 10.10.10.10 = 허용

출발지 : any     -> 도착지 : 10.10.10.10 = 차단


도착지 10.10.10.10과 관련된 룰 맨 아래에는, 모든 출발지 IP로부터 들어오는 것을 차단하겠다는 내용이 있습니다.

그리고 그 위에 1.1.1.1과 2.2.2.2, 3.3.3.3은 허용하겠다는 룰이 설정이 되어있죠.

따라서 전체적인 Access는 모두 차단한 상태에서, 위의 3개 아이피만 허용하겠다는 의미가 됩니다.


예제 2)

출발지 : any     -> 도착지 : 10.10.10.10 = 허용

출발지 : any     -> 도착지 : 10.10.10.10 = 차단


그렇다면 "예제 2)"의 경우에는 어떻게 될까요? 

맨 밑에 "전체 차단"하는 설정이 들어가있습니다. 

하지만 위쪽에 있을 수록 우선순위가 높기 때문에, 위에 있는 "전체 허용"이 적용되어 모든 아이피로부터의 Access가 가능한 상태입니다.


예제 3)

출발지 : any     -> 도착지 : 10.10.10.10 = 차단

출발지 : any     -> 도착지 : 10.10.10.10 = 허용


"예제 3)"의 경우에도 마찬가지로, 위에 "전체 차단"이 적용되어있기 때문에,

모든 아이피로부터의 Access가 차단되는 상태입니다.



4. IPTables를 이용한 패킷의 차단과 허용 - iptables 명령어를 이용한 설정 방법


"/etc/sysconfig/iptables" 파일의 내용을 보시면, 아래와 같이 -A옵션으로 정리되어있는 설정을 확인하실 수 있습니다.

-A가 룰을 추가하는 명령이니, 이를 -D로 바꾸면 룰이 삭제가 될 것 같네요.

쉘에서 명령어로 입력할 것이기 때문에, 명령어의 시작을 "#iptables -D ~~~~"로 시작하시면 룰이 삭제가 됩니다.


# 초기 설정파일의 샘플 내용을 확인

[root@localhost ~]# view /etc/sysconfig/iptables


# sample configuration for iptables service

# you can edit this manually or use system-config-firewall

# please do not ask us to add additional ports/services to this default configuration

*filter

:INPUT ACCEPT [0:0]

:FORWARD ACCEPT [0:0]

:OUTPUT ACCEPT [0:0]

-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 -j REJECT --reject-with icmp-host-prohibited

-A FORWARD -j REJECT --reject-with icmp-host-prohibited

COMMIT


# 샘플 룰 삭제를 위한 명령어

iptables -D INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

iptables -D FORWARD -j REJECT --reject-with icmp-host-prohibited

iptables -D INPUT -p icmp -j ACCEPT

iptables -D INPUT -i lo -j ACCEPT

iptables -D INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

iptables -D INPUT -j REJECT --reject-with icmp-host-prohibited

iptables -D FORWARD -j REJECT --reject-with icmp-host-prohibited


# 명령어의 적용

# 명령어를 입력하기 전의 iptbales 룰 내역입니다.


[root@localhost ~]# iptables -nL

Chain INPUT (policy ACCEPT)

target     prot opt source               destination         

ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED

ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           

ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           

ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:22

REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited


Chain FORWARD (policy ACCEPT)

target     prot opt source               destination         

REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited


Chain OUTPUT (policy ACCEPT)

target     prot opt source               destination    


# 룰을 삭제하기 위한 명령어입니다.     


[root@localhost ~]# iptables -D INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

[root@localhost ~]# iptables -D FORWARD -j REJECT --reject-with icmp-host-prohibited

[root@localhost ~]# iptables -D INPUT -p icmp -j ACCEPT

[root@localhost ~]# iptables -D INPUT -i lo -j ACCEPT

[root@localhost ~]# iptables -D INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

[root@localhost ~]# iptables -D INPUT -j REJECT --reject-with icmp-host-prohibited

[root@localhost ~]# iptables -D FORWARD -j REJECT --reject-with icmp-host-prohibited

[root@localhost ~]# 


# 명령어가 적용된 이후의 iptables 룰 내역입니다.


[root@localhost ~]# iptables -nL

Chain INPUT (policy ACCEPT)

target     prot opt source               destination         


Chain FORWARD (policy ACCEPT)

target     prot opt source               destination         


Chain OUTPUT (policy ACCEPT)

target     prot opt source               destination         

[root@localhost ~]# 


그리고 룰을 추가하기 위한 명령어를 입력합니다. 아래 명령어의 의미는 다음과 같습니다.


# 모든 접근을 차단하고 1.1.1.1, 2.2.2.2, 3.3.3.3 아이피로의 접근들에 대해서 접근을 허용한다.


# 새로운 룰 추가를 위한 명령어

iptables -A  INPUT -s 1.1.1.1 -d 192.168.0.18 -j ACCEPT

#1.1.1.1 아이피의 접근을 허용한다.


iptables -A  INPUT -s 2.2.2.2 -d 192.168.0.18 -j ACCEPT

#2.2.2.2 아이피의 접근을 허용한다.


iptables -A  INPUT -s 3.3.3.3 -d 192.168.0.18 -j ACCEPT

#3.3.3.3 아이피의 접근을 허용한다.


iptables -A INPUT -s 192.168.0.1 -d 192.168.0.18 -j ACCEPT

#게이트웨이 주소 정도는 넣어줘야, 외부와의 통신이 가능합니다.

#정상적인 통신을 하기 위해서는 게이트웨이 외에도, 네임서버 주소 등을 방화벽에 허용 아이피로 추가해주는 것이 좋습니다 ^^


iptables -A  INPUT -s 0.0.0.0/0 -d 192.168.0.18 -j DROP

#전체적인 접근을 차단한다.


# 명령어의 적용

[root@localhost ~]# iptables -A  INPUT -s 1.1.1.1 -d 192.168.0.18 -j ACCEPT

[root@localhost ~]# iptables -A  INPUT -s 2.2.2.2 -d 192.168.0.18 -j ACCEPT

[root@localhost ~]# iptables -A  INPUT -s 3.3.3.3 -d 192.168.0.18 -j ACCEPT

[root@localhost ~]# iptables -A  INPUT -s 0.0.0.0 -d 192.168.0.18 -j DROP

[root@localhost ~]# 

[root@localhost ~]# 

[root@localhost ~]# iptables -nL

Chain INPUT (policy ACCEPT)

target     prot opt source               destination         

ACCEPT     all  --  1.1.1.1              192.168.0.18        

ACCEPT     all  --  2.2.2.2              192.168.0.18        

ACCEPT     all  --  3.3.3.3              192.168.0.18        

ACCEPT     all  --  192.168.0.1          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 룰셋을 명령어로 작업하셨을 경우. 서버 재부팅이나 iptables 서비스 재시작 이슈가 있을 때 작업했던 내용이 전부다 날라갑니다.

따라서 반드시 아래의 명령어를 입력해주셔서, "/etc/sysconfig/iptables" 설정파일에도 내용을 적용시켜주셔야합니다. 


# 현재 방화벽 상태를, 설정파일에 저장

[root@localhost ~]# iptables-save > /etc/sysconfig/iptables 


**주의!! 한번더 강조!! : iptables 명령어로 룰을 추가/삭제 하는 작업을 하셨을 경우에, 서버가 재부팅되거나 iptables가 재시작되면 작업했던 내용이 모두다 싹~ 날라갑니다. 따라서 반드시 "#iptables-save > /etc/sysconfig/itpables" 명령어를 입력해주셔야지 설정파일에도 적용이 됩니다!!



6. iptables 설정파일을 이용하여 룰 추가하는 방법

기본 샘플로 설정된 방화벽 설정을 모두 지워보도록 하겠습니다. (파일 경로 : /etc/sysconfig/iptables)


# 설정파일의 내용 확인

[root@localhost ~]# view /etc/sysconfig/iptables


# sample configuration for iptables service

# you can edit this manually or use system-config-firewall

# please do not ask us to add additional ports/services to this default configuration

*filter

:INPUT ACCEPT [0:0]

:FORWARD ACCEPT [0:0]

:OUTPUT ACCEPT [0:0]

##-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 -j REJECT --reject-with icmp-host-prohibited

##-A FORWARD -j REJECT --reject-with icmp-host-prohibited

COMMIT


//"##"을 이용하여 현재 적용되어있는 룰을 주석처리했으며, 이렇게 표기한 룰을 지워줍니다.


방화벽 설정을 추가해보도록 하겠습니다. (파일 경로 : /etc/sysconfig/iptables)

:INPUT ACCEPT [0:0]

:FORWARD ACCEPT [0:0]

:OUTPUT ACCEPT [0:0]

위의 세개 설정 때문에, 아무런 룰셋이 없는 상태에서는 ALL Allow (전체 허용) 상태가 됩니다.

따라서 맨 아래에 "전체 차단"하는 룰을 적용하고, 그 위에 일부 허용할 아이피만 추가할 것입니다.


아래 명령어의 의미는 다음과 같습니다.

#모든 아이피의 접근을 차단하고 1.1.1.1, 2.2.2.2, 3.3.3.3 아이피에 대한 접근을 허용하겠다.


# 설정파일의 내용 확인

[root@localhost ~]# view /etc/sysconfig/iptables


# sample configuration for iptables service

# you can edit this manually or use system-config-firewall

# please do not ask us to add additional ports/services to this default configuration

*filter

:INPUT ACCEPT [0:0]

:FORWARD ACCEPT [0:0]

:OUTPUT ACCEPT [0:0]

-A INPUT -s 1.1.1.1 -d 192.168.0.18 -j ACCEPT         #1.1.1.1 아이피로부터의 접근을 허용한다


-A INPUT -s 2.2.2.2 -d 192.168.0.18 -j ACCEPT         #2.2.2.2 아이피로부터의 접근을 허용한다.


-A INPUT -s 3.3.3.3 -d 192.168.0.18 -j ACCEPT         #3.3.3.3 아이피로부터의 접근을 허용한다.


-A INPUT -s 192.168.0.1 -d 192.168.0.18 -j ACCEPT

#게이트웨이 주소 정도는 넣어줘야, 외부와의 통신이 가능합니다.

#정상적인 통신을 하기 위해서는 게이트웨이 외에도, 네임서버 주소 등을 방화벽에 허용 아이피로 추가해주는 것이 좋습니다 ^^


-A INPUT -s 0.0.0.0/0 -d 192.168.0.18 -j DROP         #모든 아이피로부터의 접근을 차단한다.


COMMIT

~                                   


위의 설정을 저장하고, 반드시 iptables를 재시작해주셔야합니다.

재시작을 해주지 않으시면 기존의 룰들이 그대로 남아있습니다. 당연히 추가된 룰도 적용되지 않습니다.


# 설정파일 적용을 위한 iptables의 재시작

[root@localhost ~]# iptables -nL

Chain INPUT (policy ACCEPT)

target     prot opt source               destination         

ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED

ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           

ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           

ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:22

REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited


Chain FORWARD (policy ACCEPT)

target     prot opt source               destination         

REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited


Chain OUTPUT (policy ACCEPT)

target     prot opt source               destination   

      



// iptables 서비스를 재시작하는 명령어

[root@localhost ~]# systemctl restart iptables




// iptables 서비스를 재시작하고난 뒤의 iptables 상태 확인

[root@localhost ~]# iptables -nL

Chain INPUT (policy ACCEPT)

target     prot opt source               destination         

ACCEPT     all  --  1.1.1.1              192.168.0.18        

ACCEPT     all  --  2.2.2.2              192.168.0.18        

ACCEPT     all  --  3.3.3.3              192.168.0.18        

ACCEPT     all  --  192.168.0.1          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     


이제 방화벽 룰셋 설정을 완료했습니다 ^^


다음 시간에는 특정 아이피의 접근을 서비스포트별로 허용/차단하는 설정을 다루겠습니다.

지금까지 읽어주셔서 감사합니다 ^^




댓글을 달아 주세요

  1. 2018.09.04 14:52

    비밀댓글입니다

    • SATAz 2018.09.07 00:46 신고

      안녕하세요, SATAz입니다.

      제가 알기로는 IPTables에서는 any라는 이름으로 주소를 쓸 수가 없는걸로 알고있습니다.
      만약에 "IPTABLES -I INPUT -s any -d any -j ACCEPT" 명령어를 입력했을 경우에 호스트를 찾을 수 없을 것이라는 에러메시지가 출력될꺼에요...

      그 이유가 -s any를 입력하면 DNS에서 any를 찾을 수가 없어서에요... 쉽게 설명드리자면
      "IPTABLES -I INPUT -s sata.kr -d 192.168.0.18 -j ACCEPT"
      형식으로 말씀드려야 할 것 같습니다.
      이 명령어는 sata.kr 도메인으로 연결된 IP주소로부터 들어오는 패킷을 허용한다는 의미입니다.

      따라서 "IPTABLES -I INPUT -s any -d 192.168.0.18 -j ACCEPT"은 'any'라는 도메인으로 연결된 IP주소로부터 들어오는 패킷을 허용한다는 의미가 되죠...

      아마 "any"는 도메인(DNS) 형식에 맞지 않기 때문에 리눅스 서버에서는 any라는 도메인을 찾으려고도 하지 않고 에러메시지를 보여줄껍니다.
      실제 입력해서 나온 에러메시지입니다.
      "[root@localhost ~]# iptables -I INPUT -s ANY -d 192.168.0.18 -p all -j ACCEPT
      iptables v1.4.21: host/network `ANY' not found
      Try `iptables -h' or 'iptables --help' for more information."

      굳이 0.0.0.0/0을 안쓰고 정책을 적용하는 방법도 있습니다.
      "iptables -I INPUT -d 192.168.0.18 -p all -j ACCEPT"
      이렇게 사용하는 거죠.

      요즘 나온 방화벽장비들은 0.0.0.0/0을 기본적으로 ANY라는 이름으로 제공하는 경우가 많습니다. (0.0.0.0/0을 따로 만들어서 사용도 가능할껍니다)
      IPTABLES는 원시적인 방화벽이다보니... 따로 설정을 해주지 않는이상은 ANY라는 글자로 정책을 설정할 수가 없습니다.

      혹시 IP주소 대신에 ANY라는 이름으로 IPTABLES를 적용한 것이 있으시면은, 답글이랑 같이 support@sata.kr 로 메일 보내주시면 저도 확인해보겠습니다. 어쩌면 제가 모르는 방법이 있을수도 있으니까요 ^^

      글구 답변이 늦어져서 정말 죄송합니다. 제가 아주 열~씸히 준비하고있는게 있어서요 ^^

      (*참고 : hosts파일에 "0.0.0.0/0 any"를 입력해도 안됩니다. 해봤습니다;;)

    • SATAz 2018.09.07 00:48 신고

      참고로 하나 더!!

      IPTABLES 말고 다른 방화벽장비에서는
      "ANY"와 0.0.0.0/0의 차이가 없습니다 ^^