8.7. 예제: nftables 스크립트를 사용하여 LAN 및 DMZ 보호


RHEL 라우터의 nftables 프레임워크를 사용하여 내부 LAN의 네트워크 클라이언트와 DMZ의 웹 서버를 인터넷 및 기타 네트워크에서 무단 액세스로부터 보호하는 방화벽 스크립트를 작성하고 설치합니다.

중요

이 예는 예시 목적으로만 사용되며 특정 요구 사항이 있는 시나리오를 설명합니다.

방화벽 스크립트는 네트워크 인프라 및 보안 요구 사항에 따라 크게 달라집니다. 사용자 환경에 대한 스크립트를 작성할 때 nftables 방화벽의 개념을 알아보려면 이 예제를 사용합니다.

8.7.1. 네트워크 조건

이 예제의 네트워크에는 다음 조건이 있습니다.

  • 라우터는 다음 네트워크에 연결되어 있습니다.

    • 인터페이스 enp1s0을 통한 인터넷
    • 내부 LAN through 인터페이스 enp7s0
    • enp8s0을 통한 DMZ
  • 라우터의 인터넷 인터페이스에는 정적 IPv4 주소(203.0.113.1)와 IPv6 주소(2001:db8:a::1)가 할당되어 있습니다.
  • 내부 LAN의 클라이언트는 10.0.0.0/24 범위의 개인 IPv4 주소만 사용합니다. 결과적으로 LAN에서 인터넷으로 전송되는 경우 소스 네트워크 주소 변환(SNAT)이 필요합니다.
  • 내부 LAN의 관리자는 IP 주소 10.0.0.10010.0.0.200 을 사용합니다.
  • DMZ는 198.51.100.0/242001:db8:b::/56 범위의 공용 IP 주소를 사용합니다.
  • DMZ의 웹 서버는 198.51.100.52001:db8:b::5 IP 주소를 사용합니다.
  • 라우터는 LAN 및 DMZ에 있는 호스트에 대한 캐싱 DNS 서버 역할을 합니다.

8.7.2. 방화벽 스크립트에 대한 보안 요구 사항

다음은 예제 네트워크의 nftables 방화벽에 대한 요구 사항입니다.

  • 라우터는 다음을 수행할 수 있어야 합니다.

    • DNS 쿼리를 반복적으로 확인합니다.
    • 루프백 인터페이스에서 모든 연결을 수행합니다.
  • 내부 LAN의 클라이언트는 다음을 수행할 수 있어야 합니다.

    • 라우터에서 실행 중인 캐싱 DNS 서버를 쿼리합니다.
    • DMZ의 HTTPS 서버에 액세스합니다.
    • 인터넷의 모든 HTTPS 서버에 액세스합니다.
  • 관리자는 SSH를 사용하여 라우터 및 DMZ의 모든 서버에 액세스할 수 있어야 합니다.
  • DMZ의 웹 서버는 다음을 수행할 수 있어야 합니다.

    • 라우터에서 실행 중인 캐싱 DNS 서버를 쿼리합니다.
    • 인터넷의 HTTPS 서버에 액세스하여 업데이트를 다운로드합니다.
  • 인터넷의 호스트는 다음을 수행할 수 있어야 합니다.

    • DMZ의 HTTPS 서버에 액세스합니다.
  • 또한 다음과 같은 보안 요구 사항이 있습니다.

    • 명시적으로 허용되지 않은 연결 시도는 삭제해야 합니다.
    • 삭제된 패킷이 기록되어야 합니다.

8.7.3. 삭제된 패킷의 로깅 구성

기본적으로 systemd 는 삭제된 패킷과 같은 커널 메시지를 저널에 기록합니다. 또한 이러한 항목을 별도의 파일에 기록하도록 rsyslog 서비스를 구성할 수 있습니다. 로그 파일이 무한대로 확장되지 않도록 하려면 순환 정책을 구성합니다.

사전 요구 사항

  • rsyslog 패키지가 설치되어 있어야 합니다.
  • rsyslog 서비스가 실행 중입니다.

절차

  1. 다음 콘텐츠를 사용하여 /etc/ECDHE.d/nftables.conf 파일을 만듭니다.

    :msg, startswith, "nft drop" -/var/log/nftables.log
    & stop

    이 구성을 사용하여 rsyslog 서비스는 /var/log/ECDHE 대신 /var/log/nftables.log 파일에 패킷을 로그했습니다.

  2. rsyslog 서비스를 다시 시작하십시오.

    # systemctl restart rsyslog
  3. 크기가 10MB를 초과하는 경우 /etc/logrotate.d/nftables.log를 교체하여 /var/log/nftables.log 를 순환하도록 /etc/logrotate.d/nftables 파일을 만듭니다.

    /var/log/nftables.log {
      size +10M
      maxage 30
      sharedscripts
      postrotate
        /usr/bin/systemctl kill -s HUP rsyslog.service >/dev/null 2>&1 || true
      endscript
    }

    maxage 30 설정은 다음 순환 작업 중에 30일이 지난 순환 로그를 제거하도록 정의합니다.

추가 리소스

  • rsyslog.conf(5)logrotate(8) 도움말 페이지

8.7.4. nftables 스크립트 작성 및 활성화

