다양한 TCP 공격을 필터링하기 위해 iptables를 사용하는 것이 다른 곳이나 다른 곳에서 필터링되기 때문에 쓸모가 없습니까?

다양한 TCP 공격을 필터링하기 위해 iptables를 사용하는 것이 다른 곳이나 다른 곳에서 필터링되기 때문에 쓸모가 없습니까?

배경

저는 데비안 10 버스터를 사용하고 있습니다. 내 집 IP 주소에서 Tor 릴레이를 실행하기 시작했습니다. 완전한 전용 서버는 가장 에너지 효율적인 방법이 아닐 수도 있지만 시도해 보고 싶습니다. 비트코인 데몬 실행을 중단한 이후로 사용 가능한 트래픽이 많습니다. 즉, 과거 경험을 통해 우리의 문제가 아닌 순전히 네트워크 문제가 있음을 알고 있습니다.이 주제를 다루는 자매 사이트.


연구

오늘 아침에 나는 한 사람을 만났습니다.ServerFault에 대한 아주 오래된 답변, 궁금했기 때문에 이러한 규칙을 적용했습니다. 아래 전체 목록을 참조하세요. 다른 곳에서 찾은 몇 가지 규칙을 더 추가했습니다. 단순화하여 멋진 구조를 만들었습니다.

다음 규칙이 현재 2019 커널에서 측정 가능한 결과를 가져올 수 있는지 묻고 싶습니다 4.19.0-2-amd64.


iptables"IPv4 파일 에서 - /etc/iptables/rules.v4:

--append INPUT --proto all --fragment                                --jump DROP    --match comment --comment "all fragmented packets"
--append INPUT --proto all --match state --state INVALID             --jump DROP    --match comment --comment "all invalid packets"
--append INPUT --proto icmp --match u32 ! --u32 "0x4&0x3fff=0x0"     --jump DROP    --match comment --comment "icmp fragmented packets"
--append INPUT --proto icmp --match length --length 1492:65535       --jump DROP    --match comment --comment "icmp oversized unfragmented packets"
--append INPUT --proto tcp ! --syn --match state --state NEW         --jump DROP    --match comment --comment "new non-syn packets"
--append INPUT --proto tcp --tcp-flags  ALL  NONE                    --jump DROP    --match comment --comment "NULL scan"
--append INPUT --proto tcp --tcp-flags  ALL  ALL                     --jump DROP    --match comment --comment "Xmas scan"
--append INPUT --proto tcp --tcp-flags  ALL  FIN,URG,PSH             --jump DROP    --match comment --comment "stealth scan"
--append INPUT --proto tcp --tcp-flags  ALL  SYN,RST,ACK,FIN,URG     --jump DROP    --match comment --comment "pscan 1"
--append INPUT --proto tcp --tcp-flags  SYN,FIN  SYN,FIN             --jump DROP    --match comment --comment "pscan 2"
--append INPUT --proto tcp --tcp-flags  FIN,RST  FIN,RST             --jump DROP    --match comment --comment "pscan 3"
--append INPUT --proto tcp --tcp-flags  SYN,RST  SYN,RST             --jump DROP    --match comment --comment "SYN-RST scan"
--append INPUT --proto tcp --tcp-flags  ACK,URG  URG                 --jump DROP    --match comment --comment "URG scans"
--append INPUT --proto tcp --tcp-flags  ALL  SYN,FIN                 --jump DROP    --match comment --comment "SYN-FIN scan"
--append INPUT --proto tcp --tcp-flags  ALL  URG,PSH,FIN             --jump DROP    --match comment --comment "nmap Xmas scan"
--append INPUT --proto tcp --tcp-flags  ALL  FIN                     --jump DROP    --match comment --comment "FIN scan"
--append INPUT --proto tcp --tcp-flags  ALL  URG,PSH,SYN,FIN         --jump DROP    --match comment --comment "nmap-id scan"

지금까지, 이후0.5일, 일부 패킷을 캡처하는 규칙 #2와 #5만 볼 수 있습니다.

2       67 13972 DROP       all  --  any    any     anywhere             anywhere             state INVALID /* all invalid packets */
5      158 81683 DROP       tcp  --  any    any     anywhere             anywhere             tcp flags:!FIN,SYN,RST,ACK/SYN state NEW /* new non-syn packets */

