다음 문제는 내가 문제가있는 더 큰 솔루션 중 하나 일뿐입니다. 다른 모든 요소는 지금까지 작동하는 것처럼 보이므로 문제가있는 매우 작은 조각을 설명하려고 노력할 것입니다.
tun0 (터널링 인터페이스) 및 eth0 (스위치는 인터넷의 기본 게이트웨이입니다 ) 이있는 Linux 컴퓨터 가 있습니다.
목표 : 내 목표는 tun0에서 들어오는 패킷을 수신하여 기본 게이트웨이로 전달하는 것입니다. 실제 인터페이스를 위조하는 tun0으로 인터넷을 "공유"하고자하는 아주 간단한 NAT 사례입니다.
Tun은 다음을 사용하여 만들어졌습니다.
sudo openvpn --mktun --dev tun0 --user USER
sudo ip addr add 10.2.0.1/24 dev tun0
sudo ip link set tun0 up
그래서 나는 그것을 가지고 있고, 핑 할 수 있습니다. 또한,이 TUN 장치에 연결되는 C ++ 응용 프로그램을 읽고 쓸 수 있습니다. (fti : 여기 내가 따라온 튜토리얼이 있습니다 : http://backreference.org/2010/03/26/tuntap-interface-tutorial/ )
8.8.8.8에 대한 올바른 ICMP (ping) 요청을 C ++의 바이트 배열에 덤프했습니다. 이제 내 프로그램을 사용하여 tun0 장치에 씁니다. ICMP 요청은
- 소스 (10.2.0.10)-커널은 경로를 알고 있습니다 (동일한 서브넷)
- 대상 (8.8.8.8)-Google의 DNS
- 올바른 체크섬 등 (Wireshark / TShark에서는 tun0에 올바르게 나타남)
그런 다음 다음과 같은 경로가 있습니다.
iptables -F # flush
iptables --table nat --append POSTROUTING --out-interface eth0 -j MASQUERADE
iptables --append FORWARD --in-interface tun0 -j ACCEPT
그리고 여기에 붙어 있습니다 : (패킷은 기본 gw로 전달되지 않습니다 (tshark는 수신 된대로 tun0에서만 볼 수 있습니다.
무엇이 빠졌습니까? 어쩌면 다른 대안이 될 수도 있습니다 (그러나 tun 장치를 사용하여 수행해야하며 r / w 할 수 있어야합니다). 추가 정보:
- 전달이 가능합니다 (/ proc / sys / net / ipv4 / ip_forward)
- 8.8.8.8은 eth0을 통해 연결할 수 있습니다 (로컬에서)
- 기본 게이트웨이가 정확합니다 (ISP에서 eth0을 통해)
- rp_tables를 끄려고했습니다 (echo 0> / proc / sys / net / ipv4 / conf / eth5 / rp_filter)
- 그리고 많은 다른 사람들...
힌트를 미리 주셔서 감사합니다!