특정 IP 주소에 대한 액세스를 차단하기 위해 Linux 브리지에서 nft를 사용하는 방법은 무엇입니까?

특정 IP 주소에 대한 액세스를 차단하기 위해 Linux 브리지에서 nft를 사용하는 방법은 무엇입니까?

브리지가 정의된 Ubuntu 상자가 있습니다 br0. 브리지는 eth0인터넷 서비스에 연결되어 있으며 eth1PC의 네트워크 포트에 연결되어 있습니다. 다리는 예상대로 작동하고 있으며 eth0과 사이의 모든 트래픽을 전달합니다 eth1.

PC에서 특정 외부 IP 주소(예: 1.1.1.1)에 대한 액세스를 차단하는 규칙을 넣고 싶습니다. 나는 nft이것을하는 방법이라고 생각합니다. br01.1.1.1로/에서 아무 것도 통과할 수 없도록 규칙을 어떻게 작성합니까 ?

여기서의 목적은 테스트를 위해 특정 실패를 시뮬레이션할 수 있는 것입니다.

답변1

이는 다음을 사용하여 수행됩니다.nftables'브리지 패밀리.

nftables브리지 제품군을 대체품으로 제공합니다.ebtables.

에서 테이블을 생성합니다.다리가족:

# nft add table bridge t

전달된 프레임을 필터링하는 체인을 만듭니다.

# nft add chain bridge t c '{ type filter hook forward priority 0; policy accept; }'

IP 패킷을 방지하는 규칙을 만듭니다.eth11.1.1.1에 도달하려면:

# nft add rule bridge t c iif eth1 ether type ip ip daddr 1.1.1.1 drop

이것이 바로 Stateless 방화벽의 전부입니다.


부터리눅스 커널 5.3 nftables또한 직접 상태 저장 방화벽을 지원합니다.다리길:

브리지에 대한 기본 연결 추적 지원을 추가합니다. 이 패치 세트 이전에는 사람들이 상태 기반 필터링을 수행할 수 있는 유일한 기회는 에뮬레이션 레이어를 사용하는 것이었습니다 br_netfilter. 이는 더 이상 사용되지 않는 단계입니다 [...]

이를 통해 시스템을 단일 방향으로 쉽게 분리할 수 있습니다. 예를 들어 다음을 허용합니다.

  • SSH를 통해 PC에 대한 수신 액세스
  • PC에서 나가는 액세스: 사용할 PC및 DNS( th아래는 둘 다를 나타냄)TCP그리고UDP)
  • ARP(IPv4 연결이 없으면)
  • 필요한 모든 것응답 트래픽(성능상의 이유로 첫 번째 규칙)
  • 그리고 아무것도

다음을 사용할 수 있습니다.

# nft add rule bridge t c ct state related,established accept
# nft add rule bridge t c oif eth1 ether type ip tcp dport 22 accept
# nft add rule bridge t c iif eth1 ether type ip meta l4proto {tcp, udp} th dport 53 accept
# nft add rule bridge t c iif eth1 ether type ip icmp type echo-request accept
# nft add rule bridge t c ether type arp accept
# nft add rule bridge t c drop

일부 인수분해는 확실히 가능하며 고려되어야 합니다(예: 집합과연결).


위의 모든 예는 양쪽에서 계속 접근할 수 있는 Ubuntu 상자 자체에는 영향을 미치지 않습니다. PC에서 Ubuntu 상자로의 트래픽(또는 Ubuntu 상자에서 PC로의 트래픽)에 영향을 미치기 위해 동일한 종류의 규칙을 다음과 같은 체인 연결에서 수행할 수 있습니다.입력(관련.산출) 대신에앞으로.


메모:

그만큼br_netfilternet.bridge.bridge-nf-call-iptables = 1네이티브 간의 예기치 않은 상호 작용을 방지하려면 모듈을 로드하면 안 됩니다(기본적으로 sysctl 속성을 활성화함 ).다리규칙과아이피영향을 미치는 가족 규칙nftables마찬가지로iptables. 그 의미는동일한 시스템에서 Docker 또는 Kubernetes(2명의 일반 사용자 br_netfilter)를 실행하는 것은 피해야 합니다.네트워크 실험을 수행할 때(그러나 추가적인 주의를 기울이면 여전히 가능합니다. 예: 적응이 UL SE Q/A).

br_netfilter(및)을 로드 하면 net.bridge.bridge-nf-call-iptables = 1일반적인 작업 방식이아이피의 가족필터/앞으로훅. 그건 일반적인 경우가 아니고,nftables이를 활용하는 추가 기능이 부족합니다.iptables'physdev일치 모듈: 대신 목표는 항상 이 작업을 기본적으로다리가족과 의지하지 않습니다 br_netfilter.

답변2

Linux 호스트가 라우터로 실행 중인 경우 ip_forwarding도 구성해야 합니다.

귀하의 질문에 답하려면 다음과 같이 nftables를 사용할 수 있습니다.

#!/usr/bin/nft 

flush ruleset

table inet my_table {
   chain INPUT {
      iifname br0 saddr 1.1.1.1 drop
      iifname br0 daddr 1.1.1.1 drop
   }

chain FORWARD {
      iifname br0 saddr 1.1.1.1 drop
      iifname br0 daddr 1.1.1.1 drop
   } 

}

nft -f /path/to/your/nft.file로 이것을 실행하십시오.

하지만 이것은 약간 쓸모가 없습니다. (나는 당신이 nftables를 배우고 있다는 것을 알고 있습니다. 이것을 너무 가혹하게 받아들이지 마십시오). 가장 좋은 방법은 모든 것을 삭제하고 필요한 것만 허용하여 특정 트래픽을 삭제하지 않고 특정 트래픽을 허용하는 것입니다.

저는 Red Hat 8 문서가 nftables에 매우 적합하다는 것을 알았습니다. 아마 여러분도 저처럼 이 문서에서 많은 것을 배울 수 있을 것입니다.

rhel 8 nftables 문서

관련 정보