Назад | Перейти на главную страницу

NAT для нескольких серверов с iptables через OpenVPN

Я успешно создал сеть OpenVPN (сервер, размещенный в VPS) 10.8.0.0/255.255.0.0 для моих домашних нужд, а клиенты, поддерживающие клиентов OpenVPN, могут подключаться через сервер и успешно соединяться между собой.

Есть также некоторые машины (например, NAS), которые не поддерживают OpenVPN, но я хочу подключиться к ним через сеть VPN. Мое решение заключалось в том, чтобы иметь небольшую машину (например, Raspberry Pi [IP-адрес: 192.168.1.109]) являясь клиентом OpenVPN и правильно перенаправляя пакеты на целевые машины, но мне не нравится предлагаемое решение. Вот так как:

  1. Я не хочу, чтобы между разными локальными сетями (и моим домом) возникали конфликты подсетей;
  2. В моем доме есть некоторые машины, которые не хотят быть доступны через VPN.

Поэтому я создал 1 сертификат клиента для каждой машины, которая будет подключаться к VPN (2 в моем случае), и попробую через iptables сделать NAT для доступа к этим машинам с помощью IP-адреса VPN. Мне удалось успешно подключиться к VPN. Вот результат ifconfig Raspberry Pi:

eth0      Link encap:Ethernet  HWaddr b8:27:eb:40:44:76
          inet addr:192.168.1.109  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::ed10:b13d:8e57:7a64/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:208623 errors:0 dropped:10506 overruns:0 frame:0
          TX packets:183838 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:181180734 (172.7 MiB)  TX bytes:35462529 (33.8 MiB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:1175 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1175 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1
          RX bytes:69061 (67.4 KiB)  TX bytes:69061 (67.4 KiB)

tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          inet addr:10.8.0.26  P-t-P:10.8.0.25  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:83 errors:0 dropped:0 overruns:0 frame:0
          TX packets:82 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:8940 (8.7 KiB)  TX bytes:9786 (9.5 KiB)

tun1      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          inet addr:10.8.0.34  P-t-P:10.8.0.33  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:18 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:912 (912.0 B)  TX bytes:0 (0.0 B)

С помощью iptables Я хочу сопоставить IP-адреса С 10.8.0.26 до 192.168.1.201 и С 10.8.0.34 до 192.168.1.202. После многих попыток мне удалось создать правила, описанные ниже (с помощью команды iptables -t nat --list):

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
DNAT       all  --  anywhere             10.8.0.26            to:192.168.1.201
DNAT       all  --  anywhere             10.8.0.34            to:192.168.1.202

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
SNAT       all  --  10.8.0.0/16          192.168.1.0/24       to:192.168.1.109

Если я поставлю правила для одной машины, они работают правильно. Когда я помещаю их оба (как указано выше), второй NAT не работает (в данном случае от 10.8.0.34 до 192.168.1.202)!

Как вы думаете, в чем проблема? Я предполагаю, что во втором случае, хотя ответ должен возвращаться начиная с 10.8.0.34, он, вероятно, отправляет его через неправильный интерфейс (tun0). В ip route команда возвращает это:

0.0.0.0/2 via 192.168.1.1 dev eth0
0.0.0.0/1 via 10.8.0.25 dev tun0
default via 192.168.1.1 dev eth0  metric 202
10.8.0.0/24 via 10.8.0.25 dev tun0
10.8.0.25 dev tun0  proto kernel  scope link  src 10.8.0.26
10.8.0.33 dev tun1  proto kernel  scope link  src 10.8.0.34
64.0.0.0/2 via 192.168.1.1 dev eth0
81.XXX.YYY.ZZZ via 192.168.1.1 dev eth0
128.0.0.0/2 via 192.168.1.1 dev eth0
128.0.0.0/1 via 10.8.0.25 dev tun0
192.0.0.0/2 via 192.168.1.1 dev eth0
192.168.1.0/24 dev eth0  proto kernel  scope link  src 192.168.1.109  metric 202

Как вы думаете, какое решение возможно?

Изменить 1:

Я представляю здесь небольшую схему Сети, чтобы лучше прояснить топологию.

/---------------------------\
| OpenVPN Server            |                  /-----------------------------------\
| Public IP: 81.XXX.YYY.ZZZ |  ----- ... ----- | Home Router Local Ip: 192.168.1.1 | 
| VPN IP: 10.8.0.1          |                  \-----------------------------------/
\---------------------------/                      |   |   |   |   |   |   |   |  
                                                   |   |   |   |   |   |   |   |
                                                  /--\/--\/--\/--\/--\/--\/--\/--\
                                                  |S1||S2||S3||S4||S5||S6||S7||S8|
                                                  \--/\--/\--/\--/\--/\--/\--/\--/

S[*]: All machine have local ip in 192.168.1.0/255.255.255.0
S1: Server that has capabilities to run OpenVPN client (for example 10.8.0.12)
S2: The Raspberry PI that runs the 2 instances of OpenVPN Client (10.8.0.26, 10.8.0.34)
S3-4: The local servers where the are not capable for running the OpenVPN client (192.168.1.201, 192.168.1.202)
S5-8: Local server that I don't want to be availiable in the OpenVPN network. 

Изменить 2: я задал тонну вопроса суперпользователь, что более уместно.