Как использовать tun в качестве шлюза между локальной сетью и маршрутизатором? - PullRequest
0 голосов
/ 19 апреля 2019

Я пытаюсь, чтобы хост 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. может работать.

Буду признателен за любые советы.Большое спасибо.

...