NFT를 사용하여 보안 규칙을 원격으로 적용

NFT를 사용하여 보안 규칙을 원격으로 적용

경험이 있으시다면 Linux에서 방화벽 규칙을 원격으로 안전하게 적용하는 방법을 알려주실 수 있습니까 NFT?

특히 데비안에서는 iptables-apply규칙에 문제가 있을 경우 원격 방화벽 규칙을 안전하게 적용하여 자신을 잠그는 것을 방지하기 위해 오랫동안 이를 사용해 왔습니다(8). 현재 최신 데비안 릴리스에는 가 포함되어 있으며 공식 권장 사항은 새 도구 사용을 시작하는 것 nftables입니다 . 이전 스타일 규칙을 즉석에서 변환하는 래퍼가 있다는 것을 알고 있지만 이전 스타일과 새 스타일을 혼합하지 말라고 모든 곳에서 제안했기 때문에 마침내 모든 규칙을 새로운( 일종의) 스타일로 전환하기로 결정했지만 여전히 그렇습니다. 인간이고 잘못된 규칙으로 원격 서버를 너무 빨리 잠그지 않을 것입니다. 를 사용하는 것 외에는 동일한 작업을 수행하는 프로그램이 있습니까 ?iptablesnftiptablespfiptables-applynft

어떤 이유에서인지 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 "$@"

글머리기호 링크

관련 정보