이 예는 RHEL 라우터에서 실행되며 내부 LAN 및 DMZ의 웹 서버에서 클라이언트를 보호하는 nftables 방화벽 스크립트입니다. 예제에 사용된 방화벽의 네트워크 및 요구 사항에 대한 자세한 내용은 방화벽 스크립트에 대한 네트워크 조건 및 보안 요구 사항을 참조하십시오.

주의

nftables 방화벽 스크립트는 데모 목적으로만 사용됩니다. 환경 및 보안 요구 사항에 맞게 조정하지 않고 사용하지 마십시오.

사전 요구 사항

절차

  1. 다음 콘텐츠를 사용하여 /etc/nftables/firewall.nft 스크립트를 만듭니다.

    # Remove all rules
    flush ruleset
    
    
    # Table for both IPv4 and IPv6 rules
    table inet nftables_svc {
    
      # Define variables for the interface name
      define INET_DEV = enp1s0
      define LAN_DEV  = enp7s0
      define DMZ_DEV  = enp8s0
    
    
      # Set with the IPv4 addresses of admin PCs
      set admin_pc_ipv4 {
        type ipv4_addr
        elements = { 10.0.0.100, 10.0.0.200 }
      }
    
    
      # Chain for incoming trafic. Default policy: drop
      chain INPUT {
        type filter hook input priority filter
        policy drop
    
        # Accept packets in established and related state, drop invalid packets
        ct state vmap { established:accept, related:accept, invalid:drop }
    
        # Accept incoming traffic on loopback interface
        iifname lo accept
    
        # Allow request from LAN and DMZ to local DNS server
        iifname { $LAN_DEV, $DMZ_DEV } meta l4proto { tcp, udp } th dport 53 accept
    
        # Allow admins PCs to access the router using SSH
        iifname $LAN_DEV ip saddr @admin_pc_ipv4 tcp dport 22 accept
    
        # Last action: Log blocked packets
        # (packets that were not accepted in previous rules in this chain)
        log prefix "nft drop IN : "
      }
    
    
      # Chain for outgoing traffic. Default policy: drop
      chain OUTPUT {
        type filter hook output priority filter
        policy drop
    
        # Accept packets in established and related state, drop invalid packets
        ct state vmap { established:accept, related:accept, invalid:drop }
    
        # Accept outgoing traffic on loopback interface
        oifname lo accept
    
        # Allow local DNS server to recursively resolve queries
        oifname $INET_DEV meta l4proto { tcp, udp } th dport 53 accept
    
        # Last action: Log blocked packets
        log prefix "nft drop OUT: "
      }
    
    
      # Chain for forwarding traffic. Default policy: drop
      chain FORWARD {
        type filter hook forward priority filter
        policy drop
    
        # Accept packets in established and related state, drop invalid packets
        ct state vmap { established:accept, related:accept, invalid:drop }
    
        # IPv4 access from LAN and internet to the HTTPS server in the DMZ
        iifname { $LAN_DEV, $INET_DEV } oifname $DMZ_DEV ip daddr 198.51.100.5 tcp dport 443 accept
    
        # IPv6 access from internet to the HTTPS server in the DMZ
        iifname $INET_DEV oifname $DMZ_DEV ip6 daddr 2001:db8:b::5 tcp dport 443 accept
    
        # Access from LAN and DMZ to HTTPS servers on the internet
        iifname { $LAN_DEV, $DMZ_DEV } oifname $INET_DEV tcp dport 443 accept
    
        # Last action: Log blocked packets
        log prefix "nft drop FWD: "
      }
    
    
      # Postrouting chain to handle SNAT
      chain postrouting {
        type nat hook postrouting priority srcnat; policy accept;
    
        # SNAT for IPv4 traffic from LAN to internet
        iifname $LAN_DEV oifname $INET_DEV snat ip to 203.0.113.1
      }
    }
  2. /etc/nftables/firewall.nft 스크립트를 /etc/sysconfig/nftables.conf 파일에 포함합니다.

    include "/etc/nftables/firewall.nft"
  3. IPv4 전달을 활성화합니다.

    # echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/95-IPv4-forwarding.conf
    # sysctl -p /etc/sysctl.d/95-IPv4-forwarding.conf
  4. nftables 서비스를 활성화하고 시작합니다.

    # systemctl enable --now nftables

검증

  1. 선택 사항: nftables 규칙 세트를 확인합니다.

    # nft list ruleset
    ...
  2. 방화벽에서 방지하는 액세스를 시도합니다. 예를 들어 DMZ에서 SSH를 사용하여 라우터에 액세스하십시오.

    # ssh router.example.com
    ssh: connect to host router.example.com port 22: Network is unreachable
  3. 로깅 설정에 따라 검색합니다.

    • 차단된 패킷의 systemd 저널:

      # journalctl -k -g "nft drop"
      Oct 14 17:27:18 router kernel: nft drop IN : IN=enp8s0 OUT= MAC=... SRC=198.51.100.5 DST=198.51.100.1 ... PROTO=TCP SPT=40464 DPT=22 ... SYN ...
    • 차단된 패킷의 /var/log/nftables.log 파일:

      Oct 14 17:27:18 router kernel: nft drop IN : IN=enp8s0 OUT= MAC=... SRC=198.51.100.5 DST=198.51.100.1 ... PROTO=TCP SPT=40464 DPT=22 ... SYN ...
Red Hat logoGithubRedditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

© 2024 Red Hat, Inc.