질문&답변
클라우드/리눅스에 관한 질문과 답변을 주고 받는 곳입니다.
리눅스 분류

iptables FORWARD에 대해서

작성자 정보

  • 구자열 작성
  • 작성일

컨텐츠 정보

본문

안녕하세요.

iptables의 룰셋중에 FORWARD에 대해서 궁금해서 질문드립니다.

 

공개해주셨던 글중에

--------------------------------------------------

한 IP당 동시 접속량 제한과 자동차단
많은 IP에서 비정상적인 다량의 접속을 시도하므로 한 IP에서의 접속량을 제한하고,       이후에 접속량이 과다한 해당 IP를 자동차단하도록 할 수 있다.

  
#  iptables -A FORWARD -m recent --name badguy --rcheck --seconds 300 -j DROP
#  iptables -A FORWARD -p tcp --syn --dport 80 -m connlimit --connlimit-above 30 -m recent         --name badguy --set -j DROP
#  iptables -A FORWARD -p tcp --syn --dport 80 -m connlimit --connlimit-above 30 -j DROP

 

이렇게 3가지 규칙만 실행하면 되늗데, 단순히 3번째 규칙만 실행하면, 한 IP에서의 동시접속이 30회만 허용되고 그 이상 접속을 하지 못하지만, 앞의 두 가지 규칙과 함께 사용하면 동시접속이 30회 이상 초과하는 IP를 동적으로 300초(5분)동안 차단한다. 동시접속수 제한이나 차단시간은 각자의 환경에 따라 적절히 설정하면 된다.
이때 과다접속으로 차단된 IP에 대한 정보는 다음과 같이 실시간으로 확인할 수 있다.

--------------------------

 

이것에 따라서 connlimit를 커널에 적용하고

위의 룰셋을 명령프람프트상에서 적용했습니다.

 

iptables -nvL 로 확인하니

[root@www etc]# iptables -nvL            
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination        
    0     0 RH-Firewall-1-INPUT  all  --  *      *       0.0.0.0/0            0.0.0.0/0          
    0     0 DROP       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:80 recent: UPDATE seconds: 1 hit_count: 10 name: HTTP side: source
    0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0           recent: CHECK seconds: 300 name: badguy side: source
    0     0 DROP       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:80 flags:0x16/0x02 #conn/32 > 30 recent: SET name: badguy side: source
    0     0 DROP       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:80 flags:0x16/0x02 #conn/32 > 30

 

이렇게 FORWARD쪽에 룰셋이 올라오는걸 확인할 수 있는데요.

iptables -nvL로 패킷의 OUTPUT 차단현황을 보면

FORWARD 룰에서는 0으로 차단되는것 같지가 않습니다.

또한,

cat /proc/net/ipt_recent/badguy

명령을 실행해도 아무것도 나타나지 않습니다.

 

 

그래서, FORWARD를 하지 않고, INPUT룰셋에 적용해 봤는데요.

Chain RH-Firewall-1-INPUT (2 references)
 pkts bytes target     prot opt in     out     source               destination        
    0     0 DROP       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:80 recent: UPDATE seconds: 1 hit_count: 10 name: HTTP side: source
38803 9685K DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0           recent: CHECK seconds: 300 name: badguy side: source
  127  6332 DROP       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:80 flags:0x16/0x02 #conn/32 > 30 recent: SET name: badguy side: source

 

이렇게 INPUT룰셋에서는 차단이 됩니다.

[root@localhost sysconfig]# cat /proc/net/ipt_recent/badguy
src=211.189.201.111 ttl: 120 last_seen: 8400978739 oldest_pkt: 2 last_pkts: 8400529719, 8400978739
src=124.153.233.178 ttl: 117 last_seen: 8401443988 oldest_pkt: 1 last_pkts: 8401443988
src=222.232.18.219 ttl: 120 last_seen: 8400273731 oldest_pkt: 5 last_pkts: 8398347725, 8398914636, 8399582560, 8399897215, 8400273731

또 차단리스트도 확인이 됩니다.

 

 

이게 일반적인 1대의 리눅스웹서버인데요.

FORWARD를 적용하면 안되는것인지? 아니면 iptables -nvL에서 확인할 수 없는지 궁금합니다.

 

 

두번째 궁금한 것은,

cat /etc/sysconfig/iptables

# Firewall configuration written by system-config-securitylevel
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -m recent --name badguy --rcheck --seconds 300 -j DROP
-A RH-Firewall-1-INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 30 -m recent --name badguy --set -j DROP
-A RH-Firewall-1-INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 30 -j DROP

 

이것은 INPUT룰셋으로 적용한 것이고요.

 

 

# Firewall configuration written by system-config-securitylevel
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A FORWARD -m recent --name badguy --rcheck --seconds 300 -j DROP
-A FORWARD -p tcp --syn --dport 80 -m connlimit --connlimit-above 30 -m recent --name badguy --set -j DROP
-A FORWARD -p tcp --syn --dport 80 -m connlimit --connlimit-above 30 -j DROP

 

이것은 FORWARD룰셋에 적용한 것입니다.

-A FORWARD -j RH-Firewall-1-INPUT

이 명령은 제가 보기엔 FORWARD에 대해서 INPUT로 간주하라는 것 같은데요.

그러면 위의 룰셋은 둘 다 똑같은 결과를 가지지 않는가요?

 

 

 

이 두가지가 궁금합니다.

 

 

 

 

 

관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,302 명
  • 현재 강좌수 :  36,966 개
  • 현재 접속자 :  352 명