nftables 대상 nat는 포트에 대한 로컬 액세스를 차단합니다.

nftables 대상 nat는 포트에 대한 로컬 액세스를 차단합니다.

내 서버에 nftables가 설정되어 있고 일부 보호된 포트(예: 80)로 들어오는 모든 트래픽을 루트 권한 없이 사용할 수 있는 더 높은 포트(예: 13080)로 리디렉션하고 싶습니다. 원격으로 80개에만 액세스할 수 있지만 로컬에서는 두 포트 모두에 액세스할 수 있기를 원합니다. 제가 생각해낸 설정은 다음과 같습니다.

#!/usr/bin/nft -f

flush ruleset

table inet firewall {

    chain inbound {
        type filter hook input priority filter; policy drop;

        ct status dnat counter accept # accept everything that came through destination nat (port 80)

        iifname lo counter accept
        oifname lo counter accept

        ct state { established, related } counter accept
        ct state invalid counter drop

        tcp dport 22 ct state new counter accept

        counter reject with icmpx type port-unreachable # reject everything else
    }

    chain destination-nat {
        type nat hook prerouting priority dstnat; policy accept
        tcp dport 80 counter redirect to 13080 # redirect 80 to 13080
    }

    chain forward {
        type filter hook forward priority 0; policy drop;
    }

    chain outbound {
        type filter hook output priority 0; policy accept;
    }
}

그러나 어떤 이유로 인해 포트 80에 대한 로컬 액세스가 차단됩니다(13080은 여전히 ​​액세스 가능하지만). 누군가 내가 뭘 잘못하고 있는지 말해 줄 수 있나요?

답변1

여기에 예가 있습니다.일반 네트워크의 Netfilter 및 패킷 흐름유효기간은nftables:

일반 네트워크의 Netfilter 및 패킷 흐름

중요한 세부 사항이 내부에 기록되어 있습니다.* "새" 연결에 대해서만 "nat" 표를 참조하세요..

로컬로 시작된 연결의 경우 새 연결의 첫 번째 패킷은 출력 중에 새로운 conntrack 상태를 생성합니다(출력의 conntrack 상자). 이 연결이 루프백될 때(거의 모든 경우에 다음을 통해)루오인터페이스) 이동일한패킷이 사전 라우팅(다른 conntrack 상자)을 통해 돌아올 때 conntrack 상태가 일치합니다. 즉, 로컬 루프백 연결에 대해 두 개의 conntrack 상태가 없습니다.

다른 경우에는 새 연결의 첫 번째 패킷이 사전 라우팅(미리 라우팅된 conntrack 상자)을 통해 도착하고 새로운 conntrack 상태가 생성됩니다.

따라서 연결의 첫 번째 루프백 패킷이 전송되면 새로운 conntrack 항목이 생성됩니다.출력 중이 패킷이 사전 라우팅을 통해 돌아올 때 기존 conntrack 항목과 일치합니다. 더 이상 새 항목이 아닙니다. NAT 후크(nat/prerouting 체인을 의미 destination-nat)는 통과되지 않으므로 이 연결에 영향을 주지 않습니다. 출력 단계에서 기회가 누락됩니다.

대신에DNA이 상황을 해결하기 위해 새로운 conntrack 상태 설명이 nat/output에 나타납니다. 기본적으로 로컬에서 시작된 모든 연결(예: 인터넷)에 영향을 미치므로 로컬 연결에만 사용하도록 주의해야 합니다.루오상호 작용. 이 체인과 규칙이 이를 수행합니다:

nft add chain inet firewall loopback-nat '{ type nat hook output priority -100; policy accept; }'
nft add rule inet firewall loopback-nat oif lo tcp dport 80 counter redirect to :13080

다른 곳에서 실행하면 해당 동작을 추적할 수 있습니다.conntrack이벤트 모드의 명령:

conntrack -E -p tcp --dport 80

그리고 외부에서 시작된 연결과 로컬에서 시작된 루프백 연결(이 추가 체인이 있거나 없는) 간의 차이점을 확인하세요. 기억해 주세요,후크는 상태와 함께 표시된 항목만 볼 수 있습니다 [NEW](그리고 이에 따라 명령에 의해 표시된 항목이 변경되었습니다).

관련 정보