Я пытаюсь, чтобы хост B в локальной сети получил доступ к Интернету через другой хост A в качестве маршрутизатора.И я хочу, чтобы пакеты проходили между двумя настройками на хосте A и B.
Я настроил две настройки программно на centos.И ifconfig показывает состояние туннелей на хосте A и B. Вот так:
tun1 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:20.0.0.1 P-t-P:20.0.0.1 Mask:255.255.255.0
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:500
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
tun1 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:20.0.0.10 P-t-P:20.0.0.10 Mask:255.255.255.0
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:500
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
IP-адрес туннеля на хосте A - 20.0.0.1, а хост B - 20.0.0.10.
Физические карты на хосте A - 172.16.1.10, 172.16.2.10, а на хосте B - 172.16.1.15, 172.16.2.15.
Это маршрут хоста B.
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
172.16.2.0 * 255.255.255.0 U 1 0 0 em2
172.16.3.0 * 255.255.255.0 U 0 0 0 em3
172.16.1.0 * 255.255.255.0 U 1 0 0 em1
20.0.0.0 * 255.255.255.0 U 0 0 0 tun1
link-local * 255.255.0.0 U 1004 0 0 em3
default 20.0.0.1 0.0.0.0 UG 0 0 0 tun1
Хост B может пропинговать 20.0.0.1, , но не может пропинговать внешнюю сеть и настройку маршрутизатора (хост A)молчит.
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on tun1, link-type RAW (Raw IP), capture size 65535 bytes
^C
0 packets captured
0 packets received by filter
0 packets dropped by kernel
Учитывая, что B может пропинговать 20.0.0.1, я попытался перевести пункт назначения пакета с 20.0.0.0 на 20.0.0.1, но он не работает.
iptables -t nat -A PREROUTING -s 20.0.0.0/24 -j DNAT --to-destination 20.0.0.1
Я попытался изменить маршрут B и использовал физическую карту в качестве шлюза, и B может пропинговать внешнюю сеть.Но мелодия с обеих сторон все еще молчит.Пакеты напрямую проходят через физическую карту и не обрабатываются программой tun, поэтому программа о настройке tun не имеет смысла.
В программе две настройки настроены с помощью флага
ifr.ifr_flags = dev->dev_flags;
strncpy(ifr.ifr_name, dev->name, IFNAMSIZ);
int err = ioctl(dev->dev_fd,TUNSETIFF,(void *)&ifr);
IFF_TUN |IFF_NO_PI
int fd = socket(AF_INET, SOCK_STREAM, 0);
int err = ioctl(fd, SIOCSIFADDR, &ifr);
paddr->sin_addr.s_addr = inet_addr(dev->mask);
err = ioctl(fd, SIOCSIFNETMASK, &ifr);
маска 255.255.255.0
strcpy(ifr.ifr_name, dev->name);
int err = ioctl(fd, SIOCGIFFLAGS, &ifr);
ifr.ifr_ifru.ifru_flags |= IFF_UP;
err = ioctl(fd, SIOCSIFFLAGS, &ifr);
также добавлен маршрут.Показано выше.
Подводя итог, как разрешить хосту B в локальной сети пинговать внешнюю сеть с A в качестве маршрутизатора, когда два туннеля могут действовать как соединение между ними?
По крайней мере, как позволить пакету, посланному B, быть принятым A, когда пункт назначения установлен как снаружи?С тех пор iptables на A. может работать.
Буду признателен за любые советы.Большое спасибо.