iptables FORWARD에 대해서
작성자 정보
- 홍석범 작성
- 작성일
컨텐츠 정보
- 3,760 조회
- 0 추천
- 목록
본문
안녕하십니까? 홍석범입니다.
많은 분들이 INPUT과 FORWARD를 명확히 구분하지 못하시는 것 같습니다.
FORWARD는 nat 테이블을 통해 방화벽을 통과하여 내부의 서버로 전달되는 경우에 해당됩니다.
따라서, 한대의 서버에서 운영하실 때에는 INPUT만 고려하시면 됩니다.
감사합니다.
구자열 님의 글
안녕하세요.
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로 간주하라는 것 같은데요.
그러면 위의 룰셋은 둘 다 똑같은 결과를 가지지 않는가요?
이 두가지가 궁금합니다.
관련자료
-
이전
-
다음