nftables 규칙 유지에 대한 모범 사례

nftables 규칙 유지에 대한 모범 사례

저는 iptables를 사용하는 CentOS7 호스팅에서 Ubuntu를 처음 접했고 apf와 bfd가 iptable을 처리(숨기기)하는 방법에 익숙했고 잘 작동했습니다.

그래서 저는 Ubuntu(20.04 LSR)로 옮겼으며 침입 시도를 자동 금지하는 방화벽을 수행하는 "우분투 방식"은 nftables 및 failure2ban인 것으로 보입니다.

iRedMail을 사용하여 기본 nginx, postfix, dovecot, clamav, roundcube 등 기반 메일 서버를 설정했으며 메일 서비스 및 ssh 등을 해킹하려는 시도에 대한 로그를 감시하도록 실패2ban을 구성했습니다. 내 메일 로그를 올바르게 구문 분석하고 fial2ban 차단된 IP를 inet f2b-table 테이블에 저장합니다.

이것은 재부팅 후에도 제대로 유지되지만 /etc/nftables.conf 파일에 어떤 failure2ban 테이블도 없다는 것을 알았습니다. 기본 방화벽이 있어서 정적으로 업데이트하여 원하는 TCP 포트를 모두 거부한 다음 차단을 해제할 수 있습니다(기본적으로) 메일, 웹 서버, SSH)

하지만 내가 볼 수 있는 한, failure2ban 규칙은 구성 파일에 없지만 iRedMail에서 설정한 mysql 데이터베이스의 failure2ban 테이블 항목에서 부팅 시 재구성되는 것 같습니다.

괜찮습니다..하지만 여기에 딜레마가 있습니다. 기존의 Fail2ban 테이블을 활용하여 방화벽에 규칙을 수동으로 추가하면 할 수 있습니다..

nft add element inet f2b-table addr-set-postfix-pregreet { spammer.ip.addr.here }

표시되고 작동합니다.. 성공적으로 잠긴 후 로컬 콘솔을 통해 제거하여 테스트했습니다..

재부팅할 때를 제외하면 전체 테이블이 손실되고 테이블 항목에서 fall2ban에 의해 다시 작성됩니다(다시 말하지만 그래도 괜찮습니다).

그래서 저는 새로운 테이블/물건을 추가했습니다.

table inet spammers {
    set blackhole {
            type ipv4_addr
            elements = { sample.ip.addr.here }
    }

    chain spammers-chain {
            type filter hook input priority filter - 2; policy accept;
            ip saddr @blackhole drop
    }
 }

다시 한 번 테스트해 보니 잘 작동하지만 이를 유지하려면 /etc/nftables.conf에 쓰거나 규칙 등을 읽을 수 있도록 해당 디렉토리를 설정해야 합니다.

nftables.conf에 임의의 규칙 디렉터리에 포함을 추가한 다음 주소를 추가할 때마다 여기에 테이블을 저장하면 이 작업을 수행할 수 있지만 이는 보기 흉하고 잘못된 것 같습니다.

마치 내 목록에 새로운 스패머를 추가하고 싶은 것처럼 할 수 있습니다.

nft add element inet spammers blackhole { new.ip.addr.here }

하지만 그래야 할텐데 .. 모르겠어요? 내 파일에 테이블을 유지하시겠습니까?

nft list table inet spammers > /etc/nftables.d/spammers.conf

그래서 그것이 제가 할 수 있는 한 가지 방법이지만 다른 사람들이 netfilter-persist에 대해 이야기하는 것을 보았지만 그것은 Ubuntu의 일부가 아니므로 나가기 전에 내 자신의 바퀴를 발명하거나 netfilter-persist 토끼 구멍 아래로 내려가거나 (고마워요) Fail2ban이 한 것처럼 보이는 것과 유사한 작업을 수행합니다... (금지된 IP를 데이터베이스에 저장하고 로그인 시 목록을 재구성)

이 작업을 수행할 수 있는 여러 가지 방법을 생각해 낼 수 있습니다. 하지만 여기서 누락된 "모범 사례" "우분투 방식"이 있는지 궁금합니다...

업데이트/편집: 더 나은 제안을 얻지 않는 한 현재 내 "솔루션"은 다음과 같습니다.

mkdir /etc/nftables.d/
nft list table inet spammers > /etc/nftables.d/spammers.conf

그런 다음 /etc/nftables.conf를 편집하여 맨 아래에 이 줄을 추가했습니다.

include "/etc/nftables.d/*.conf"

이제 테이블에 블록을 추가하는 단계는 2단계입니다.

nft add element inet spammers blackhole { some.evildoer.ip.address }
nft list table inet spammers > /etc/nftables.d/spammers.conf

가장 예쁘지는 않지만 확실히 작동합니다. 물론 이 모든 것을 내 사용자 정의 스크립트로 래핑하여 다음과 같이 호출할 수 있습니다.

banspammer "badguy.ip.addr.here"

banspammer는 지정된 주소 요소를 추가하고 업데이트된 테이블 정의를 저장합니다.

다시 말하지만 이것은 "모범 사례가 아닌 것"처럼 느껴지므로 제 질문입니다.

편집: 2021-12-22 좋아요 그래서 혼잣말을 하는 것 같지만 피드백을 받지 못했기 때문에 제 아이디어로 진행했습니다. 효과가 있었고 이 작은 금지 스패머 스크립트를 작성했습니다... 원시적이고 아마도 매우 위험할 것입니다. - 구성 파일 경로가 유효한지 확인하는 등의 온전성 검사를 수행하지 않았으며 해당 파일을 백업하지 않았습니다.

테이블 항목은 ipv4_addr nftables 유형이므로 유효성 검사를 수행하므로 이에 대해 크게 걱정하지 않습니다.

