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

Как мне настроить VPN для доступа к определенным подсетям?

Я хотел бы настроить VPN типа «точка-сеть», которая используется только для доступа к определенному набору подсетей, чтобы я мог получать доступ к службам через VPN, но без маршрутизации всего трафика через нее.

В моей тестовой установке у меня есть три сервера, один из которых (fra1-02) работает StrongSwan / IPSec:

          +-----------------+     +-----------------+
          |    client(s)    |---->|    internet     |
          +-----------------+     +-----------------+
                   |
                   v
          +-----------------+
          |  fra1-02 (vpn)  |
          +-----------------+
                   |
         +---------+---------+
         |                   |
         v                   v
+-----------------+ +-----------------+
|     fra1-01     | |     fra1-03     |
+-----------------+ +-----------------+

Я хочу, чтобы клиенты обычно подключались к Интернету, но для трех подсетей (в частности, тех, которые назначены для трех серверов), трафик должен проходить через VPN.

У трех серверов есть эти подсети:

  1. 2a03:b0c0:3:e0::489:d000/124
  2. 2a03:b0c0:3:e0::493:1000/124
  3. 2a03:b0c0:3:e0::493:2000/124

Я настроил IPSec для назначения IP-адресов клиентам из fd00:0::0/32

Это мое ipsec.conf:

config setup
    uniqueids=no
conn ikev2-vpn
    auto=add
    compress=no
    type=tunnel
    keyexchange=ikev2
    fragmentation=yes
    forceencaps=yes
    dpdaction=clear
    dpddelay=300s
    rekey=no
    left=%any
    leftid=@{{ leftid }}
    leftcert=cert.pem
    leftsendcert=always
    leftsubnet=2a03:b0c0:3:e0::489:d000/124,2a03:b0c0:3:e0::493:1000/124,2a03:b0c0:3:e0::493:2000/124
    right=%any
    rightid=%any
    rightauth=eap-mschapv2
    rightsourceip=fd00:0::0/32
    rightdns={{ rightdns }}
    rightsendcert=never
    eap_identity=%identity

{{ variables }} будет заполнен Ansible).

Я не настраивал маршрутизацию или что-то еще.

Когда я подключаюсь к VPN со своего ноутбука, я все еще могу пинговать fra1-02, хост vpn и адрес источника теперь назначается IPSec, а не публичным адресом моего ноутбука, но два других хоста вообще недоступны.

Я также добавил это в /etc/sysctl.conf:

net.ipv6.conf.all.forwarding=1

Это (некоторые из) результаты netstat -rn на моем ноутбуке (выглядит именно так, как я ожидал):

default                         fd00::    UGcI     ipsec0
2a03:b0c0:3:e0::489:d000/124    fd00::    UGSc     ipsec0
2a03:b0c0:3:e0::493:1000/124    fd00::    UGSc     ipsec0
2a03:b0c0:3:e0::493:2000/124    fd00::    UGSc     ipsec0
...

А таблица маршрутизации на VPN-сервере такая:

root@fra1-02:~# ip -6 route list
::1 dev lo proto kernel metric 256 pref medium
2a03:b0c0:3:e0::/64 dev eth0 proto kernel metric 256 pref medium
fe80::/64 dev eth1 proto kernel metric 256 pref medium
fe80::/64 dev eth0 proto kernel metric 256 pref medium
default via 2a03:b0c0:3:e0::1 dev eth0 proto static metric 1024 pref medium

Как мне настроить так, чтобы трафик fra1-01 и fra1-03 проходит через VPN?

Я установил netfilter-persistent и добавил следующее в /etc/iptables/rules.v6:

*nat
-A POSTROUTING -s fd00::/32 -o eth0 -j MASQUERADE
COMMIT

И теперь все отлично работает.