전달이 비활성화된 경우에도 Linux가 다른 인터페이스 IP에 대한 연결을 허용하는 이유는 무엇입니까?

전달이 비활성화된 경우에도 Linux가 다른 인터페이스 IP에 대한 연결을 허용하는 이유는 무엇입니까?

시스템에는 두 개의 인터페이스가 1.1.1.1있습니다 1.1.2.1. sysctl은 net.ipv4.ip_forward비활성화되거나 활성화되지만 iptables -P FORWARD DROP설정됩니다.

이제 1.1.1.1기본 경로로 설정된 다른 컴퓨터에서 ping을 실행하고 인터페이스 IP 1.1.1.2에 연결할 수 있습니다 . 1.1.2.1가장 우아한 방법으로 이런 일이 발생하는 것을 어떻게 쉽게 방지할 수 있습니까?

해결책

저는 지금 이 놀라운 라이너를 사용하고 있습니다. @AB에게 감사드립니다.

nft add rule inet filter input fib daddr . iif type != { local, broadcast, multicast } drop

설명하다:

nft추정되는 후속 제품인 nftables를 나타냅니다.iptables

inputinet filter는 기본적으로 생성되는 테이블의 체인입니다 ( nft list table inet filter명령을 사용하여 쿼리할 수 있음). 그러나 사용자 정의 nft 설정이 있는 경우 그에 따라 변경해야 합니다. inet유형 분류자는 ip4 및 ip6 프로토콜 모두에서 작동함을 의미합니다.

fib daddr . iif type기본적으로 입력 인터페이스의 type대상 주소에 무엇이 있는지 묻는 전달 정보 베이스에 대한 쿼리입니다.daddriif

local주소가 인터페이스 도 아니고 패킷이 나오는 인터페이스도 broadcast아니라면 인터페이스입니다.multicastdrop

@AB는 또한 DNAT 규칙에 따라 패킷을 차단하는 방법(또는 차단하지 않는 방법)에 대해 몇 가지 사항을 제시했습니다. 자세한 내용은 그의 답변을 확인하세요.

답변1

1.1.2.1은 동일한 시스템에 속하는 다른 IP 주소이므로 전달이 필요하지 않습니다. 시스템은 패킷을 수신하고 제3자에게 라우팅되지 않고 로컬로 전달되는 수신 패킷으로 자체적으로 처리합니다. 이는 IP가 인터페이스에 속하기보다는 풀의 일부로 간주되어야 한다는 Linux의 일반적인 생각과 일치합니다.

다음을 사용하여 패킷이 수락되는 것을 방지하려면iptables, 당신은 안에 있어야합니다입력하다대신에 체인앞으로체인. 관련된 두 네트워크가 /24인 경우 다음과 같습니다.

iptables -I INPUT -s 1.1.1.0/24 -d 1.1.2.0/24 -j DROP

이는 경우에 따라 시스템이 자체적으로 연결되는 것을 방지하기 때문에(이 예에서는 규칙에서 인터페이스 이름을 사용하지 않기 때문에) 최소한 다음 규칙을 시스템 앞에 추가해야 할 것입니다.

iptables -I INPUT -i lo -j ACCEPT

인터페이스 이름을 지정하면 일부 특수한 경우에 규칙과 보안을 구성하는 데 도움이 되는 경우가 있습니다.역방향 경로 필터링대부분의 배포판에서 기본적으로 활성화됩니다).

업데이트: 물론 OP에서 언급했듯이 -s 1.1.1.0/24 -d ! 1.1.1.0/24모든 LAN이 동일하게 "격리"되어야 하는 경우 LAN^2 규칙 대신 LAN당 하나의 규칙만 사용하여 이 예제 규칙을 더 잘 작성할 수 있습니다.


고쳐 쓰다: 추가 요청이 있을 경우 다음을 사용하는 보다 우아한 접근 방식이 있습니다.nftables거짓말하다(정보 기반 전달) 표현식(맨 페이지에 예제로 문서화되어 있음): 이를 수신하는 인터페이스에 비로컬(브로드캐스트도 멀티캐스트도 아님) 대상 주소를 삭제합니다. 이 표현식은 명시적인 IP 선언(또는 인터페이스)을 요구하지 않으므로 다음을 사용하여 IPv4 및 IPv6 모두에서도 작동합니다.인트라넷집 주소대신에 테이블아이피주소 패밀리 테이블.

# nft add table inet filter
# nft add chain inet filter prerouting '{ type filter hook prerouting priority -150; policy accept; }
# nft add rule inet filter prerouting fib daddr . iif type != { local, broadcast, multicast } counter drop

이것만으로도 많은 수의 LAN/인터페이스를 처리할 수 있습니다(게임을 하지 않고 동일한 인터페이스에 여러 LAN을 배치하는 한, 이는 여러 LAN 간의 위 규칙을 위반할 수 있습니다). counter예를 들어 조회수를 보려면 선택 사항입니다 nft list ruleset.

그러나 이 규칙은 DNAT가 다른현지의DNAT 이전에 발생하는 다른 인터페이스에 정의된 IP(사용iptables우선순위 NF_IP_PRI_NAT_DST(=-100))로 등록하지만 라우팅/전달(OP가 활성화하도록 선택한 경우) 또는 DNAT 전달을 모두 차단합니다. 로컬이 아닌 것으로 삭제되거나(일반 전달의 경우) 반환 패킷이 삭제됩니다. 이 규칙은 다음과 같습니다. "역방향 DNAT"가 발생하기 전에 만나서 제거됩니다. 추가된 경우후크 입력대신 반대가 발생합니다. 다른 IP로의 로컬 DNAT는 허용되지 않지만 라우팅/전달 DNAT는 통과하므로 작동할 수 있습니다.앞으로대신 후크입력하다. 다른 드문 경우에 대한 예외를 추가하는 것이 더 유용할 것입니다. 따라서 위의 방법 대신 이것을 사용해야 합니다.

# nft add table inet filter
# nft add chain inet filter input '{ type filter hook input priority 0; policy accept; }
# nft add rule inet filter input fib daddr . iif type != { local, broadcast, multicast } counter drop

반품iptables그리고nftables평화롭게 공존할 수 있습니다.둘 중 하나만 등록해야 하며, 둘 다 등록할 수는 없습니다.) 그래서 이것들은nftables선은 기존의 선을 따를 수 있습니다.iptables규칙.

nft list ruleset위의 규칙은 시작 시 초기화되지 않고 스크립트 형식(주로 출력)으로 작성될 수 있습니다 . 예를 들면 다음과 같습니다.

#!/usr/sbin/nft -f

flush ruleset

table inet filter {
    chain input {
        type filter hook input priority 0; policy accept;
        fib daddr . iif type != { local, broadcast, multicast } counter drop
    }
}

까다롭기 때문에 확인해야 할 유일한 것은 최신 제품을 사용할 때입니다.nftables API를 통한 iptables, Debian Buster의 기본값과 같은 것도 flush ruleset새로 고쳐집니다 .iptables규칙은 실제로 사용하기 때문에nftables, 이제 오류 없이 존재하지 않는 체인을 "초기" 새로 고칠 수 없기 때문입니다. 따라서 이 스크립트는 다른 작업보다 먼저 실행되어야 합니다.iptables이런 경우 스크립트를 작성하세요.


또한 1.1.1.0/24 네트워크의 클라이언트는 1.1.2.1에 연결할 수 없지만 여전히 ARP를 사용하여 그 존재를 추론할 수 있습니다. 그것은 다음과 같습니다:

arping -I eth0 1.1.2.1

1.1.2.1이 다른 네트워크의 다른 인터페이스에 "속해" 있더라도(다른 MAC 주소 사용) 1.1.1.0/24 네트워크의 시스템 인터페이스를 통해 1.1.2.1로부터 응답을 받습니다.

이는 Linux가 기본적으로 좋든 나쁘든 모든 IP에 대한 인터페이스에서 수신된 ARP 요청에 응답하기 때문입니다. 이번에는 자세한 설명이 있습니다.arp_filter.

이를 방지하려면 다음 중 하나를 혼합하십시오.arp_filter+ip rule또는arp_공지+arp_ignore, 또는 사용arptables(또는nftables그리고ARP제품군)을 사용하여 ARP 요청을 필터링합니다(어쨌든 이전 설정 중 하나가 필요할 수 있음).

관련 정보