
내 홈 네트워크에는 다음 토폴로지가 있습니다.
Internet
|
wifi |
C ----------- A ---------- B
어디
- A(고정 IP 192.168.0.254)는 ISP에서 제공한 라우터/AP입니다.
- B(고정 IP 192.168.0.1)는 로컬 DNS 및 DHCP 서버로 작동하는 Linux 시스템입니다(dnsmasq 실행).
- C는 AP에 연결되고 DHCP에 의해 구성된 클라이언트입니다.
현재 B(DHCP 서버)에서 제공하는 기본 게이트웨이는 A입니다.
그런 다음 클라이언트 C에서 들어오는 모든 트래픽을 B에서 캡처한다고 가정합니다. B에서 수행한 작업은 다음과 같습니다.
다음을 사용하여 IP 전달을 활성화합니다.
# sysctl net.ipv4.ip_forward=1"
B를 게이트웨이로 공급합니다. 물론 B 자체는 A를 자체 게이트웨이로 사용합니다.
- 무슨 일이 일어나고 있는지 확인하려면 B에서 tcpdump를 실행하십시오.
클라이언트 C에서는 다음과 같은 요청을 시작합니다.
$ traceroute www.google.com
이제 C에서 발생한 트래픽은 B로 라우팅된 다음 A로, 마지막으로 인터넷으로 라우팅될 것으로 예상됩니다.
작동하는 것.C는 인터넷에 접속할 수 있다
작동하지 않는 것.첫 번째 요청을 제외하면 B는 완전히 우회된 것으로 보입니다. tcpdump는 아무것도 표시하지 않습니다. B의 주소는 Traceroute 출력에 표시되지 않습니다. 그래도 B에서 IP 전달을 비활성화하면 C가 인터넷에서 끊어지기 때문에 재라우팅이 발생할 것이라고 확신합니다.
일종의 단락이 발생하는 경우 이를 어떻게 방지할 수 있습니까?
부인 성명: 네트워크 토폴로지를 변경하면 "모든 트래픽 캡처" 문제(예: 포트 미러링 등)를 해결할 수 있다는 것을 알고 있지만 내 설정에 무슨 일이 일어나고 있는지, 그리고 토폴로지를 변경하지 않고 문제를 해결하는 방법을 정말로 알고 싶습니다.
답변1
A가 동일한 패킷을 다시 볼 수 없도록 NAT 변환을 수행하려면 호스트 B가 필요합니다. 대신 B는 패킷이 B에서 시작된 것처럼 A를 통해 패킷을 보내야 합니다. 이를 달성하려면 iptables
다음과 같은 규칙을 추가합니다.
# iptables -t nat -A POSTROUTING -s ip-of-C -j MASQUERADE
이 규칙에 따라 B에서 나가는 모든 패킷은 마치 B에서 나온 것처럼 다시 작성되지만 역변환 테이블을 유지하므로 관련 응답이 역변환되어 C로 전송될 수 있습니다.
-s ...
규칙을 C에서 가져온 패킷(또는 로컬 LAN으로 설정될 수 있음)에만 적용하고 응답 패킷에는 적용하지 않도록 제한하는 부분에 유의하세요 .
편집(@theuncle의 의견 고려): NAT 없이는 작동하지 않는 이유에 대한 설명은 호스트 B가 동일한 인터페이스에서 패킷이 들어오고 나가는 것을 인식하여 C에게 알려 네트워킹을 향상시킬 수 있다는 것입니다. 해당 트래픽에 대해 A와 직접 대화합니다.