Перейти к содержанию

ГОСТ IKEv2 с PSK: пошаговая настройка двух узлов

PSK подходит для первого соединения и закрытых тестовых стендов. Для организационного использования обычно удобнее индивидуальные X.509-сертификаты, их сроки действия, CRL и централизованное управление. Ниже только системный RPM; предварительно выполните установку, сеть, firewall, службу.

1. Создать общий случайный PSK на узле А

umask 077
openssl rand -hex 32 > /root/niceos-ike-psk.hex
chmod 600 /root/niceos-ike-psk.hex
wc -c /root/niceos-ike-psk.hex   # 65 байт, включая перевод строки

Не копируйте секрет в терминальную историю/чат. Передайте файл на узел Б по защищённому SSH-каналу с проверенным ключом хоста:

scp -p /root/niceos-ike-psk.hex root@192.168.10.26:/root/niceos-ike-psk.hex

На узле Б: chmod 600 /root/niceos-ike-psk.hex. При другой системе доставки используйте корпоративный секрет-хранилище.

2. Создать зеркальный профиль на каждом узле

Следующий блок выполняется на каждой VM отдельно. Он не опирается на hostname -s — в некоторых системах оно возвращает localhost.

bash <<'SH'
set -euo pipefail
umask 077
IP=$(ip -4 -o addr show dev eth0 | awk 'NR==1{split($4,a,"/");print a[1]}')
case "$IP" in
  192.168.10.15) PEER=192.168.10.26; ME=left; HIM=right; LTS=10.200.1.1; RTS=10.200.2.1 ;;
  192.168.10.26) PEER=192.168.10.15; ME=right; HIM=left; LTS=10.200.2.1; RTS=10.200.1.1 ;;
  *) echo 'STOP: неизвестный IP узла'; exit 1 ;;
esac
FILE=/etc/swanctl/conf.d/niceos-gost-psk.conf
test ! -e "$FILE" || { echo "STOP: $FILE уже существует"; exit 1; }
test -f /root/niceos-ike-psk.hex
PSK=$(tr -d '\n\r' </root/niceos-ike-psk.hex)
[[ "$PSK" =~ ^[0-9a-fA-F]{64}$ ]] || { echo 'STOP: PSK некорректен'; exit 1; }
cat > "$FILE" <<EOF
connections {
  gost {
    version = 2
    local_addrs = $IP
    remote_addrs = $PEER
    proposals = kuznyechikmgmktree-prfstreebog512-gost512
    encap = yes
    mobike = no
    fragmentation = yes
    reauth_time = 0
    rekey_time = 1h
    dpd_delay = 30s
    local { auth = psk; id = @niceos-$ME }
    remote { auth = psk; id = @niceos-$HIM }
    children {
      gost {
        local_ts = $LTS/32
        remote_ts = $RTS/32
        esp_proposals = kuznyechikmgmktree-gost512
        start_action = none
        close_action = none
        dpd_action = clear
        rekey_time = 30m
        life_time = 40m
      }
    }
  }
}
secrets {
  ike-gost {
    id-1 = @niceos-left
    id-2 = @niceos-right
    secret = 0x$PSK
  }
}
EOF
chmod 600 "$FILE"
echo 'PASS: профиль создан; содержимое с PSK не выводить'
SH

Убедитесь, что исходный /etc/swanctl/swanctl.conf содержит include conf.d/*.conf. Не держите одновременно ещё один профиль gost с тем же именем.

3. Загрузить и запустить

На обеих VM:

swanctl --load-conns
swanctl --load-creds
swanctl --list-conns

На узле А:

swanctl --initiate --child gost
swanctl --list-sas

После появления ipsec0 настройте маршруты по инструкции, затем проверьте:

ip route get 10.200.2.1
ping -c 30 10.200.2.1
swanctl --list-sas

На узле Б:

ip route get 10.200.1.1
ping -c 30 10.200.1.1

Не используйте ping -I, не проверив его поддержку: утилита ping в испытанном образе не принимает этот ключ. Исходный IP для защищённой сети выбирает маршрут с src.

4. Завершение и PSK → X.509

swanctl --terminate --ike gost

Для миграции подготовьте X.509 на обоих узлах, затем удалите только PSK-файл из conf.d, переместите его в закрытую резервную директорию, выполните swanctl --load-conns и swanctl --load-creds --clear. До удаления ключей проверьте восстановление X.509. Детали в миграции.