У меня есть несколько серверов (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 не будет работать, поэтому я думаю, что здесь может быть подсказка.
Теперь я начинаю задаваться вопросом, можно ли сделать то, что я хочу сделать, или у меня есть какое-то базовое непонимание того, как работает сеть. Это вообще возможно? Я пропускаю что-то простое? Буду признателен за любые советы или ресурсы.