뒤쪽에1.25일, 여전히 하나의 TCP 규칙과 잘못된 규칙만 캡처합니다.

2      178 26785 DROP       all  --  any    any     anywhere             anywhere             state INVALID /* all invalid packets */
5      467  241K DROP       tcp  --  any    any     anywhere             anywhere             tcp flags:!FIN,SYN,RST,ACK/SYN state NEW /* new non-syn packets */

뒤쪽에7 일, 여전히 하나의 TCP 규칙과 유효하지 않은 규칙만 캡처합니다. + 일반적으로 INPUT 체인에서 이전에는 눈치채지 못했던 많은 DROP을 볼 수 있습니다.

Chain INPUT (policy DROP 62772 packets, 17M bytes)
2     3475  355K DROP       all  --  any    any     anywhere             anywhere             state INVALID /* all invalid packets */
5     2459 1324K DROP       tcp  --  any    any     anywhere             anywhere             tcp flags:!FIN,SYN,RST,ACK/SYN state NEW /* new non-syn packets */

질문

다른 규칙은 다른 곳이나 다른 곳에서 필터링되기 때문에 더 이상 사용되지 않는 것으로 간주됩니까?

답변1

@roaima의 답변을 완성하려면진짜모든 작은 세부 사항을 원하기 때문에 아래 두 규칙이 대부분의 구성에서 일치하지 않는 이유입니다.

--append INPUT --proto all --fragment                                --jump DROP

그리고

--append INPUT --proto icmp --match u32 ! --u32 "0x4&0x3fff=0x0"     --jump DROP

--match u32 ! --u32 "0x4&0x3fff=0x0"MF 플래그를 포함할 수도 있다는 점을 제외하면 정교한 저수준 쓰기 방법 --fragment입니다. 조각 오프셋(+플래그 MF)은 다음과 같습니다.IP 패킷의 오프셋 4에 있는 u32 워드( 0x4), 가장 낮은 비트 부분 ( &0x3fff): null이 아닌 값은 조각을 소유하는 것(또는 더 많은 조각을 선언하는 것)과 같습니다.

--match state그러나 (적어도) 모듈이 로드되기 때문에 nf_conntrack모듈이 필요합니다 nf_defrag_ipv4. 이 조각 모음은 PREROUTING후크에서 수행 됩니다.우선순위-400, 따라서 조각을 볼 수 있는 어떤 것도 허용하지 않고 새로 재조립된 패킷만 볼 수 있습니다. 최신 커널에서는 raw테이블을 더 낮은 우선순위로 로드할 수 있습니다.

# modinfo -p iptable_raw
raw_before_defrag:Enable raw table before defrag (bool)

따라서 이러한 패킷을 보는 것은 허용되지만 원래 테이블에서만 가능합니다(분명히 conntrack을 사용하지 않음).

이제 또한 될 것이다진짜ip_tables이전 예와는 달리 기본적으로 데비안 버스터 는 어떤 모듈도 사용하지 않습니다 iptable_*. 왜냐하면 iptables, 데비안 버스터기본적으로 사용됨 iptables-nft이것은 nftables를 통해 번역된 iptables이지만 여전히 가끔 사용됩니다.iptables 확장' xt_*모듈.

업데이트: 여전히 u32모듈을 사용하고 작동할 수 있지만 nft를 통해 규칙을 변경하려는 시도를 차단합니다(예: 저장한 다음 복원할 수 없으며 이제 시뮬레이션은 항상 체인에 대해 우선 순위 -300을 선택합니다 raw/PREROUTING).

root@buster-amd64:~# update-alternatives --display iptables|head -3
iptables - auto mode
  link best version is /usr/sbin/iptables-nft
  link currently points to /usr/sbin/iptables-nft


