[server] iptables 팁과 트릭 [닫힘]

필자는 Linux sysadmin이 패킷 필터링 프레임 워크에 iptables대한 사용자 인터페이스 인에 대해 잘 알고 있다고 확신 netfilter합니다.

이제이 “질문”은 다양한 비트 -n- 조각의 지혜 를 모으기위한 커뮤니티 위키 입니다 iptables. 너무 흔하거나 모호한 것은 없습니다. 다른 사람이 최대한 활용하는 데 도움이되는 내용을 게시하십시오 iptables.



답변

iptables와 함께 화이트리스트 및 블랙리스트 사용

#!/bin/bash

WHITELIST=/whitelist.txt
BLACKLIST=/blacklist.txt

#THIS WILL CLEAR ALL EXISTING RULES!
echo 'Clearing all rules'
iptables -F

#
## Whitelist
#

for x in `grep -v ^# $WHITELIST | awk '{print $1}'`; do
        echo "Permitting $x..."
        $IPTABLES -A INPUT -t filter -s $x -j ACCEPT
done

#
## Blacklist
#

for x in `grep -v ^# $BLACKLIST | awk '{print $1}'`; do
        echo "Denying $x..."
        $IPTABLES -A INPUT -t filter -s $x -j DROP
done

포트를 여는 스크립트

#!/bin/bash
ALLOWEDTCP="80 3128 3784"
ALLOWEDUDP="3128 3784"

#
## Permitted Ports
#

for port in $ALLOWEDTCP; do
       echo "Accepting port TCP $port..."
       $IPTABLES -A INPUT -t filter -p tcp --dport $port -j ACCEPT
done

for port in $ALLOWEDUDP; do
        echo "Accepting port UDP $port..."
        $IPTABLES -A INPUT -t filter -p udp --dport $port -j ACCEPT
done

포트 차단

# Attempt to block portscans
# Anyone who tried to portscan us is locked out for an entire day.
iptables -A INPUT   -m recent --name portscan --rcheck --seconds 86400 -j DROP
iptables -A FORWARD -m recent --name portscan --rcheck --seconds 86400 -j DROP

# Once the day has passed, remove them from the portscan list
iptables -A INPUT   -m recent --name portscan --remove
iptables -A FORWARD -m recent --name portscan --remove

# These rules add scanners to the portscan list, and log the attempt.
iptables -A INPUT   -p tcp -m tcp --dport 139 -m recent --name portscan --set -j LOG --log-prefix "Portscan:"
iptables -A INPUT   -p tcp -m tcp --dport 139 -m recent --name portscan --set -j DROP

iptables -A FORWARD -p tcp -m tcp --dport 139 -m recent --name portscan --set -j LOG --log-prefix "Portscan:"
iptables -A FORWARD -p tcp -m tcp --dport 139 -m recent --name portscan --set -j DROP

스푸핑 / 잘못된 패킷

# Reject spoofed packets
# These adresses are mostly used for LAN's, so if these would come to a WAN-only server, drop them.
iptables -A INPUT -s 10.0.0.0/8 -j DROP
iptables -A INPUT -s 169.254.0.0/16 -j DROP
iptables -A INPUT -s 172.16.0.0/12 -j DROP
iptables -A INPUT -s 127.0.0.0/8 -j DROP

#Multicast-adresses.
iptables -A INPUT -s 224.0.0.0/4 -j DROP
iptables -A INPUT -d 224.0.0.0/4 -j DROP
iptables -A INPUT -s 240.0.0.0/5 -j DROP
iptables -A INPUT -d 240.0.0.0/5 -j DROP
iptables -A INPUT -s 0.0.0.0/8 -j DROP
iptables -A INPUT -d 0.0.0.0/8 -j DROP
iptables -A INPUT -d 239.255.255.0/24 -j DROP
iptables -A INPUT -d 255.255.255.255 -j DROP

# Drop all invalid packets
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A FORWARD -m state --state INVALID -j DROP
iptables -A OUTPUT -m state --state INVALID -j DROP

스머프 공격 차단

# Stop smurf attacks
iptables -A INPUT -p icmp -m icmp --icmp-type address-mask-request -j DROP
iptables -A INPUT -p icmp -m icmp --icmp-type timestamp-request -j DROP
iptables -A INPUT -p icmp -m icmp -j DROP

# Drop excessive RST packets to avoid smurf attacks
iptables -A INPUT -p tcp -m tcp --tcp-flags RST RST -m limit --limit 2/second --limit-burst 2 -j ACCEPT

ICMP 차단 (일명 핑)

# Don't allow pings through
iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j DROP


답변

다음을 사용하여 netfilter의 성능 최적화 ipset

단순한 IP, 포트 또는 둘 모두를 기반으로 많은 유사한 규칙 을 작성하는 경우 ipsetnetfilter 성능을 최적화 하는 데 사용하는 것이 좋습니다.

예를 들면 다음과 같습니다.

