저는 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