경험이 있으시다면 Linux에서 방화벽 규칙을 원격으로 안전하게 적용하는 방법을 알려주실 수 있습니까 NFT
?
특히 데비안에서는 iptables-apply
규칙에 문제가 있을 경우 원격 방화벽 규칙을 안전하게 적용하여 자신을 잠그는 것을 방지하기 위해 오랫동안 이를 사용해 왔습니다(8). 현재 최신 데비안 릴리스에는 가 포함되어 있으며 공식 권장 사항은 새 도구 사용을 시작하는 것 nftables
입니다 . 이전 스타일 규칙을 즉석에서 변환하는 래퍼가 있다는 것을 알고 있지만 이전 스타일과 새 스타일을 혼합하지 말라고 모든 곳에서 제안했기 때문에 마침내 모든 규칙을 새로운( 일종의) 스타일로 전환하기로 결정했지만 여전히 그렇습니다. 인간이고 잘못된 규칙으로 원격 서버를 너무 빨리 잠그지 않을 것입니다. 를 사용하는 것 외에는 동일한 작업을 수행하는 프로그램이 있습니까 ?iptables
nft
iptables
pf
iptables-apply
nft
어떤 이유에서인지 Google과 Bing 모두 이 사실을 비밀로 유지하고 있으므로 누구든지 저에게 진실에 대한 길을 알려주시면 감사하겠습니다.
PS 반달전에 슈퍼유저에게 같은 질문을 올렸는데 아무도 해결책을 못찾아서 교차게시해서 죄송합니다만 반달동안 리소스를 기다리니 여기에 질문할 시간이 충분하네요.. .. ..
답변1
iptables-apply는 nft와 호환되도록 편집할 수 있는 매우 기본적인 bash 스크립트입니다. 그렇다면 어딘가에 게시해 주시면 좋을 것 같습니다.
답변2
nftables에 대한 iptables-apply의 무료 적용은 다음과 같습니다.
#!/usr/bin/env bash
#
# This program is free software: you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation, either version 3 of the License, or (at your
# option) any later version. Please see LICENSE.txt at the top level of
# the source code distribution for details.
#
# @package nftables-apply
# @author <[email protected]>
# @link https://github.com/fbouynot/scripts/blob/main/nftables-apply
# @copyright <[email protected]>
#
# Free adaptation for nftables of iptables-apply (https://github.com/wertarbyte/iptables/blob/master/iptables-apply)
#
# -e: When a command fails, bash exits instead of continuing with the rest of the script
# -u: This will make the script fail, when accessing an unset variable
# -o pipefail: This will ensure that a pipeline command is treated as failed, even if one command in the pipeline fails
set -euo pipefail
# Replace the Internal Field Separator ' \n\t' by '\n\t' so you can loop through names with spaces
IFS=$'\n\t'
# Enable debug mode by running your script as TRACE=1 ./script.sh instead of ./script.sh
if [[ "${TRACE-0}" == "1" ]]
then
set -o xtrace
fi
# Define constants
PROGNAME="${0##*/}"
VERSION='1.2.4'
RED="$(tput setaf 1)"
NC="$(tput sgr0)" # No Color
DEFAULT_TIMEOUT=15
DEFAULT_DESTINATION_FILE='/etc/nftables.conf'
DEFAULT_SOURCE_FILE='/etc/nftables-candidate.conf'
readonly PROGNAME VERSION RED NC DEFAULT_TIMEOUT DEFAULT_DESTINATION_FILE DEFAULT_SOURCE_FILE
help() {
cat << EOF
Usage: ${PROGNAME} [-Vh] [ { -s | --source-file } <source-file> ] [ { -d | --destination-file } <destination-file> ] [ { -t | --timeout } <timeout> ]
-h --help Print this message.
-V --version Print the version.
-s --source-file STRING The source file for candidate config. (default: ${DEFAULT_SOURCE_FILE})
-d --destination-file STRING The destination file where to write the config. (default: ${DEFAULT_DESTINATION_FILE})
-t --timeout INT The time to wait before rolling back. (default: ${DEFAULT_TIMEOUT})
EOF
exit 2
}
version() {
cat << EOF
${PROGNAME} version ${VERSION} under GPLv3 licence.
EOF
exit 2
}
# Deal with arguments
while [[ $# -gt 1 ]]
do
key="${1}"
case $key in
-h|--help)
help
;;
-s|--source-file)
export source_file="${2}"
shift # consume -s
;;
-d|--destination-file)
export destination_file="${2}"
shift # consume -d
;;
-t|--timeout)
export timeout="${2}"
shift # consume -t
;;
-V|--version)
version
;;
*)
;;
esac
shift # consume $1
done
# Set defaults if no options specified
source_file="${source_file:-$DEFAULT_SOURCE_FILE}"
destination_file="${destination_file:-$DEFAULT_DESTINATION_FILE}"
timeout="${timeout:-$DEFAULT_TIMEOUT}"
# Change directory to base script directory
cd "$(dirname "${0}")"
# Check root permissions
check_root() {
# Check the command is run as root
if [ "${EUID}" -ne 0 ]
then
echo -e "${RED}E:${NC} please run as root" >&2
exit 3
fi
return 0
}
restore() {
nft flush ruleset
nft -f /tmp/nftables.conf.bak
rm -f /tmp/nftables.conf.bak
# Start fail2ban
if systemctl is-enabled fail2ban > /dev/null 2>&1
then
systemctl start fail2ban 2>/dev/null
fi
return 0
}
save() {
cp "${source_file}" "${destination_file}"
echo -e "\nConfiguration changed"
return 0
}
# Main function
main() {
# Check the command is run as root
check_root
# Check if we can read the destination file
if [[ ! -r "${destination_file}" ]]
then
echo -e "${RED}E:${NC} cannot read ${destination_file}" >&2
exit 4
fi
# Backup current ruleset
nft list ruleset > /tmp/nftables.conf.bak
# Check if we can read the source file
if [[ ! -r "${source_file}" ]]
then
echo -e "${RED}E:${NC} cannot read ${source_file}" >&2
exit 5
fi
# Dry run new ruleset, exit if failures
nft -f "${source_file}" || (echo -e "${RED}E:${NC} Invalid rules, exiting" >&2 && exit 6)
# Check the candidate configuration starts by flushing ruleset
if [[ $(head -n 1 /etc/nftables-candidate.conf) != "flush ruleset" ]]
then
sed -i '1s/^/flush ruleset\n/' "${source_file}"
fi
# Stop fail2ban
if systemctl is-active fail2ban > /dev/null 2>&1
then
systemctl stop fail2ban 2>/dev/null
fi
# Apply new ruleset, rollback if timeout
timeout "${timeout}"s nft -f "${source_file}" || (echo -e "${RED}E:${NC} timeout while applying new configuration, rolling back to the previous ruleset" >&2 && restore && exit 7)
# Ask the user if they can open a new connection
# If they can't, rollback
# If they can, save
echo -n "Can you establish NEW connections to the machine? (y/N) "
read -r -n1 -t "${timeout}" answer 2>&1 || :
if [[ "${answer}" == "y" ]]
then
save
else
echo -e "\n${RED}E:${NC} rolling back to the previous ruleset" >&2
restore
exit 8
fi
rm -f /tmp/nftables.conf.bak
# Start fail2ban
if systemctl is-enabled fail2ban > /dev/null 2>&1
then
systemctl start fail2ban 2>/dev/null
fi
exit 0
}
main "$@"