다음 시나리오의 IP 패킷 흐름에 대한 질문이 있습니다.
시나리오는 다음과 같습니다.
- 클라이언트에는 tun0(10.0.0.2/8) 인터페이스와 물리적 무선 네트워크 카드 wlan0(IP 주소가 고정되어 있지 않음)이 있어 인터넷에 연결할 수 있습니다.
- 서버 측(Ubuntu 12.04 amd64)에는 또 다른 tun0(10.0.0.1/8) 인터페이스와 물리적 이더넷 카드 eth0(192.168.1.38/24)이 있으며, eth0은 NAT 방화벽 뒤의 개인 네트워크에 있으며 방화벽을 통한 인터넷(게이트웨이로서의 방화벽),
echo 1 > /proc/sys/net/ipv4/ip_forward
서버 측에서 " "을(를) 실행합니다.iptables -t nat -A POSTROUTING -s 10.0.0.0/8 -o eth0 -j MASQUERADE
서버 측에서 " "을(를) 실행합니다.
장면 그래프는 다음과 같습니다.
--------------- ----------------
| | | |
| client tun0 |----------| client wlan0 |
| 10.0.0.2 | | ip not fix |
| | | |
--------------- ----------------
|
|
internet
|
|
----------------
| |
| firewall |
| (gateway) |
| 192.168.1.1 |
| |
----------------
|
| private network
| 192.168.1.0/24
|
--------------- ----------------
| | | |
| server tun0 |----------| server eth0 |
| 10.0.0.2 | | 192.168.1.38 |
| | | |
--------------- ----------------
나는 두 개의 매우 간단한 VPN과 유사한 클라이언트/서버 프로그램을 사용하여 두 tun0 인터페이스에 대한 IP 패킷을 읽고 쓰고 10.0.0.2에서 오는 IP 데이터에 대해 wlan0과 eth0 사이에 터널을 생성했습니다. 패킷은 10.0.0.1에 도달할 수 있고 그 반대의 경우도 마찬가지입니다(예: , 10.0.0.1에서 10.0.0.2까지 ftp를 실행할 수 있습니다.
그러나 클라이언트 tun0(10.0.0.2)을 사용하여 웹을 탐색하려는 경우 http 요청은 10.0.0.2에서 이루어지며 인터넷 IP 주소(확실히 10.0.0.1은 아님)에 도달합니다. http 요청(제 생각에는)이 서버 tun0(10.0.0.1)에 도달한 후 서버 eth0으로 전달됩니다(ip_forward가 켜져 있기 때문에 전달된 이 http 요청은 여전히 소스 IP 주소 10.0.0.2를 가질 것이라고 생각합니다. 틀렸습니다. 수정해 주세요. 그런 다음 NAT를 수행하여 eth0의 http 요청을 다시 패키지합니다(즉, iptables 명령을 실행했기 때문에 원본 IP 주소가 192.168.1.38로 변경됨). 그러면 다시 패키지된 http 요청이 방화벽을 통과합니다(그리고 그런 다음 인터넷)이 목적지에 도달합니다.
웹사이트의 http 응답이 서버 eth0에 도달하면 그곳에서 역방향 NAT가 수행되어야 합니다. 내 질문은 다음과 같습니다
- 역방향 NAT는 http 응답의 대상 IP 주소를 10.0.0.2로 복원합니다.
- 서버 eth0은 역방향 NAT의 http 응답을 어디로 전달할지 어떻게 알 수 있나요?
- 응답의 대상 IP 주소가 10.0.0.2로 역방향 NAT화되었기 때문에 eth0이 http 응답을 서버 tun0(10.0.0.1)으로 전달합니까?
- 역방향 NAT에 대한 http 응답을 올바르게 라우팅/전달하려면 서버 측에 경로를 추가해야 합니까? 그렇다면 어떻게?
- 역방향 NAT에 대한 http 응답을 올바르게 라우팅/전달하려면 서버 측에 일부 iptables 규칙을 추가해야 합니까? 그렇다면 어떻게?
답변1
클라이언트가 tun0을 통해 모든 트래픽을 보낸다고 가정하면 서버 측에서 다음을 추가해야 합니다(/proc/sys/net/ipv4/ip_forward를 활성화한 후).
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -i tun0 -o eth0 -j ACCEPT
이 단계를 완료한 후 클라이언트에서 웹을 탐색할 때 패킷 흐름은 다음과 같습니다.
- 클라이언트는 패킷을 10.0.0.1로 보냅니다.
- 서버 측에서는 tun0에서 수신된 패킷이 10.0.0.2에서 192.168.1.38로 변환됩니다.
- NAT 테이블에 매핑 항목이 생성됩니다.
- 패킷은 192.168.1.1(게이트웨이)을 통해 인터넷으로 전송됩니다.
- 응답은 192.168.1.38로 수신됩니다.
- 3단계에서 생성된 매핑 항목을 기반으로 역방향 NAT가 수행됩니다.
- 응답 패킷은 10.0.0.2로 다시 라우팅됩니다.
몇 가지 중요한 단계를 놓치지 않았기를 바랍니다. :)