외부 도메인을 사용할 때 Apache가 내부 IP를 기록하는 이유는 무엇입니까?

외부 도메인을 사용할 때 Apache가 내부 IP를 기록하는 이유는 무엇입니까?

저는 주 개발 서버에서 원하지 않는 소규모 테스트 프로젝트를 위해 사무실에서 사용하고 있는 Raspberry Pi를 실행하고 있습니다. 아파치를 실행 중입니다. DNS는 Cloudflare를 통해 처리되지만 DNS 전용 모드입니다. 현재 테스트하는 동안에는 IP 제한이 없습니다. 에 대한 A 레코드는 mysite.domain.tld내 고정 IP 주소를 가리키며 123.123.123.123표준 비즈니스 파이버 라우터/모뎀만 인터넷과 Pi 사이에 있습니다.

mysite.domain.tld예를 들어 Wi-Fi가 없는 휴대폰에서 방문하면 이동통신사 IP가 표시됩니다. wget원격 서버에서 접속할 때 ,그것은'IP가 로그에 표시됩니다. 모든 것이 예상대로 작동합니다.

mysite.domain.tld그러나 Pi가 위치한 동일한 네트워크 내에서 이동하면 Apache는 라우터 게이트웨이 IP를 기록합니다 192.168.1.1. 도메인 이름에 대한 연결이 Cloudflare를 통해 공용 IP로 확인되므로 내 공용 IP 주소가 표시될 것으로 예상합니다. 하지만 대신 로그에 로컬 네트워크 IP가 표시됩니다.

/etc/hosts(저는 macOS를 사용하고 있습니다) 라우터에는 아무것도 설정되어 있지 않으며 포트 443에서 연결하기 위한 포트 전달만 동일한 포트의 Pi에 대한 라우터입니다. 도메인 이름과 관련된 어떤 것도 참조되지 않습니다. 핑을 mysite.domain.tld하면클라우드플레어IP 주소는 내가 기대했던 것입니다.

체인 어딘가에 내 IP 주소와 Pi의 공개 IP 주소가 일치하여 IP를 내부 게이트웨이 IP로 재정의한다는 사실이 있는 것 같습니다.여기서 실제로 무슨 일이 일어나고 있습니까?나는 아니에요정신192.168.*그 자체로는 방화벽에서 IP 제한을 설정할 때 IP를 신뢰할 수 있다는 사실을 신뢰할 수 있는지 확인하고 싶습니다 .

참고: 여기에서는 CF-Connecting-IP 및 유사한 헤더가 Cloudflare에 의해 전송되지 않습니다. 이는 DNS 전용 모드가 아닌 경우에만 발생하는 것으로 추정됩니다. 그리고 그것은것 같다Pi가 사용하는 것과 동일한 네트워크 연결을 사용할 때만 가능합니다.

답변1

귀하의 라우터는 Linux를 실행하고 있으며 이 동작은 모든 기본 Linux 배포판에서 쉽게 구현할 수 있습니다. 라우터 방화벽이 이와 같이 작동하려면 어떤 규칙이 있어야 하는지 짐작할 수 있습니다. 그러나 이는 단지 추측일 뿐이며 실제로 규칙이 정확히 어떻게 나타나는지는 알 수 없습니다.

웹 서버에 포트를 전달하면 다음과 같은 특정 DNAT 규칙이 추가됩니다.

iptables -t nat -A PREROUTING -p tcp -d <your-external-address> --dport 443 -j DNAT --to-destination <raspberry-pi-address>

즉, "이 패킷이 장치로 향하는지 또는 전달되어야 하는지 결정하기 전에 패킷 대상 주소가 외부 주소이고 대상 포트가 443인지 확인하십시오. 일치하는 경우 대상 주소를 라즈베리 파이의 LAN으로 변경하십시오. 주소". 이 규칙은 인터페이스를 기준으로 필터링되지 않습니다.

또한 확실히 SNAT 유형의 규칙(LAN을 위한 인터넷 액세스 제공)이 있으며 아마도 다음과 같습니다.

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE

즉, 라우터는 패킷이 어디로 가야 하는지 결정한 후 패킷을 보내기 전에 소스 주소를 아웃바운드 인터페이스의 주소로 변경합니다(패킷이 LAN에서 전송된 경우). 다시 말하지만 인터페이스에 의해 필터링되는 것은 없습니다.

이제 HTTPS 연결을 고려하십시오. 브라우저에서 호스트 이름을 지정하고 있는 거죠? 대상 주소가 되는 라우터의 외부 주소로 확인되도록 설정합니다. 소스 주소가 LAN 내부에 있습니다. 따라서 이 두 규칙 모두 연결 패킷에 적용되는 것 같습니다.

이를 처리하면서 라우터는 먼저 DNAT 규칙을 발견하고 대상 주소와 포트를 확인한 후 대상 주소를 라즈베리 파이의 주소로 변경하기로 결정합니다. 그런 다음 패킷이 나가야 하는 인터페이스가 LAN 1임을 알게 됩니다. 그런 다음 두 번째 규칙에 대해 부분적으로 변환된 패킷을 확인하고 소스 주소가 LAN에서 온 것임을 알아냅니다. 따라서 패킷의 소스 주소를 LAN 인터페이스의 주소인 192.168.1.1로 대체합니다. 이것이 당신의 라즈베리 파이가 보는 것입니다.

NAT 작업은 상태 저장입니다. 즉, 어떤 것이 무엇으로 대체되었는지, 후속 전달 및 응답 패킷을 어떻게 감지할지 알려주는 테이블 기록을 유지하므로 모든 패킷을 올바르게 변환합니다. 예, Linux는 동일한 스트림 내에서 DNAT와 SNAT를 동시에 수행할 수 있는 것으로 나타났습니다.

이 행동을 믿을 수 있습니까? 모르겠습니다. 라우터의 펌웨어가 오픈 소스라면 확인할 기회가 있었습니다. 출처가 없으면 확신할 수 없습니다. 이는 소스가 폐쇄된 경우 항상 발생하므로 보안이 염려된다면 폐쇄 소스 제품을 피해야 합니다.

관련 정보