nftables를 사용하여 Raspberry Pi에서 Minecraft 서버에 대한 포트 전달을 구성하는 방법은 무엇입니까?

nftables를 사용하여 Raspberry Pi에서 Minecraft 서버에 대한 포트 전달을 구성하는 방법은 무엇입니까?

저는 투명 프록시 서비스를 사용하기 때문에 Raspberry Pi를 홈 라우터로 사용합니다. 운영 체제는 Raspbian입니다. 지금은 Minecraft 서버를 설정 192.168.2.28하고 NAT를 사용하여 이를 WAN에 노출하고 있습니다. 이 내 꺼야 /etc/nftables.conf:

#!/sbin/nft -f

flush ruleset

table ip filter {
    chain output {
        type filter hook output priority 0; policy accept;
        tcp sport 25565 drop
    }
}

table ip nat {
    chain prerouting {
        type nat hook prerouting priority 0; policy accept;
        tcp dport 25565 dnat 192.168.2.28
    }

    chain postrouting {
        type nat hook postrouting priority 0; policy accept;
        tcp sport 25565 ip saddr 192.168.2.28 masquerade
    }
}

그러나 다음과 같은 문제가 있습니다. On 192.168.2.28, 나는 nc -l -p 25565 On 192.168.2.27, 나는 실행 echo "Hello, world!" | nc wan_ip 25565

원하는 동작은 "Hello, world!" 메시지를 받는 것입니다 192.168.2.28.

그러나 첫 번째 SYN 패킷이 라우터를 통과할 때 Saddr은 동일하게 유지하면서 baddr만 NAT합니다 192.168.2.27.

192.168.2.28패킷이 수신 되면 응답합니다 192.168.2.27. 동일한 L2 네트워크에 있기 때문에 패킷은 라우터를 통과하지 않으므로 NAT를 통과하지 않습니다.

그런 다음 192.168.2.27로부터 패킷을 수신 192.168.2.28하지만 의 응답인지는 알 수 없습니다 wan_ip.

이 문제를 해결하고 LAN 호스트를 포함하여 모든 곳에서 포트 전달이 작동하도록 하려면 어떻게 해야 합니까?

답변1

참고만 하세요.nftables(좋다iptables)는 NAT될 흐름의 첫 번째 패킷만 봅니다. NAT가 적용되면 동일한 흐름의 다른 모든 패킷은 직접 전송됩니다.웹 필터/연결하다보지 않았다nftables더 이상 필요하지 않습니다. 따라서 추가 지원 없이 자동으로 NAT가 아닌 트래픽을 반환합니다.

유일하게 중요한 부분은 첫 번째 패킷(TCP의 경우 SYN 패킷)에서 발생하는 일입니다. 응답 패킷을 포함하여 이 흐름의 추가 트래픽은 자동으로 처리되고 NAT 후크를 우회합니다.

이는 192.168.2.28에서 발생하는 트래픽을 처리하기 위한 특별한 라우팅 후 규칙이 없어야 함을 의미합니다. 일반적인 변장 규칙은 하나만 있어야 합니다.모두192.168.2.0/24 인터넷으로 통신할 때. 어쨌든 이 규칙 자체는 문제가 되지 않습니다. 나가는 트래픽이 응답 트래픽인 경우 생각만큼 자주 사용되지 않습니다. 기존 트래픽의 일부이므로 위에서 언급한 것처럼 이러한 패킷은 통과되지 않습니다.nftables더 이상은 아닙니다.

권리를 갖는 것이 중요하다NAT 헤어핀지원됨: 클라이언트와 서버가 동일한 LAN에 있는 상황으로, 주의하지 않으면 비대칭 트래픽이 발생할 수 있습니다.

여기:

  • 라우터가 TCP 대상 포트 25565로 향하는 모든 항목(어디서나)을 발견하면 대상 주소를 192.168.2.28로 리디렉션합니다.

    리디렉션은 외부와 내부를 구분하지 않으므로 전체 LAN에 대한 적절한 공통 마스커레이딩 규칙과 연결될 때 규칙 자체로 충분합니다. 그러나 OP는 그러한 규칙을 사용하지 않았습니다.

  • 라우팅 후 일반 위장 대신,

    OP를 사용하는 것은 tcp sport 25565 ip saddr 192.168.2.28이전 규칙의 필터링 부분과 아무 관련이 없습니다.첫 번째패키지 tcp dport 25565(또한 새 패키지를 받았습니다.목적지192.168.2.28): NAT 헤어핀이 구현되지 않았습니다.

무엇완료해야합니다대신 다음 중 하나를 수행하세요.

  1. 전체 LAN에 일반 매스커레이딩을 사용합니다(NAT 헤어핀 사용 사례에 적응하고 추가 정보가 부족함).

        chain postrouting {
            type nat hook postrouting priority 0; policy accept;
            ip saddr 192.168.2.0/24 ip daddr != 192.168.2.0/24 masquerade
        }
    
  2. 서버가 대상인 경우에만 대상 포트가 25565인 패킷에 대해 매스커레이딩을 사용합니다.

        chain postrouting {
            type nat hook postrouting priority 0; policy accept;
            tcp dport 25565 ip daddr 192.168.2.28 masquerade
        }
    

    즉, 서버로 이동하는 트래픽(적절한 NAT 헤어핀을 위한 LAN-to-LAN 트래픽 포함)만 가장됩니다(LAN 시스템은 인터넷에 액세스할 수 없습니다).

  3. 2 대신 DNAT를 먼저 얻는 트래픽에만 매스커레이딩을 적용하도록 선택합니다.

        chain postrouting {
            type nat hook postrouting priority 0; policy accept;
            ct status dnat masquerade
        }
    

    2.와 동일한 효과이지만 더 다양합니다.

  4. 필요할 때 변장을 위해 1과 3만 결합하세요.

    글머리 기호 2. 또는 3.은 인터넷 소스 주소를 숨기는 부작용이 있으므로 LAN에만 적용하는 것이 가장 좋습니다.

        chain postrouting {
            type nat hook postrouting priority 0; policy accept;
            ip saddr 192.168.2.0/24 ip daddr != 192.168.2.0/24 ct status dnat masquerade
        }
    

따라서 1. 또는 4.(인터넷에 대한 LAN 액세스를 제한)를 사용하십시오. 다른 가능한 옵션이 있습니다.

참고: 1. 극단적인 경우가 있습니다. 클라이언트가 라우터의 내부 IP 주소를 대상으로 사용하는 경우 이 경우에 대한 추가 규칙 없이는 작동하지 않지만 클라이언트가 그렇게 할지는 의심스럽고 충분하지 않습니다. OP의 규칙 정보: 라우터의 내부 IP 주소.

관련 정보