1

У меня есть несколько серверов (B, C, ...), которые находятся в одном месте, и одна машина (A), которая находится за обычным старым домашним маршрутизатором. Я хочу, чтобы все они могли соединиться друг с другом. Мне кажется, что OpenVPN - отличное место, чтобы начать здесь, поэтому я установил туннель (tun0) между A и B через Интернет. Вот как выглядит ситуация:

 10.8.0.4                 10.8.0.1
----------  10.8.0.0/24   ---------- 
|        |                |        | 
|   A   tun0 ----------- tun0  B   | 10.128.140.204 
|        |                |        | 
----------                -- eth1 -- 
                              |
                              | 10.128.0.0/16
                              |
                          -- eth1 --
                          |        |
                          |    C   | 10.128.13.224
                          |        |
                          ----------

В частности, мне нужно, чтобы A был в состоянии достигнуть C по адресу 10.128.13.224 и C, чтобы иметь возможность достигнуть A по адресу 10.8.0.4. Это означает, что NAT не подойдет - большинство ресурсов говорят о настройке NAT на B, чтобы A мог видеть C - и вот тут-то кажется, что это сложно.

Вот что я сейчас пытаюсь сделать:

  • скажите A использовать 10.8.0.1 в качестве шлюза для 10.128.0.0/16
  • скажите B использовать 10.128.140.204 в качестве шлюза для 10.8.0.0/24
  • получить B, чтобы действовать в качестве этого шлюза

Таблица маршрутизации на А:

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         [home router]   0.0.0.0         UG    0      0        0 enp0s3
10.8.0.0        *               255.255.255.0   U     0      0        0 tun0
10.128.0.0      localhost       255.255.0.0     UG    0      0        0 tun0
[home ip]       *               255.255.255.0   U     0      0        0 enp0s3

A# ip route get 10.128.13.224
10.128.13.224 via 10.8.0.1 dev tun0  src 10.8.0.4
    cache

Выглядит отлично. Таблица маршрутизации на C:

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         gateway         0.0.0.0         UG    0      0        0 eth0
10.8.0.0        10.128.140.204  255.255.255.0   UG    0      0        0 eth1
10.13.0.0       *               255.255.0.0     U     0      0        0 eth0
10.128.0.0      *               255.255.0.0     U     0      0        0 eth1
[public IP]     *               255.255.255.0   U     0      0        0 eth0

C# ip route get 10.8.0.4
10.8.0.4 via 10.128.140.204 dev eth1  src 10.128.13.224
    cache

Отлично. Включить IP-пересылку на B:

B# cat /proc/sys/net/ipv4/ip_forward
1

Я думаю, что по умолчанию ПРИНЯТЬ все правила в iptables также будут работать, но для хорошей меры я немного ограничился цепочкой FORWARD:

B# iptables -S
-P INPUT ACCEPT
-P FORWARD DROP
-P OUTPUT ACCEPT
-A FORWARD -s 10.128.0.0/16 -d 10.8.0.0/24 -i eth1 -o tun0 -j ACCEPT
-A FORWARD -s 10.8.0.0/24 -d 10.128.0.0/16 -i tun0 -o eth1 -j ACCEPT

Ну, нет. A# ping 10.128.41.180 ничего не делает и C# ping 10.8.0.4 не делает.

Если я добавлю NAT следующим образом:

B# iptables -t nat -S
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-A POSTROUTING -s 10.8.0.0/24 -d 10.128.0.0/16 -o eth1 -j MASQUERADE

тогда пинг от А до С работает.

A# ping 10.128.13.224
PING 10.128.13.224 (10.128.13.224) 56(84) bytes of data.
64 bytes from 10.128.13.224: icmp_seq=1 ttl=63 time=120 ms
...

Это не то, что я хочу сделать, но я думаю, это означает, что что- то работает. Еще одна любопытная вещь: если я настрою MASQUERADE наоборот, пинг от C до A не будет работать, поэтому я думаю, что здесь может быть подсказка.

Теперь я начинаю задаваться вопросом, можно ли сделать то, что я хочу сделать, или у меня есть какое-то базовое непонимание того, как работает сеть. Это вообще возможно? Я пропускаю что-то простое? Буду признателен за любые советы или ресурсы.

1 ответ1

1

Оказывается, что вышеупомянутое будет прекрасно работать в обычной обстановке. Однако серверы (B , C , ...) находились в сети, которая не позволяет отправлять пакеты с исходным адресом, который не соответствует IP-адресу отправителя:

При пинге C от A , A отправляет IP-пакет внутри кадра Ethernet через tun0 на B, что примерно выглядит следующим образом:

----------------------------------------------------
| source: A's tun0 MAC | destination: B's tun0 MAC |
| -------------------------------------------------|
| | source: 10.8.0.4 | destination: 10.128.13.224 ||
| | payload: PING                                 ||
| -------------------------------------------------|
----------------------------------------------------

Затем B проверяет свою маршрутизацию и отправляет следующее через eth1:

----------------------------------------------------
| source: B's eth1 MAC | destination: C's eth1 MAC |
| -------------------------------------------------|
| | source: 10.8.0.4 | destination: 10.128.13.224 ||
| | payload: PING                                 ||
| -------------------------------------------------|
----------------------------------------------------

Сеть проверяет это и обнаруживает, что адрес источника 10.8.0.4 не совпадает с адресом eth1 B 10.128.140.204 и не передает кадр. Вот почему простой шлюз не будет работать в этой сети.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .