저는 투명 프록시 서비스를 사용하기 때문에 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 헤어핀이 구현되지 않았습니다.
무엇완료해야합니다대신 다음 중 하나를 수행하세요.
전체 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 }
서버가 대상인 경우에만 대상 포트가 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 시스템은 인터넷에 액세스할 수 없습니다).
2 대신 DNAT를 먼저 얻는 트래픽에만 매스커레이딩을 적용하도록 선택합니다.
chain postrouting { type nat hook postrouting priority 0; policy accept; ct status dnat masquerade }
2.와 동일한 효과이지만 더 다양합니다.
필요할 때 변장을 위해 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 주소.