본문으로 바로가기



안녕하세요, SATAz입니다.

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



지난 포스팅에서는 IPTables 때문에 FTP 디렉토리 조회가 실패했을 때의 조치 방법에 대해서 다루었는데요,

이번 포스팅은 IPTables 때문에 접속속도가 느려지는 것에 대한 비교에 대해서 알려드리고자 합니다.



▣주의!!! : 이 블로그에 작성된 IPTables 포스팅들은 교육용으로 작성된 내용입니다. 

 서비스 중인 서버에 아래의 내용만 갖고 바로 적용하지 마시고, 서버에 적용 전에 반드시 테스트를 거치시기 바랍니다.  IPTables도 방화벽인지라, 무턱대고 서버에 적용했다가는 서비스 중단되는 사태가 발생할 수 있습니다. 필히 주의하셔야합니다!!!


#IPTables 설정를 위한 환경


- 테스트 머신 : VMware WorkStation 12 Player

- 운영체제 : CentOS/RHEL 7 - 64bit ( Minimal 설치 )

- 메모리 : 2GB

- IPTables Version : iptables v1.4.21

- 서버 아이피 : 192.168.0.18


- FTP 서버 패키지 : vsftpd

- FTP 클라이언트 프로그램 : FileZilla


0. 기존 방화벽 설정 ( 5번째 포스팅에서 설정했던 내용)

# 기존 방화벽 설정.

[root@localhost html]# iptables -nL

Chain INPUT (policy ACCEPT)

target     prot opt source               destination         

ACCEPT     tcp  --  0.0.0.0/0            192.168.0.18         state RELATED,ESTABLISHED tcp dpt:21

ACCEPT     tcp  --  0.0.0.0/0            192.168.0.18         state RELATED,ESTABLISHED tcp dpts:1024:65534

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  


1. 방화벽에서 허용은 해주었지만, 접속이 느리다??

 지난 포스팅에서 여러분이 실습하셨던 방화벽은, 위의 "0.기존 방화벽 설정"처럼 되어있을 것입니다. 그런데 이상한 점은 FTP 로그인을 시도할 때, 상당히 많은 시간이 걸리게 됩니다. 마찬가지로, 22번 SSH 접속을 할 때에도 굉장히 느린 현상을 나타내고 있습니다.


이는 모든 패킷들이 IPTables 필터를 하나하나씩 거쳐야 하기 때문인 것으로 예상됩니다.

(자세한 이유는 잘 모르겠습니다;; 제가 추측하기로는 새로운 연결이 들어올때마다, Conntrack으로 IP 연결을 추적하는 과정에서 패킷이 하나하나 DROP정책에 일단 걸렸다가 RELATED 상태의 패킷임을 확인하고 Allow 해주는 것 같습니다.)


따라서 아래의 설정을 1개 추가해주게 될 경우에 굉장히 빠른 접속이 가능하신 것을 확인할 수 있습니다.


# IPTables 명령어

iptables -I INPUT -m state -s 0.0.0.0/0 -d 192.168.0.18 -p all --state ESTABLISHED,RELATED -j ACCEPT


# IPTables 명령어 적용

[root@localhost ~]# iptables -I INPUT -m state -s 0.0.0.0/0 -d 192.168.0.18 -p all --state ESTABLISHED,RELATED -j ACCEPT

[root@localhost ~]# iptables -nL

Chain INPUT (policy ACCEPT)

target     prot opt source               destination         

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

ACCEPT     tcp  --  0.0.0.0/0            192.168.0.18         state RELATED,ESTABLISHED tcp dpts:1024:65534

ACCEPT     tcp  --  0.0.0.0/0            192.168.0.18         tcp dpt:21

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  


2. 위의 설정을 적용 전/후의 비교

 1) 설정을 적용 하기 전의 상황

   - SSH 접속을 할 때, 로그인 프롬프트가 상당히 늦게 뜬다.

   - FTP 로그인을 시도할 때, 상당히 오랜 시간이 걸린다.

   - 서버 내부-> 외부로 어떠한 요청을 시도해도, 시간이 오래 걸린다.

   - 서버 내부->외부로 핑을 날리면 그 어떠한 곳으로도 핑이 갈 수가 없다. 원인은 아래의 포스팅에서 서술되어있다.

   (클릭하여 포스팅 보기>>[IPTables] 4. -m 옵션의 사용 방법 [INPUT]<<클릭하여 포스팅 보기)


 2) 설정을 적용 하고난 후의 상황

   - 위의 모든 상황들이 해결된다.


2. 불필요한 룰은 삭제해주자.

물론 1024:65534 포트에 ESTABLISHED와 RELATED된 패킷을 허용하는 룰과 겹치게 됩니다. 그래서 저는 저 룰을 삭제할 예정입니다.

방화벽의 룰 정리는 보안의 기본이니까요 ^^


# IPTables 명령어

iptables -D INPUT -m state -s 0.0.0.0/0 -d 192.168.0.18 -p tcp --dport 1024:65534 --state ESTABLISHED,RELATED -j ACCEPT


# IPTables 명령어 적용

[root@localhost ~]# iptables -D INPUT -m state -s 0.0.0.0/0 -d 192.168.0.18 -p tcp --dport 1024:65534 --state ESTABLISHED,RELATED -j ACCEPT

[root@localhost ~]# iptables -nL

Chain INPUT (policy ACCEPT)

target     prot opt source               destination         

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

ACCEPT     tcp  --  0.0.0.0/0            192.168.0.18         tcp dpt:21

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   



다음 포스팅은 정말로 DOS를 방어하는 설정을 진행하겠습니다.

긴 글 읽어주셔서 감사합니다 ^^




댓글을 달아 주세요

  1. 박동삼 2018.04.22 02:22

    우연히 들어왔는데 한가지 알려드릴게있습니다
    "이는 모든 패킷들이 IPTables 필터를 하나하나씩 거쳐야 하기 때문인 것으로 예상됩니다."
    -> 접속이 느린 이유는 서버로들어온 클라이언트의 IP를 DNS서버에게 Reverse Lookup을 하기때문에 그런겁니다.
    #vim /etc/ssh/sshd_config
    UseDNS no // 해당 설정을 해주셔야 합니다. 기본값은 주석 처리되어있지만 기본값이 YES입니다.
    #service sshd restart

    • SATAz 2018.04.22 10:11 신고

      댓글 남겨주신 것을 보고, 바로 IPTables에 적용을 해보았는데요...
      접속이 느린 증상은 동일하게 나타나는 것 같습니다...

      예를 들어서 Linux에 SSH연결을 했을 때, ESTABLISHED와 RELATED를 허용하는 룰이 없을 경우에는 약 5초의 Connection Delay가 발생을 하게되는데요...
      UseDNS no 설정을 해도 동일한 지연증상이 발생하는 것 같습니다... (서비스 재시작은 물론 시스템 재시작해도 동일합니다;;)

      좋은 정보 감사합니다. 현장에서 접속 지연증상이 다소 발생하게되면, 이 부분도 고려해봐야겠네요 ^^