Назад к обновлениям
New releaseSep 8, 2026

strongswan v6.1.0

strongSwan - VPN на основе IPsec

Поделиться

Конфигурация strongSwan

Обзор

strongSwan — это VPN-решение с открытым исходным кодом на основе IPsec.

Этот документ — лишь краткое введение в команду swanctl из strongSwan, которая использует современный vici Versatile IKE Configuration Interface. Устаревшая команда ipsec, использующая старый интерфейс конфигурации stroke, описана здесь. Более подробную информацию можно найти в man-руководствах, на нашем новом сайте документации и на старом вики.

Быстрый старт

Сертификаты для пользователей, хостов и шлюзов выпускаются вымышленным центром сертификации (CA) strongSwan. В наших примерах сертификат CA strongswanCert.pem должен присутствовать на всех VPN-узлах, чтобы можно было аутентифицировать пиров. Для вашего конкретного применения VPN вы можете либо использовать сертификаты от любого стороннего CA, либо самостоятельно сгенерировать необходимые закрытые ключи и сертификаты с помощью инструмента pki из strongSwan, использование которого будет объяснено в одном из следующих разделов.

Сценарий «сеть-сеть»

В этом сценарии два шлюза безопасности moon и sun соединяют две подсети moon-net и sun-net друг с другом через VPN-туннель, установленный между двумя шлюзами:

10.1.0.0/16 -- | 192.168.0.1 | === | 192.168.0.2 | -- 10.2.0.0/16
  moon-net          moon                 sun           sun-net

Конфигурация на шлюзе moon:

/etc/swanctl/x509ca/strongswanCert.pem
/etc/swanctl/x509/moonCert.pem
/etc/swanctl/private/moonKey.pem

/etc/swanctl/swanctl.conf:

    connections {
        net-net {
            remote_addrs = 192.168.0.2

            local {
                auth = pubkey
                certs = moonCert.pem
            }
            remote {
                auth = pubkey
                id = "C=CH, O=strongSwan, CN=sun.strongswan.org"
            }
            children {
                net-net {
                    local_ts  = 10.1.0.0/16
                    remote_ts = 10.2.0.0/16
                    start_action = trap
                }
            }
        }
    }

Конфигурация на шлюзе sun:

/etc/swanctl/x509ca/strongswanCert.pem
/etc/swanctl/x509/sunCert.pem
/etc/swanctl/private/sunKey.pem

/etc/swanctl/swanctl.conf:

    connections {
        net-net {
            remote_addrs = 192.168.0.1

            local {
                auth = pubkey
                certs = sunCert.pem
            }
            remote {
                auth = pubkey
                id = "C=CH, O=strongSwan, CN=moon.strongswan.org"
            }
            children {
                net-net {
                    local_ts  = 10.2.0.0/16
                    remote_ts = 10.1.0.0/16
                    start_action = trap
                }
            }
        }
    }

Используемые в этом сценарии локальная и удалённая идентичности — это subjectDistinguishedNames, содержащиеся в сертификатах конечных объектов. Сертификаты и закрытые ключи загружаются в демон charon с помощью команды

swanctl --load-creds

тогда как

swanctl --load-conns

загружает соединения, определённые в swanctl.conf. При start_action = trap IPsec-соединение автоматически устанавливается при первом IP-пакете с полезной нагрузкой в открытом виде, который должен пройти через туннель.

Сценарий «хост-хост»

Это настройка между двумя отдельными хостами, за которыми нет подсети. Хотя для соединений «хост-хост» было бы достаточно транспортного режима IPsec, мы будем использовать режим туннеля IPsec по умолчанию.

| 192.168.0.1 | === | 192.168.0.2 |
     moon                sun

Конфигурация на хосте moon:

/etc/swanctl/x509ca/strongswanCert.pem
/etc/swanctl/x509/moonCert.pem
/etc/swanctl/private/moonKey.pem

/etc/swanctl/swanctl.conf:

    connections {
        host-host {
            remote_addrs = 192.168.0.2

            local {
                auth=pubkey
                certs = moonCert.pem
            }
            remote {
                auth = pubkey
                id = "C=CH, O=strongSwan, CN=sun.strongswan.org"
            }
            children {
                net-net {
                    start_action = trap
                }
            }
        }
    }

Конфигурация на хосте sun:

/etc/swanctl/x509ca/strongswanCert.pem
/etc/swanctl/x509/sunCert.pem
/etc/swanctl/private/sunKey.pem

/etc/swanctl/swanctl.conf:

    connections {
        host-host {
            remote_addrs = 192.168.0.1

            local {
                auth = pubkey
                certs = sunCert.pem
            }
            remote {
                auth = pubkey
                id = "C=CH, O=strongSwan, CN=moon.strongswan.org"
            }
            children {
                host-host {
                    start_action = trap
                }
            }
        }
    }

Сценарий Roadwarrior

Это очень распространённый случай, когда шлюз strongSwan обслуживает произвольное число удалённых VPN-клиентов, обычно имеющих динамические IP-адреса.

10.1.0.0/16 -- | 192.168.0.1 | === | x.x.x.x |
  moon-net          moon              carol

Конфигурация на шлюзе moon:

/etc/swanctl/x509ca/strongswanCert.pem
/etc/swanctl/x509/moonCert.pem
/etc/swanctl/private/moonKey.pem

/etc/swanctl/swanctl.conf:

    connections {
        rw {
            local {
                auth = pubkey
                certs = moonCert.pem
                id = moon.strongswan.org
            }
            remote {
                auth = pubkey
            }
            children {
                net-net {
                    local_ts  = 10.1.0.0/16
                }
            }
        }
    }

Конфигурация на удалённом клиенте carol:

/etc/swanctl/x509ca/strongswanCert.pem
/etc/swanctl/x509/carolCert.pem
/etc/swanctl/private/carolKey.pem

/etc/swanctl/swanctl.conf:

    connections {
        home {
            remote_addrs = moon.strongswan.org

            local {
                auth = pubkey
                certs = carolCert.pem
                id = [email protected]
            }
            remote {
                auth = pubkey
                id = moon.strongswan.org
            }
            children {
                home {
                    local_ts  = 10.1.0.0/16
                    start_action = start
                }
            }
        }
    }

Для remote_addrs было выбрано имя узла moon.strongswan.org, которое будет разрешено через DNS во время выполнения в соответствующий IP-адрес назначения. В этом сценарии идентичность удалённого клиента carol — это адрес электронной почты [email protected], который должен быть включён как subjectAlternativeName в сертификат удалённого клиента carolCert.pem.

Сценарий Roadwarrior с виртуальным IP-адресом

Клиенты Roadwarrior обычно имеют динамические IP-адреса, назначаемые интернет-провайдером, к которому они в данный момент подключены. Чтобы упростить маршрутизацию от moon-net обратно к клиенту удалённого доступа carol, желательно, чтобы roadwarrior имел внутренний IP-адрес, выбранный из предопределённого пула.

10.1.0.0/16 -- | 192.168.0.1 | === | x.x.x.x | -- 10.3.0.1
  moon-net          moon              carol       virtual IP

Категории