iptables -s 192.168.1.11 -j ACCEPT
iptables -s 192.168.1.27 -j ACCEPT
iptables -s 192.168.1.44 -j ACCEPT
... hundreds of similar rules ...
iptables -s 192.168.251.177 -j ACCEPT

즉, 소스 주소가 192.168.251.177 인 패킷 은 ACCEPT의 판정을 받기 전에 먼저 수백 개의 규칙을 통과해야합니다 .

물론 숙련 된 sysadmin은 규칙을 서브넷별로 분할합니다. 그러나 그것은 여전히 수백 가지 규칙을 의미합니다.

ipset 구조에!

먼저 다음 ipmap유형 의 IP 세트를 정의하십시오 .

ipset -N Allowed_Hosts ipmap --network 192.168.0.0/16

그런 다음 주소로 채우십시오.

for ip in $LIST_OF_ALLOWED_IP; do ipset -A Allowed_Hosts $ip; done

마지막으로, 위의 수백 가지 iptables 규칙을 하나의 규칙 으로 바꾸십시오 .

iptables -m set --match-set Allowed_Hosts src -j ACCEPT

패킷이 도착하면 netfilter는 IP 세트 에 대한 패킷 소스 (src) IP에 대한 매우 빠른 비트 맵 검색을 수행합니다 Allowed_Hosts. 192.168.0.0/16에서 오는 모든 패킷에는 하나의 규칙이 적용됩니다. 비트 맵을 검색하는 것이 수백 개의 iptables 규칙 검사를 수행하는 것보다 적어도 2 배 빠릅니다.

ipsetIP 주소로 제한되지 않습니다. 또한 포트, IP 포트 튜플, 네트워크 / 서브넷 주소, IP-MAC 튜플 등을 기반으로 일치시킬 수 있습니다. 그리고이 기준을 소스 또는 대상 또는 둘의 혼합으로 일치시킬 수 있습니다 (튜플의 경우).

마지막 ipset으로 IP 주소를 블랙리스트 / 화이트리스트에 자동으로 넣을 수 있습니다. 이러한 블랙리스트 / 화이트리스트는 ‘연령’될 수 있으므로 구성 가능한 시간이 지난 후 IP 주소를 자동으로 삭제합니다.

자세한 내용은 ipset의 매뉴얼 페이지 를 참조하십시오.

매우 중요한 참고 사항 :

일부 Linux 배포판 은 ‘ 즉석에서 ‘지원 하지 않을 수 있습니다 ipset(예 : Ubuntu 10.04에이 문제가 있음). 이러한 시스템에서 한 가지 방법은 ipset소스 코드에서 설치 하는 것입니다.

대신 ipset웹 사이트 ( http://ipset.netfilter.org/install.html) 에서 소스를 다운로드하십시오 .

또는을 사용 xtables-addons하면 ipset 해당 소스에 포함됩니다. http://xtables-addons.sourceforge.net/


답변

규칙에 의견을 추가하십시오.

-m comment --comment "Comments help to read output of iptables -nvL"


답변

잘 알려진 TCP 공격 차단

다음 규칙을 추가하십시오. -t raw -A PREROUTING

-p tcp --tcp-flags FIN,SYN FIN,SYN -j DROP
-p tcp --tcp-flags SYN,RST SYN,RST -j DROP
-p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,PSH,URG -j DROP
-p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN -j DROP
-p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
-p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j DROP

차단되는 공격은 각각 다음과 같습니다.

  • SYN-FIN 공격
  • SYN-RST 공격
  • 엑스 마스 공격
  • nmap FIN 스캔
  • NULL 플래그 공격
  • ALLflags 공격

(위의 공격 이름을 자유롭게 편집하십시오)


답변

NAT 활성화

  1. echo 1 > /proc/sys/net/ipv4/ip_forward
  2. /sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

1 단계는 ip 전달을 허용하도록 커널 매개 변수를 설정하고 2 단계는 인터페이스 eth0에서 NAT를 사용 가능하게하는 iptables 규칙을 설정합니다.


답변

ICMP 공격 차단

다음 규칙을 추가하십시오. -t raw -A PREROUTING

-p icmp -m u32 ! --u32 "4&0x3FFF=0"   -j DROP
-p icmp -m length --length 1492:65535 -j DROP

첫 번째 규칙 블록 그의 모든 ICMP 패킷은 “분열 플래그가”0 아닌 (ICMP이해야 결코 분열되지 그들은 작은 페이로드를 운반한다)

두 번째 규칙은 크기가 큰 조각화되지 않은 ICMP 패킷을 차단합니다.


답변

FireHOL 사용 -편리한 iptables 래퍼

직접 iptables 명령보다 훨씬 직관적이라는 것을 알았습니다. 특히 다른 방화벽에 대한 경험이있는 사람들에게 :

FireHOL은 Linux 호스트 및 라우터에서 네트워크 인터페이스, 경로 수, 서비스 수, 서비스 변형 사이의 복잡성 (긍정적 및 부정적 포함)이있는 상태 저장 IPtables 패킷 필터링 방화벽을 생성하는 iptables 방화벽 생성기입니다. 식).