Mam urządzenie (IP 10.110.1.3) z następującą konfiguracją reguły:
$ ip route
default via 10.110.1.4 dev wlan0 onlink
Mam włączone przekazywanie IPv4 na obu komputerach. Obie maszyny mogą ze sobą rozmawiać.
Oto moje iptables. Chcę trasować z interfejsu wlp0s20u1 do wlp3s0:
$ iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
$ iptables -t nat -S
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-A POSTROUTING -o wlp3s0 -j MASQUERADE
Trasy w urządzeniu „trasującym” 10.110.1.4:
$ ip route
default via 192.168.1.1 dev wlp3s0 proto static
10.110.1.0/24 dev wlp0s20u1 proto kernel scope link src 10.110.1.4
192.168.1.0/24 dev wlp3s0 proto kernel scope link src 192.168.1.110 metric 600
Używając trasy „if interface”, jasne jest, że to nigdy nie zadziała:
$ ip route get to 192.168.1.1 from 10.110.1.3 iif wlp0s20u1
RTNETLINK answers: No route to host
$ ip route get to 8.8.8.8 from 10.110.1.3 iif wlp0s20u1
RTNETLINK answers: No route to host
Zauważyłem, że src 192.168.1.110
na 192.168.1.0
trasie, i próbowała dodając następującą trasą aby rozwiązać ten problem:
$ sudo ip route add 192.168.1.1/32 dev wlp3s0
Ale to też nie pomogło.
Użyłem tcpdump do analizy icmp, dzięki czemu mogę zobaczyć, dokąd zmierzają moje pingi.
$ tcpdump -i wlp0s20u1 -n icmp
listening on wlp0s20u1, link-type EN10MB (Ethernet), capture size 262144 bytes
18:13:19.355166 IP 10.110.1.3 > 8.8.8.8: ICMP echo request, id 32366, seq 1, length 64
18:13:20.359770 IP 10.110.1.3 > 8.8.8.8: ICMP echo request, id 32366, seq 2, length 64
i
tcpdump -i wlp3s0 -n icmp
listening on wlp3s0, link-type EN10MB (Ethernet), capture size 262144 bytes
Nic w interfejsie wlp3s0, chyba że wykonam ping z komputera „routera”.
Tak więc oczywistym problemem jest to, że jądro nie wie, jak trasować pakiety z wlp0s20u1 do wlp3s0. Ale nie jestem pewien, jak to zrobić. Próbowałem jawnie dodać trasy, aby to zrobić, ale wydaje się, że to nie działa.
Jeśli spamuję następujące elementy, tylko liczniki pakietów przekierowujących zwiększają się (podczas próby pingowania);
$ iptables -t nat -v -L -n
Chain PREROUTING (policy ACCEPT 775 packets, 50740 bytes)
pkts bytes target prot opt in out source destination
Chain INPUT (policy ACCEPT 24 packets, 1920 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 95 packets, 23073 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 5 packets, 1000 bytes)
pkts bytes target prot opt in out source destination
90 22073 MASQUERADE all -- * wlp3s0 0.0.0.0/0 0.0.0.0/0
Każda pomoc jest mile widziana!
EDYCJA: Uproszczone objaśnienie
Mam trzy urządzenia:
- Odp .: Router WiFi pod adresem 192.168.1.1
- B: Komputer z dwiema kartami Wi-Fi: wlp3s0 w sieci 192.168.1.1 i wlp0s20u1 w sieci 10.110.1.0/24.
- C: Komputer wyłącznie w sieci WiFi 10.110.1.0/24.
Próbuję pozwolić C rozmawiać z Internetem (0.0.0.0/0) za pomocą dwóch przeskoków, najpierw do B, potem do A, a potem do Internetu.
Problem polega na tym, że B kieruje pakiety z wlp3s20u1 do wlp3s0.
źródło
Odpowiedzi:
Rozwiązaniem było włączenie przekazywania określonego interfejsu. Z jakiegoś powodu nie został włączony.
źródło