# iptables -A INPUT -p udp --fragment -j DROP
# iptables -A INPUT -p icmp --match u32 ! --u32 "0x4&0x3fff=0x0" -j DROP
# iptables -S INPUT
-P INPUT ACCEPT
-A INPUT -p udp -f -j DROP
-A INPUT -p icmp -m u32 ! --u32 "0x4&0x3fff=0x0" -j DROP
# nft --debug=netlink list ruleset -a
ip filter INPUT 4 
  [ meta load l4proto => reg 1 ]
  [ cmp eq reg 1 0x00000011 ]
  [ payload load 2b @ network header + 6 => reg 1 ]
  [ bitwise reg 1 = (reg=1 & 0x0000ff1f ) ^ 0x00000000 ]
  [ cmp neq reg 1 0x00000000 ]
  [ counter pkts 0 bytes 0 ]
  [ immediate reg 0 drop ]

ip filter INPUT 5 4 
  [ meta load l4proto => reg 1 ]
  [ cmp eq reg 1 0x00000001 ]
  [ match name u32 rev 0 ]
  [ counter pkts 4 bytes 4096 ]
  [ immediate reg 0 drop ]

table ip filter { # handle 5
    chain INPUT { # handle 1
        type filter hook input priority 0; policy accept;
        meta l4proto udp ip frag-off & 8191 != 0 counter packets 0 bytes 0 drop # handle 4
        meta l4proto icmp # u32 ! "0x4&0x3fff=0x0" counter packets 4 bytes 4096 drop # handle 5
    }

    chain FORWARD { # handle 2
        type filter hook forward priority 0; policy accept;
    }

    chain OUTPUT { # handle 3
        type filter hook output priority 0; policy accept;
    }
}

규칙 핸들 #5 앞에 주석이 있다는 점에 유의하세요. u32작동하지 않아서가 아니라 기본에서 처리할 수 없기 때문입니다 nft. 바이트코드 덤프는 다른 곳에 저장된 실제 페이로드 검사를 표시하지 않지만 예상대로 실행되며 실제 조각이 수신되고 삭제됨에 따라 카운터가 증가합니다.

답변2

귀하의 로고 조합을 제안합니다(규칙 6기다리다)은 거의 항상 규칙 2, 에 의해 캡처됩니다 --state INVALID.

저는 공용 서버에서 매우 엄격한 규칙 세트를 실행하며, 사용자 정의 규칙이 fail2ban바로 위에 있습니다. (나는 몇 시간 동안 외출할 수 있는 스트라이크를 3번 수행했고, 3번의 아웃은 한 달 동안의 금지를 의미했습니다. 완전히 차단되는 것을 방지하기 위해 몇 가지 IP 주소 기반 예외가 있었습니다.)

rules.v4이것은 내 키트입니다(라이트 버전).

-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-A INPUT -m conntrack --ctstate INVALID -j DROP
...
# Exceptions to allow suitably authorised traffic
...
-A INPUT -j LOG --log-level info --log-prefix "firewall: REJECT "
-A INPUT -j REJECT

iptables --line-numbers -nvL INPUT월초 이후 일부 해당 패킷 수

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target            prot opt in     out     source               destination
1    97753   26M f2b-recidive      tcp  --  *      *       0.0.0.0/0            0.0.0.0/0
2    94046   26M f2b-XXXXXXXXXXXX  tcp  --  *      *       0.0.0.0/0            0.0.0.0/0
3    94046   26M f2b-XXXXXXXXXXXX  tcp  --  *      *       0.0.0.0/0            0.0.0.0/0
4    88576   26M f2b-sshd          tcp  --  *      *       0.0.0.0/0            0.0.0.0/0
5     902K  333M ACCEPT            all  --  lo     *       0.0.0.0/0            0.0.0.0/0
6    2463M 2399G ACCEPT            all  --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
7     1152 52453 DROP              all  --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate INVALID
...
19    417K   13M ACCEPT            icmp --  *      *       0.0.0.0/0            0.0.0.0/0            icmptype 8
20   56921 4276K LOG               all  --  *      *       0.0.0.0/0            0.0.0.0/0            LOG flags 0 level 6 prefix "firewall: REJECT "
21   56921 4276K REJECT            all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

보시다시피 잘못된 데이터가 포함된 패킷을 많이 받았지만 대부분은 단순한 TCP/IP 프로브였습니다. 이들 중 대부분은 fail2ban정상적으로 규칙을 실행합니다 .

관련 정보