내 특정 설정에는 이미 inet 제품군에 filter라는 파일러가 있다는 점을 참고하세요. 특히 이것을 약간 낮은 우선 순위 목록으로 추가했습니다. 또한 /etc/nftables.d 디렉터리를 만들고 코드에 추가하여 config 디렉터리를 다음과 같이 구문 분석하도록 했습니다. 위에서 언급한

누군가가 이것이 유용하다고 생각하기를 바랍니다.

그런 것이 있다면 나는 여전히 "우분투 방식"에 관심이 있을 것입니다.

#!/usr/bin/sh

################################################################################
# banspammer                         2021-12-22                 DigitalSorceress
#  
# SUMMARY
# This script adds an ip or range of Ips (see element adding) to nftables
# specifically to my spammer blackhole
# it also persists it out to /etc/nftables.d/spammers.conf
#
# put this somewhere like /root/tandautils
# then go to /user/local/sbin and ln -s /root/tandautils/banspammer.sh banspammer
#
################################################################################

# Handle command line args
COMMAND=$1
ADDRESS=$2


# the location of the ssh daemon config file
# default for CentOS is CONFIG_FILE=/etc/ssh/sshd_config
#
CONFIG_FILE=/etc/nftables.d/spammers.conf



# Here are the subroutines for individual actions
ban_spammer () {
    # Issue the basic command to ban the spammer 
    echo "adding spammer to blackhole ..."
    
    nft add element inet spammers blackhole { ${ADDRESS} }
    BAN_SPAMMER_RESULT=$?
    if [ $BAN_SPAMMER_RESULT -eq 0 ] 
    then
        echo "  DONE: ${ADDRESS} added to spammer table"
    fi
    echo ""
}

unban_spammer () {
    # Issue the basic command to ban the spammer 
    echo "removing spammer from blackhole ..."
    
    nft delete element inet spammers blackhole { ${ADDRESS} }

    UNBAN_SPAMMER_RESULT=$?
    if [ $UNBAN_SPAMMER_RESULT -eq 0 ] 
    then
        echo "  DONE: ${ADDRESS} removed from table"
    fi
    echo ""
}

persist_spamtable () {
    echo "persisting out spamtable to ${CONFIG_FILE}..."
    # we need to persist out the spam table to the config
    nft list table inet spammers > ${CONFIG_FILE}
    if [ $? -eq 0 ]
    then
      echo "  done.. showing table..."
      echo ""
      nft list table inet spammers
    else
      echo "error persisting table.. "
    fi
    echo ""
}

list_spamtable () {
    echo "listing out spamtable"
    echo ""
    nft list table inet spammers
    echo ""
}

kill_spamtable () {
    echo "resetting /creating blank spamtable ${CONFIG_FILE}..."

    #rm -f /etc/nftables.d/spammers.conf
    tee /etc/nftables.d/spammers.conf <<EOF
table inet spammers {
    set blackhole {
        type ipv4_addr
    }

    chain spammers-chain {
        type filter hook input priority filter - 2; policy accept;
        ip saddr @blackhole drop
    }
}
EOF
    echo ""
    if [ $? -eq 0 ]
    then
        echo "success.. here's the new file:"
        echo ""
        cat /etc/hftables.d/spammers.conf
    else
        echo "error writing file... "
    fi
    
    echo ""
}

help_me () {
  echo "This is a tool to simplify blocking of IP addesses of spammers                  "
  echo "                                                                                "
  echo "banspammer                          2021-12-22                  DigitalSorceress" 
  echo "                                                                                "
  echo "SUMMARY                                                                         "
  echo " This script is used to simplify the act of adding/removing spammers from       "
  echo " a spammers table in the nftables ruleset                                       "
  echo "                                                                                "
  echo "                                                                                "
  echo "usage: $0 banspammer command [address]                                          "
  echo "                                                                                "
  echo " command options:                                                               "
  echo "           ban address                                                          "
  echo "             bans the target address; can be a singe IP or comma sep list       "
  echo "                                                                                "
  echo "           unban address                                                        "
  echo "             removes the target address can be a singe IP or comma sep list     "
  echo "                                                                                "
  echo "           reset                                                                "
  echo "             clears all entries from the spammers table                         "
  echo "             note this can be used to create a new empty table                  "
  echo "                                                                                "
  echo "           show                                                                 "
  echo "             shows the current spam table list                                  "
  echo "                                                                                "
  echo "           help                                                                 "
  echo "             Displays this help dialog                                          "
}



# Here is where we do the actual work based on the passed command
case "$COMMAND" in
  ban)
    if [ $# -eq 2 ] 
    then
        echo "banning address: ${ADDRESS}"
        ban_spammer ${ADDRESS}
      if [ $BAN_SPAMMER_RESULT -eq 0 ]
      then
        persist_spamtable
      fi
    else
        echo "ban command requires a single IP or comma separated list of IPs "
    fi
    ;;
  unban)
    if [ $# -eq 2 ] 
    then
      echo "unbanning address: ${ADDRESS}"
      unban_spammer ${ADDRESS}
      if [ $UNBAN_SPAMMER_RESULT -eq 0 ]
      then
        persist_spamtable
      fi
    fi
    ;;
  show)
      list_spamtable
      ;;
  reset)
      kill_spamtable
      ;;
  help)
    help_me
    ;;
  *)
      echo "Usage: $0 ban|unban comma-separated-ip-list  or $0 show|reset"
      exit 1
esac

답변1

당신이 넷필터 규칙을 유지하기 위해 찾고 있었던 것으로 보이는 것이 무엇인지 apt-get install iptables-persistent선택하시겠습니까 ?netfilter-persistent

관련 정보