{"id":440410,"date":"2024-11-30T21:01:19","date_gmt":"2024-11-30T21:01:19","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=440410"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=440410","title":{"rendered":"<span>\u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 ipsec strongSwan<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p> \u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u0420\u0430\u0431\u043e\u0442\u0430\u044f DevOps-\u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043e\u043c, \u044f \u0437\u0430\u0434\u0443\u043c\u0430\u043b\u0441\u044f \u043e \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0435 IPsec-\u0442\u0443\u043d\u043d\u0435\u043b\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0443 \u043d\u0430\u0441 \u0443\u0436\u0435 \u043d\u0430\u043a\u043e\u043f\u0438\u043b\u043e\u0441\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. \u041e\u043d\u0438 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0441\u0432\u044f\u0437\u0438 \u043c\u0435\u0436\u0434\u0443 \u043e\u0431\u043b\u0430\u043a\u0430\u043c\u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0440\u0430\u0437\u043d\u0435\u0441\u0435\u043d\u0430 \u2014 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, dev \u0438 prod \u0436\u0438\u0432\u0443\u0442 \u0443 \u0440\u0430\u0437\u043d\u044b\u0445 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0445 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u043e\u0432. \u0422\u0430\u043a\u0436\u0435 \u0435\u0441\u0442\u044c \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u043c\u0438 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f\u043c\u0438, \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u044b Kubernetes \u0432 AWS, GCP \u0438 \u0442.\u0434. \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0446\u0435\u043b\u044c \u2014 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0430\u043b\u0435\u0440\u0442\u044b \u043e \u043f\u0430\u0434\u0435\u043d\u0438\u0438 \u0442\u0443\u043d\u043d\u0435\u043b\u044f \u0440\u0430\u043d\u044c\u0448\u0435, \u0447\u0435\u043c \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0430\u043b\u0435\u0440\u0442\u044b \u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u042d\u0442\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0432\u0430\u0436\u043d\u043e, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 Prometheus \u0443 \u043d\u0430\u0441 \u043e\u0434\u0438\u043d, \u043e\u043d \u0436\u0438\u0432\u0451\u0442 \u0432 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u043e\u0431\u043b\u0430\u043a\u043e\u0432, \u0430 prometheus-stack \u0432 Kubernetes-\u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430\u0445 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u0430\u0433\u0435\u043d\u0442\u043e\u0432.  <\/p>\n<h3>\u041f\u0435\u0440\u0432\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u00a0\u2014 \u0432\u044b\u0431\u043e\u0440 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0435\u0440\u0430 \u0438\u043b\u0438\u00a0\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0432\u043e\u0435\u0433\u043e<\/h3>\n<p>\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043d\u0430\u0442\u043a\u043d\u0443\u043b\u0441\u044f \u043d\u0430 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0435\u0440 \u043e\u0442 <a href=\"https:\/\/github.com\/dennisstritzke\/ipsec_exporter\" rel=\"noopener noreferrer nofollow\">dennisstritzke<\/a>, \u043d\u043e \u043f\u0440\u043e\u0435\u043a\u0442 \u0443\u0436\u0435 \u0430\u0440\u0445\u0438\u0432\u043d\u044b\u0439, \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0440\u0435\u043b\u0438\u0437 \u0434\u0430\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441\u0435\u043d\u0442\u044f\u0431\u0440\u0435\u043c 2021 \u0433\u043e\u0434\u0430, \u0432 README \u0430\u0432\u0442\u043e\u0440 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0441\u0432\u0435\u0436\u0438\u0439 \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0439 <a href=\"https:\/\/github.com\/torilabs\/ipsec-prometheus-exporter\" rel=\"noopener noreferrer nofollow\">\u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0435\u0440<\/a>. \u041e\u0434\u043d\u0430\u043a\u043e \u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 <a href=\"https:\/\/docs.strongswan.org\/docs\/5.9\/plugins\/vici.html\" rel=\"noopener noreferrer nofollow\">VICI<\/a>, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044f \u0441 \u0431\u043e\u043b\u0435\u0435 \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e ipsec.conf \u043d\u0430 swanctl.conf. \u0412 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0435\u0441\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0435 <a href=\"https:\/\/wiki.strongswan.org\/projects\/strongswan\/wiki\/Fromipsecconf\" rel=\"noopener noreferrer nofollow\">\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/a>, \u0438 \u0434\u0430\u0436\u0435 \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 <a href=\"https:\/\/gitlab.com\/Thermi\/ipsec2swanctl\" rel=\"noopener noreferrer nofollow\">\u0441\u043a\u0440\u0438\u043f\u0442-\u043a\u043e\u043d\u0432\u0435\u0440\u0442\u043e\u0440<\/a>. \u041d\u043e \u0437\u0430\u0447\u0435\u043c \u043b\u043e\u043c\u0430\u0442\u044c \u0442\u043e, \u0447\u0442\u043e \u0443\u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043f\u0443\u0441\u0442\u044c \u0434\u0430\u0436\u0435 \u0438 deprecated? \u0412 \u0438\u0442\u043e\u0433\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0441\u0432\u043e\u0439 python \u0441\u043a\u0440\u0438\u043f\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0435\u0440\u0433\u0430\u0435\u0442 ipsec status, \u043f\u0430\u0440\u0441\u0438\u0442 \u0432\u044b\u0432\u043e\u0434 \u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043c\u043d\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0434\u043b\u044f Prometheus.<\/p>\n<p>app.py<\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">#!\/usr\/bin\/env python3  import time import logging import subprocess from prometheus_client import start_http_server, Gauge import re  # \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f logging.basicConfig(     level=logging.INFO,     format=\"%(asctime)s - %(levelname)s - %(message)s\",     handlers=[         logging.StreamHandler()     ] )  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0435\u0442\u0440\u0438\u043a UP_TUNNELS = Gauge('ipsec_up_tunnels', 'Number of active IPsec tunnels') CONNECTING_TUNNELS = Gauge('ipsec_connecting_tunnels', 'Number of connecting IPsec tunnels')   def get_tunnel_metrics():     \"\"\"\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u0442\u0443\u043d\u043d\u0435\u043b\u0435\u0439 StrongSwan \u0447\u0435\u0440\u0435\u0437 ipsec status.\"\"\"     try:         logging.info(\"\u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b `ipsec status` \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0442\u0443\u043d\u043d\u0435\u043b\u0435\u0439.\")          # \u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b ipsec status         result = subprocess.run(             [\"ipsec\", \"status\"],             stdout=subprocess.PIPE,             stderr=subprocess.PIPE,             text=True         )          if result.returncode != 0:             logging.error(f\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b `ipsec status`: {result.stderr.strip()}\")             UP_TUNNELS.set(0)             CONNECTING_TUNNELS.set(0)             return          status_output = result.stdout          if not status_output.strip():             logging.warning(\"\u0412\u044b\u0432\u043e\u0434 \u043a\u043e\u043c\u0430\u043d\u0434\u044b `ipsec status` \u043f\u0443\u0441\u0442\u043e\u0439. \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0432 0.\")             UP_TUNNELS.set(0)             CONNECTING_TUNNELS.set(0)             return          # \u0418\u0449\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0443 \"Security Associations (X up, Y connecting)\"         sa_match = re.search(r\"Security Associations \\((\\d+) up, (\\d+) connecting\\):\", status_output)         if sa_match:             up_tunnels = int(sa_match.group(1))             connecting_tunnels = int(sa_match.group(2))             logging.info(f\"\u0410\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0442\u0443\u043d\u043d\u0435\u043b\u0438 (up): {up_tunnels}, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u0442\u0443\u043d\u043d\u0435\u043b\u0438 (connecting):\"                          f\" {connecting_tunnels}\")         else:             logging.warning(\"\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043d\u0430\u0439\u0442\u0438 \u0441\u0442\u0440\u043e\u043a\u0443 Security Associations. \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0432 0.\")             up_tunnels = 0             connecting_tunnels = 0          # \u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u043c\u0435\u0442\u0440\u0438\u043a\u0438         UP_TUNNELS.set(up_tunnels)         CONNECTING_TUNNELS.set(connecting_tunnels)      except Exception as ee:         logging.exception(f\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0441\u0431\u043e\u0440\u0435 \u043c\u0435\u0442\u0440\u0438\u043a: {ee}\")         UP_TUNNELS.set(0)         CONNECTING_TUNNELS.set(0)   if __name__ == '__main__':     port = 9641     try:         logging.info(f\"\u0417\u0430\u043f\u0443\u0441\u043a IPSec Exporter \u043d\u0430 \u043f\u043e\u0440\u0442\u0443 {port}\")         start_http_server(port)         logging.info(f\"HTTP-\u0441\u0435\u0440\u0432\u0435\u0440 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u043f\u0443\u0449\u0435\u043d \u043d\u0430 \u043f\u043e\u0440\u0442\u0443 {port}\")     except Exception as e:         logging.exception(f\"\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c HTTP-\u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0430 \u043f\u043e\u0440\u0442\u0443 {port}: {e}\")         exit(1)      # \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0446\u0438\u043a\u043b \u043e\u043f\u0440\u043e\u0441\u0430 \u043c\u0435\u0442\u0440\u0438\u043a     while True:         try:             get_tunnel_metrics()         except Exception as e:             logging.exception(f\"\u041d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0446\u0438\u043a\u043b\u0435: {e}\")         time.sleep(5)  # \u041e\u043f\u0440\u043e\u0441 \u043a\u0430\u0436\u0434\u044b\u0435 5 \u0441\u0435\u043a\u0443\u043d\u0434 <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>Dockerfile:<\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>FROM python:3.9-slim  WORKDIR \/usr\/local\/bin  RUN pip install --no-cache-dir prometheus-client RUN apt-get update &amp;&amp; apt-get install -y --no-install-recommends \\     strongswan \\     &amp;&amp; rm -rf \/var\/lib\/apt\/lists\/*  COPY docker\/ipsec-exporter\/app.py . RUN chmod +x app.py EXPOSE 9641   CMD [\"app.py\"]<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>docker-compose.yaml<\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>services:   ipsec_exporter:     image: prometheus_exporters\/ipsec-exporter:latest     restart: unless-stopped     pid: \"host\"     ports:       - \"9641:9641\"     volumes:       - \/var\/run\/starter.charon.pid:\/var\/run\/starter.charon.pid       - \/var\/run\/charon.pid:\/var\/run\/charon.pid       - \/var\/run\/charon.ctl:\/var\/run\/charon.ctl<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0418 \u0432\u0440\u043e\u0434\u0435 \u0432\u0441\u0451 \u0445\u043e\u0440\u043e\u0448\u043e, \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0432 Prometheus \u043f\u0440\u0438\u043b\u0435\u0442\u0430\u044e\u0442, \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u0430\u043b\u0435\u0440\u0442\u044b:<\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>- alert: NoActiveIPSecTunnels     expr: ipsec_up_tunnels == 0     for: 1m     labels:       severity: average     annotations:       summary: \"\u041d\u0435\u0442 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0442\u0443\u043d\u043d\u0435\u043b\u0435\u0439 IPsec\"       description: \"\u0412\u0441\u0435 \u0442\u0443\u043d\u043d\u0435\u043b\u0438 IPsec \u043d\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u044b \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u043c\u0438\u043d\u0443\u0442\u044b.\"    - alert: TooManyConnectingIPSecTunnels     expr: ipsec_connecting_tunnels &gt; 0     for: 30s     labels:       severity: warning     annotations:       summary: \"\u041d\u0435 \u0432\u0441\u0435 ipsec \u0442\u0443\u043d\u043d\u0435\u043b\u0438 \u0432 \u0441\u0442\u0430\u0442\u0443\u0441\u0435 up\"       description: \"\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u0442\u0443\u043d\u043d\u0435\u043b\u0435\u0439 IPsec {{ $value }}.\" <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041d\u043e \u0441\u0430\u043c\u0430 \u0438\u0434\u0435\u044f \u043f\u0440\u043e\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 volumes \u0441\u043e\u043a\u0435\u0442 charon \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043c\u044f\u0433\u043a\u043e \u0433\u043e\u0432\u043e\u0440\u044f \u043d\u0435 \u043e\u0447\u0435\u043d\u044c, \u043f\u043e\u0442\u043e\u043c\u0443 \u043a\u0430\u043a \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b ipsec restart \u043d\u0430 \u0445\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 \u0441\u0432\u044f\u0437\u044c \u0441 \u0441\u043e\u043a\u0435\u0442\u043e\u043c \u043f\u0440\u043e\u043f\u0430\u0434\u0430\u043b\u0430 \u0438 \u043d\u0435 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u043b\u0430\u0441\u044c, \u0447\u0442\u043e \u043b\u043e\u0433\u0438\u0447\u043d\u043e. \u041f\u0440\u0438\u0432\u043e\u0436\u0443 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0438 \u0434\u043b\u044f \u0442\u0435\u0445 \u043a\u0442\u043e \u0437\u0430\u0445\u043e\u0447\u0435\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c \u043d\u0435\u0447\u0442\u043e \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u0446\u0435\u043b\u0435\u0439. \u0414\u043e\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442, \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435, \u043a\u043e\u0441\u0442\u044b\u043b\u044c\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0435 \u0431\u044b\u043b\u043e \u0436\u0435\u043b\u0430\u043d\u0438\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0435\u0440\u0430 \u0431\u044b\u0441\u0442\u0440\u043e \u043e\u0442\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c. \u0420\u0435\u0448\u0438\u043b\u0438 \u0442\u0430\u043a\u0438 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0438 \u0442\u0443\u043d\u043d\u0435\u043b\u0435\u0439 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0435\u0440.<\/p>\n<h3>\u0412\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u00a0\u2014 \u043b\u0430\u043a\u043e\u043d\u0438\u0447\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u043e\u0432 \u0438\u043b\u0438 \u00ab\u0442\u0435\u00a0\u0436\u0435 \u044f\u0439\u0446\u0430, \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u00a0\u043f\u0440\u043e\u0444\u0438\u043b\u044c\u00bb<\/h3>\n<p> \u0414\u043b\u044f \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u0441 <code>ipsec.conf<\/code> \u043d\u0430 <code>swanctl.conf<\/code> \u043f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u044f \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442-\u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440. \u042f \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0435\u0433\u043e \u0432 PyCharm, \u0441\u043e\u0437\u0434\u0430\u043b \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0438 \u0444\u0430\u0439\u043b\u044b. \u0421\u043a\u0440\u0438\u043f\u0442 \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u043b, \u043d\u043e \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u044f \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0433\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430. \u0412\u0438\u0434\u0438\u043c\u043e, \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u0441\u044f \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433 \u043a\u043e\u0434\u0430 \u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0431\u043e\u043b\u0435\u0435 \u0441\u0442\u0430\u0440\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u0439 Python. \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u044d\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0438 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u043e\u0432, \u043d\u043e \u044d\u0442\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0443\u0436 \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u0412 \u0438\u0442\u043e\u0433\u0435 \u0437\u0430 \u043e\u0441\u043d\u043e\u0432\u0443 \u0431\u044b\u043b\u0430 \u0432\u0437\u044f\u0442\u0430 <a href=\"https:\/\/building4.cloud\/posts\/migrating-strongswan-config-from-ipsec-to-swanctl\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0442\u0430\u0442\u044c\u044f<\/a> \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0433\u043e \u043c\u043d\u0435 \u0430\u0432\u0442\u043e\u0440\u0430. \u041f\u0440\u0438\u0432\u043e\u0436\u0443 \u043f\u0440\u0438\u043c\u0435\u0440 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u0441\u0432\u043e\u0438\u0445 \u0441\u0442\u0430\u0440\u044b\u0445 \u043a\u043e\u043d\u0444\u0438\u0433\u043e\u0432 \u0438 \u0442\u043e, \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u043f\u0440\u0438 \u0435\u0433\u043e \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438:<\/p>\n<p>\u0421\u0442\u0430\u0440\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 &#8212; \/etc\/ipsec.conf<\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/summary>\n<div class=\"spoiler__content\">\n<pre><code># ipsec.conf - strongSwan IPsec configuration file  config setup         charondebug=\"all\"         uniqueids=yes         strictcrlpolicy=no  conn tun-to-rogaikopyta         authby=secret         left=%defaultroute         leftid=my_public_ip         leftsubnet=my_subnet         right=remote_public_ip         rightid=remote_public_ip         rightsubnet=remote_subnet         ike=aes256-sha1-modp1024         esp=aes256-sha1-modp1024         keyingtries=1         leftauth=psk         rightauth=psk         keyexchange=ikev1         ikelifetime=24h         lifetime=1h         auto=route  conn tun-to-rogaikopyta-2         also=tun-to-rogaikopyta         leftsubnet=my_subnet         rightsubnet=remote_subnet1  conn tun-to-rogaikopyta-3         also=tun-to-rogaikopyta         leftsubnet=my_subnet         rightsubnet=remote_subnet2  conn tun-to-rogaikopyta-4         also=tun-to-rogaikopyta         leftsubnet=my_subnet         rightsubnet=remote_subnet3  ...<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041d\u043e\u0432\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 &#8212; \/etc\/swanctl\/conf.d\/ipsec.conf<\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>connections {     tun-to-rogaikopyta {         version = 1         local_addrs = my_private_ip         remote_addrs = remote_public_ip         proposals = aes256-sha1-modp1024         keyingtries = 1          local {             auth = psk             id = my_public_ip         }         remote {             auth = psk             id = remote_public_ip         }         children {             tun-to-rogaikopyta-1 {                 mode = tunnel                 local_ts = my_subnet                 remote_ts = remote_subnet1                 start_action = trap                 esp_proposals = aes256-sha1-modp1024             }             tun-to-rogaikopyta-2 {                 mode = tunnel                 local_ts = my_subnet                 remote_ts = remote_subnet2                 start_action = trap                 esp_proposals = aes256-sha1-modp1024             }             tun-to-rogaikopyta-3 {                 mode = tunnel                 local_ts = my_subnet                 remote_ts = remote_subnet3                 start_action = trap                 esp_proposals = aes256-sha1-modp1024            } ...<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041e\u0434\u043d\u0438\u043c \u0438\u0437 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u043d\u0430 \u043d\u043e\u0432\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f ipsec \u0442\u0443\u043d\u043d\u0435\u043b\u0435\u0439 \u043c\u043d\u043e\u0433\u0438\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043b\u0430\u043a\u043e\u043d\u0438\u0447\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u043e\u0432. \u0421 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u044d\u0442\u043e \u043f\u0440\u0430\u0432\u0434\u0430, \u0432\u0435\u0434\u044c \u043c\u044b \u043c\u043e\u0433\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a:<\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>connections {     tun-to-rogaikopyta {         version = 1         local_addrs = my_private_ip         remote_addrs = remote_public_ip         proposals = aes256-sha1-modp1024         keyingtries = 1          local {             auth = psk             id = my_public_ip         }         remote {             auth = psk             id = remote_public_ip         }         children {             tun-to-rogaikopyta-1 {                 mode = tunnel                 local_ts = my_subnet                 remote_ts = remote_subnet1, remote_subnet2, remote_subnet3                 start_action = trap                 esp_proposals = aes256-sha1-modp1024<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0412 \u043c\u043e\u0451\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0431\u044b \u0441\u0438\u043b\u044c\u043d\u043e \u043f\u043e\u043c\u043e\u0433\u043b\u043e, \u043d\u043e \u0435\u0441\u0442\u044c \u043e\u0434\u043d\u043e \u043d\u043e, \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b Cisco ASA. \u041e\u043d\u0430 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438, \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043d\u0435\u0439 \u0443 \u043c\u0435\u043d\u044f \u043d\u0435\u0442. \u0410 \u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0442\u0430\u043c\u043e\u0448\u043d\u0438\u0445 \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043e\u0432 \u043f\u0435\u0440\u0435\u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0442\u0443\u043d\u043d\u0435\u043b\u0438 \u0441 \u0438\u0445 \u0441\u0442\u043e\u0440\u043e\u043d\u044b, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044f \u0433\u043e\u043d\u044e\u0441\u044c \u0437\u0430 \u043b\u0430\u043a\u043e\u043d\u0438\u0447\u043d\u043e\u0441\u0442\u044c\u044e \u0442\u0430\u043a\u043e\u0435 \u0441\u0435\u0431\u0435. \u041d\u043e\u0432\u044b\u0439 \u043a\u043e\u043d\u0444\u0438\u0433 \u0431\u044b\u043b \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u0432 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432 \u043e\u0431\u043b\u0430\u043a\u0435 \u0434\u0432\u0435 \u043c\u0430\u0448\u0438\u043d\u044b, \u0434\u0432\u0435 VPC, \u0434\u0432\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0442.\u0434. \u041f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0432 \u043d\u0435 \u0440\u0430\u0431\u043e\u0447\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0431\u044b\u043b\u043e \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435.<\/p>\n<p><strong>\u0422\u0440\u0435\u0442\u044c\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 &#8212; \u0441\u043a\u0443\u043f\u043e\u0439 README.md \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445<\/strong><\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u043d\u044f\u0442\u0438\u044f \u0442\u0443\u043d\u043d\u0435\u043b\u0435\u0439 \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432, \u0440\u0435\u0448\u0438\u043b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0435\u0440 \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043a\u0430\u043a\u0438\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u043e\u043d \u043e\u0442\u0434\u0430\u0451\u0442. \u0412 README \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043d\u0430 github \u0435\u0441\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0435\u0440\u0430 \u0432 docker:<\/p>\n<pre><code>docker run -it -p 8079:8079 -v $(pwd)\/my-config.yaml:\/config.yaml --rm torilabs\/ipsec-prometheus-exporter:latest<\/code><\/pre>\n<p>\u0423\u0434\u0438\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u044b\u0437\u0432\u0430\u043b\u043e \u0442\u043e, \u0447\u0442\u043e \u043f\u0440\u0438 \u0432\u043d\u0435\u0441\u0435\u043d\u0438\u0438 \u043f\u0440\u0430\u0432\u043e\u043a \u0432 config.yaml \u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043c\u0435\u043d\u044f\u043b\u043e\u0441\u044c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 entrypoint \u043d\u0435 \u0431\u044b\u043b\u043e \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u0439 \u043e config.yaml.<\/p>\n<p>\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0441\u043e\u043a\u0435\u0442 vici \u0432 Ubuntu \u0438\u043c\u0435\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0430\u0434\u0440\u0435\u0441 <code>socket = unix:\/\/var\/run\/charon.vici<\/code>. \u0410 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0435\u0440 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u043f\u043e tcp, \u043b\u0438\u0431\u043e \u043f\u043e udp. \u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0435\u0433\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u043e tcp \u043f\u0440\u0438\u0432\u0451\u043b \u043a\u043e\u043d\u0444\u0438\u0433\u0438 strongswan \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0432\u0438\u0434\u0443:<\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/summary>\n<div class=\"spoiler__content\">\n<pre><code># cat \/etc\/strongswan.d\/charon\/vici.conf vici {      # Whether to load the plugin. Can also be an integer to increase the     # priority of this plugin.     load = yes      # Socket the vici plugin serves clients.     # socket = unix:\/\/var\/run\/charon.vici     socket = tcp:\/\/127.0.0.1:4502  }<\/code><\/pre>\n<pre><code># cat \/etc\/strongswan.d\/swanctl.conf swanctl {      # Plugins to load in swanctl.      # VICI socket to connect to by default.     # socket = unix:\/\/var\/run\/\/charon.vici     socket = tcp:\/\/127.0.0.1:4502  }<\/code><\/pre>\n<pre><code># cat \/etc\/strongswan.conf # strongswan.conf - strongSwan configuration file # # Refer to the strongswan.conf(5) manpage for details # # Configuration changes should be made in the included files  charon {         load_modular = yes         plugins {                 include strongswan.d\/charon\/*.conf                 }  }  include strongswan.d\/*.conf<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a vici \u0442\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 localhost \u0445\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b, \u0431\u0443\u0434\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c docker \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c network_mode: &#171;host&#187;, \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043d\u0444\u0438\u0433 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0435\u0440\u0430 \u0438 docker-compose.yaml \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/summary>\n<div class=\"spoiler__content\">\n<pre><code># cat config.yaml # Logger configuration logging:   level: DEBUG  # HTTP server configuration server:   port: 8079  # Vici configuration vici:   network: \"tcp\"   host: \"127.0.0.1\"   port: 4502<\/code><\/pre>\n<pre><code># cat docker-compose.yml services:   ipsec-exporter:     network_mode: \"host\"     image: torilabs\/ipsec-prometheus-exporter:v0.2.1     command: [\"--config=\/config.yaml\"]     restart: always     volumes:       - .\/config.yaml:\/config.yaml<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 &#8212; <code>curl http:\/\/localhost:8079\/metrics<\/code><\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u0430\u0448\u0431\u043e\u0440\u0434 \u0432 Grafana \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0430\u043b\u043b\u0435\u0440\u0442\u0438\u043d\u0433, \u043d\u043e \u044d\u0442\u043e \u0443\u0436\u0435 \u0442\u0435\u043c\u0430 \u0434\u043b\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438. \u0417\u0430 \u043a\u043e\u0434 \u043d\u0430 python, \u043e\u0440\u0444\u043e\u0433\u0440\u0430\u0444\u0438\u044e, \u043f\u0443\u043d\u043a\u0442\u0443\u0430\u0446\u0438\u044e \u0438 network_mode: &#171;host&#187; \u0432 docker-compose \u043f\u0440\u043e\u0448\u0443 \u0441\u0438\u043b\u044c\u043d\u043e \u043d\u0435 \u043f\u0438\u043d\u0430\u0442\u044c :).<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/862506\/\"> https:\/\/habr.com\/ru\/articles\/862506\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p> \u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u0420\u0430\u0431\u043e\u0442\u0430\u044f DevOps-\u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043e\u043c, \u044f \u0437\u0430\u0434\u0443\u043c\u0430\u043b\u0441\u044f \u043e \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0435 IPsec-\u0442\u0443\u043d\u043d\u0435\u043b\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0443 \u043d\u0430\u0441 \u0443\u0436\u0435 \u043d\u0430\u043a\u043e\u043f\u0438\u043b\u043e\u0441\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. \u041e\u043d\u0438 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u0441\u0432\u044f\u0437\u0438 \u043c\u0435\u0436\u0434\u0443 \u043e\u0431\u043b\u0430\u043a\u0430\u043c\u0438, \u0442\u0430\u043a \u043a\u0430\u043a \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0440\u0430\u0437\u043d\u0435\u0441\u0435\u043d\u0430 \u2014 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, dev \u0438 prod \u0436\u0438\u0432\u0443\u0442 \u0443 \u0440\u0430\u0437\u043d\u044b\u0445 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0445 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u043e\u0432. \u0422\u0430\u043a\u0436\u0435 \u0435\u0441\u0442\u044c \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u043c\u0438 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f\u043c\u0438, \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u044b Kubernetes \u0432 AWS, GCP \u0438 \u0442.\u0434. \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0446\u0435\u043b\u044c \u2014 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0430\u043b\u0435\u0440\u0442\u044b \u043e \u043f\u0430\u0434\u0435\u043d\u0438\u0438 \u0442\u0443\u043d\u043d\u0435\u043b\u044f \u0440\u0430\u043d\u044c\u0448\u0435, \u0447\u0435\u043c \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0430\u043b\u0435\u0440\u0442\u044b \u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u042d\u0442\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0432\u0430\u0436\u043d\u043e, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 Prometheus \u0443 \u043d\u0430\u0441 \u043e\u0434\u0438\u043d, \u043e\u043d \u0436\u0438\u0432\u0451\u0442 \u0432 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u043e\u0431\u043b\u0430\u043a\u043e\u0432, \u0430 prometheus-stack \u0432 Kubernetes-\u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430\u0445 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u0430\u0433\u0435\u043d\u0442\u043e\u0432.  <\/p>\n<h3>\u041f\u0435\u0440\u0432\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u00a0\u2014 \u0432\u044b\u0431\u043e\u0440 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0435\u0440\u0430 \u0438\u043b\u0438\u00a0\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u0432\u043e\u0435\u0433\u043e<\/h3>\n<p>\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043d\u0430\u0442\u043a\u043d\u0443\u043b\u0441\u044f \u043d\u0430 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0435\u0440 \u043e\u0442 <a href=\"https:\/\/github.com\/dennisstritzke\/ipsec_exporter\" rel=\"noopener noreferrer nofollow\">dennisstritzke<\/a>, \u043d\u043e \u043f\u0440\u043e\u0435\u043a\u0442 \u0443\u0436\u0435 \u0430\u0440\u0445\u0438\u0432\u043d\u044b\u0439, \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0440\u0435\u043b\u0438\u0437 \u0434\u0430\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441\u0435\u043d\u0442\u044f\u0431\u0440\u0435\u043c 2021 \u0433\u043e\u0434\u0430, \u0432 README \u0430\u0432\u0442\u043e\u0440 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0441\u0432\u0435\u0436\u0438\u0439 \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0439 <a href=\"https:\/\/github.com\/torilabs\/ipsec-prometheus-exporter\" rel=\"noopener noreferrer nofollow\">\u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0435\u0440<\/a>. \u041e\u0434\u043d\u0430\u043a\u043e \u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 <a href=\"https:\/\/docs.strongswan.org\/docs\/5.9\/plugins\/vici.html\" rel=\"noopener noreferrer nofollow\">VICI<\/a>, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044f \u0441 \u0431\u043e\u043b\u0435\u0435 \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e ipsec.conf \u043d\u0430 swanctl.conf. \u0412 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0435\u0441\u0442\u044c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0435 <a href=\"https:\/\/wiki.strongswan.org\/projects\/strongswan\/wiki\/Fromipsecconf\" rel=\"noopener noreferrer nofollow\">\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/a>, \u0438 \u0434\u0430\u0436\u0435 \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 <a href=\"https:\/\/gitlab.com\/Thermi\/ipsec2swanctl\" rel=\"noopener noreferrer nofollow\">\u0441\u043a\u0440\u0438\u043f\u0442-\u043a\u043e\u043d\u0432\u0435\u0440\u0442\u043e\u0440<\/a>. \u041d\u043e \u0437\u0430\u0447\u0435\u043c \u043b\u043e\u043c\u0430\u0442\u044c \u0442\u043e, \u0447\u0442\u043e \u0443\u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043f\u0443\u0441\u0442\u044c \u0434\u0430\u0436\u0435 \u0438 deprecated? \u0412 \u0438\u0442\u043e\u0433\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0441\u0432\u043e\u0439 python \u0441\u043a\u0440\u0438\u043f\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0435\u0440\u0433\u0430\u0435\u0442 ipsec status, \u043f\u0430\u0440\u0441\u0438\u0442 \u0432\u044b\u0432\u043e\u0434 \u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043c\u043d\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0434\u043b\u044f Prometheus.<\/p>\n<p>app.py<\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"python\">#!\/usr\/bin\/env python3  import time import logging import subprocess from prometheus_client import start_http_server, Gauge import re  # \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f logging.basicConfig(     level=logging.INFO,     format=\"%(asctime)s - %(levelname)s - %(message)s\",     handlers=[         logging.StreamHandler()     ] )  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043c\u0435\u0442\u0440\u0438\u043a UP_TUNNELS = Gauge('ipsec_up_tunnels', 'Number of active IPsec tunnels') CONNECTING_TUNNELS = Gauge('ipsec_connecting_tunnels', 'Number of connecting IPsec tunnels')   def get_tunnel_metrics():     \"\"\"\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u0442\u0443\u043d\u043d\u0435\u043b\u0435\u0439 StrongSwan \u0447\u0435\u0440\u0435\u0437 ipsec status.\"\"\"     try:         logging.info(\"\u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b `ipsec status` \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0442\u0443\u043d\u043d\u0435\u043b\u0435\u0439.\")          # \u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b ipsec status         result = subprocess.run(             [\"ipsec\", \"status\"],             stdout=subprocess.PIPE,             stderr=subprocess.PIPE,             text=True         )          if result.returncode != 0:             logging.error(f\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b `ipsec status`: {result.stderr.strip()}\")             UP_TUNNELS.set(0)             CONNECTING_TUNNELS.set(0)             return          status_output = result.stdout          if not status_output.strip():             logging.warning(\"\u0412\u044b\u0432\u043e\u0434 \u043a\u043e\u043c\u0430\u043d\u0434\u044b `ipsec status` \u043f\u0443\u0441\u0442\u043e\u0439. \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0432 0.\")             UP_TUNNELS.set(0)             CONNECTING_TUNNELS.set(0)             return          # \u0418\u0449\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0443 \"Security Associations (X up, Y connecting)\"         sa_match = re.search(r\"Security Associations \\((\\d+) up, (\\d+) connecting\\):\", status_output)         if sa_match:             up_tunnels = int(sa_match.group(1))             connecting_tunnels = int(sa_match.group(2))             logging.info(f\"\u0410\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0442\u0443\u043d\u043d\u0435\u043b\u0438 (up): {up_tunnels}, \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u0442\u0443\u043d\u043d\u0435\u043b\u0438 (connecting):\"                          f\" {connecting_tunnels}\")         else:             logging.warning(\"\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043d\u0430\u0439\u0442\u0438 \u0441\u0442\u0440\u043e\u043a\u0443 Security Associations. \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0432 0.\")             up_tunnels = 0             connecting_tunnels = 0          # \u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u043c\u0435\u0442\u0440\u0438\u043a\u0438         UP_TUNNELS.set(up_tunnels)         CONNECTING_TUNNELS.set(connecting_tunnels)      except Exception as ee:         logging.exception(f\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0441\u0431\u043e\u0440\u0435 \u043c\u0435\u0442\u0440\u0438\u043a: {ee}\")         UP_TUNNELS.set(0)         CONNECTING_TUNNELS.set(0)   if __name__ == '__main__':     port = 9641     try:         logging.info(f\"\u0417\u0430\u043f\u0443\u0441\u043a IPSec Exporter \u043d\u0430 \u043f\u043e\u0440\u0442\u0443 {port}\")         start_http_server(port)         logging.info(f\"HTTP-\u0441\u0435\u0440\u0432\u0435\u0440 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u043f\u0443\u0449\u0435\u043d \u043d\u0430 \u043f\u043e\u0440\u0442\u0443 {port}\")     except Exception as e:         logging.exception(f\"\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c HTTP-\u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0430 \u043f\u043e\u0440\u0442\u0443 {port}: {e}\")         exit(1)      # \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0446\u0438\u043a\u043b \u043e\u043f\u0440\u043e\u0441\u0430 \u043c\u0435\u0442\u0440\u0438\u043a     while True:         try:             get_tunnel_metrics()         except Exception as e:             logging.exception(f\"\u041d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0446\u0438\u043a\u043b\u0435: {e}\")         time.sleep(5)  # \u041e\u043f\u0440\u043e\u0441 \u043a\u0430\u0436\u0434\u044b\u0435 5 \u0441\u0435\u043a\u0443\u043d\u0434 <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>Dockerfile:<\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>FROM python:3.9-slim  WORKDIR \/usr\/local\/bin  RUN pip install --no-cache-dir prometheus-client RUN apt-get update &amp;&amp; apt-get install -y --no-install-recommends \\     strongswan \\     &amp;&amp; rm -rf \/var\/lib\/apt\/lists\/*  COPY docker\/ipsec-exporter\/app.py . RUN chmod +x app.py EXPOSE 9641   CMD [\"app.py\"]<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>docker-compose.yaml<\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>services:   ipsec_exporter:     image: prometheus_exporters\/ipsec-exporter:latest     restart: unless-stopped     pid: \"host\"     ports:       - \"9641:9641\"     volumes:       - \/var\/run\/starter.charon.pid:\/var\/run\/starter.charon.pid       - \/var\/run\/charon.pid:\/var\/run\/charon.pid       - \/var\/run\/charon.ctl:\/var\/run\/charon.ctl<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0418 \u0432\u0440\u043e\u0434\u0435 \u0432\u0441\u0451 \u0445\u043e\u0440\u043e\u0448\u043e, \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0432 Prometheus \u043f\u0440\u0438\u043b\u0435\u0442\u0430\u044e\u0442, \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u0430\u043b\u0435\u0440\u0442\u044b:<\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>- alert: NoActiveIPSecTunnels     expr: ipsec_up_tunnels == 0     for: 1m     labels:       severity: average     annotations:       summary: \"\u041d\u0435\u0442 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0442\u0443\u043d\u043d\u0435\u043b\u0435\u0439 IPsec\"       description: \"\u0412\u0441\u0435 \u0442\u0443\u043d\u043d\u0435\u043b\u0438 IPsec \u043d\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u044b \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u043c\u0438\u043d\u0443\u0442\u044b.\"    - alert: TooManyConnectingIPSecTunnels     expr: ipsec_connecting_tunnels &gt; 0     for: 30s     labels:       severity: warning     annotations:       summary: \"\u041d\u0435 \u0432\u0441\u0435 ipsec \u0442\u0443\u043d\u043d\u0435\u043b\u0438 \u0432 \u0441\u0442\u0430\u0442\u0443\u0441\u0435 up\"       description: \"\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0438\u0445\u0441\u044f \u0442\u0443\u043d\u043d\u0435\u043b\u0435\u0439 IPsec {{ $value }}.\" <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041d\u043e \u0441\u0430\u043c\u0430 \u0438\u0434\u0435\u044f \u043f\u0440\u043e\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 volumes \u0441\u043e\u043a\u0435\u0442 charon \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043c\u044f\u0433\u043a\u043e \u0433\u043e\u0432\u043e\u0440\u044f \u043d\u0435 \u043e\u0447\u0435\u043d\u044c, \u043f\u043e\u0442\u043e\u043c\u0443 \u043a\u0430\u043a \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b ipsec restart \u043d\u0430 \u0445\u043e\u0441\u0442\u043e\u0432\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 \u0441\u0432\u044f\u0437\u044c \u0441 \u0441\u043e\u043a\u0435\u0442\u043e\u043c \u043f\u0440\u043e\u043f\u0430\u0434\u0430\u043b\u0430 \u0438 \u043d\u0435 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u043b\u0430\u0441\u044c, \u0447\u0442\u043e \u043b\u043e\u0433\u0438\u0447\u043d\u043e. \u041f\u0440\u0438\u0432\u043e\u0436\u0443 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0438 \u0434\u043b\u044f \u0442\u0435\u0445 \u043a\u0442\u043e \u0437\u0430\u0445\u043e\u0447\u0435\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c \u043d\u0435\u0447\u0442\u043e \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u0446\u0435\u043b\u0435\u0439. \u0414\u043e\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442, \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435, \u043a\u043e\u0441\u0442\u044b\u043b\u044c\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043d\u0435 \u0431\u044b\u043b\u043e \u0436\u0435\u043b\u0430\u043d\u0438\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0435\u0440\u0430 \u0431\u044b\u0441\u0442\u0440\u043e \u043e\u0442\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c. \u0420\u0435\u0448\u0438\u043b\u0438 \u0442\u0430\u043a\u0438 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0438 \u0442\u0443\u043d\u043d\u0435\u043b\u0435\u0439 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0435\u0440.<\/p>\n<h3>\u0412\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u00a0\u2014 \u043b\u0430\u043a\u043e\u043d\u0438\u0447\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u043e\u0432 \u0438\u043b\u0438 \u00ab\u0442\u0435\u00a0\u0436\u0435 \u044f\u0439\u0446\u0430, \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u00a0\u043f\u0440\u043e\u0444\u0438\u043b\u044c\u00bb<\/h3>\n<p> \u0414\u043b\u044f \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u0441 <code>ipsec.conf<\/code> \u043d\u0430 <code>swanctl.conf<\/code> \u043f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u044f \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442-\u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0435\u0440. \u042f \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u0435\u0433\u043e \u0432 PyCharm, \u0441\u043e\u0437\u0434\u0430\u043b \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0438 \u0444\u0430\u0439\u043b\u044b. \u0421\u043a\u0440\u0438\u043f\u0442 \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u043b, \u043d\u043e \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u044f \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0433\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430. \u0412\u0438\u0434\u0438\u043c\u043e, \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u0441\u044f \u0440\u0435\u0444\u0430\u043a\u0442\u043e\u0440\u0438\u043d\u0433 \u043a\u043e\u0434\u0430 \u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0431\u043e\u043b\u0435\u0435 \u0441\u0442\u0430\u0440\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u0439 Python. \u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0441\u0430\u043c\u044b\u0439 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u044d\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0438 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u043e\u0432, \u043d\u043e \u044d\u0442\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0443\u0436 \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u0412 \u0438\u0442\u043e\u0433\u0435 \u0437\u0430 \u043e\u0441\u043d\u043e\u0432\u0443 \u0431\u044b\u043b\u0430 \u0432\u0437\u044f\u0442\u0430 <a href=\"https:\/\/building4.cloud\/posts\/migrating-strongswan-config-from-ipsec-to-swanctl\/\" rel=\"noopener noreferrer nofollow\">\u0441\u0442\u0430\u0442\u044c\u044f<\/a> \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0433\u043e \u043c\u043d\u0435 \u0430\u0432\u0442\u043e\u0440\u0430. \u041f\u0440\u0438\u0432\u043e\u0436\u0443 \u043f\u0440\u0438\u043c\u0435\u0440 \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437 \u0441\u0432\u043e\u0438\u0445 \u0441\u0442\u0430\u0440\u044b\u0445 \u043a\u043e\u043d\u0444\u0438\u0433\u043e\u0432 \u0438 \u0442\u043e, \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u043f\u0440\u0438 \u0435\u0433\u043e \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438:<\/p>\n<p>\u0421\u0442\u0430\u0440\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 &#8212; \/etc\/ipsec.conf<\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/summary>\n<div class=\"spoiler__content\">\n<pre><code># ipsec.conf - strongSwan IPsec configuration file  config setup         charondebug=\"all\"         uniqueids=yes         strictcrlpolicy=no  conn tun-to-rogaikopyta         authby=secret         left=%defaultroute         leftid=my_public_ip         leftsubnet=my_subnet         right=remote_public_ip         rightid=remote_public_ip         rightsubnet=remote_subnet         ike=aes256-sha1-modp1024         esp=aes256-sha1-modp1024         keyingtries=1         leftauth=psk         rightauth=psk         keyexchange=ikev1         ikelifetime=24h         lifetime=1h         auto=route  conn tun-to-rogaikopyta-2         also=tun-to-rogaikopyta         leftsubnet=my_subnet         rightsubnet=remote_subnet1  conn tun-to-rogaikopyta-3         also=tun-to-rogaikopyta         leftsubnet=my_subnet         rightsubnet=remote_subnet2  conn tun-to-rogaikopyta-4         also=tun-to-rogaikopyta         leftsubnet=my_subnet         rightsubnet=remote_subnet3  ...<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041d\u043e\u0432\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 &#8212; \/etc\/swanctl\/conf.d\/ipsec.conf<\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>connections {     tun-to-rogaikopyta {         version = 1         local_addrs = my_private_ip         remote_addrs = remote_public_ip         proposals = aes256-sha1-modp1024         keyingtries = 1          local {             auth = psk             id = my_public_ip         }         remote {             auth = psk             id = remote_public_ip         }         children {             tun-to-rogaikopyta-1 {                 mode = tunnel                 local_ts = my_subnet                 remote_ts = remote_subnet1                 start_action = trap                 esp_proposals = aes256-sha1-modp1024             }             tun-to-rogaikopyta-2 {                 mode = tunnel                 local_ts = my_subnet                 remote_ts = remote_subnet2                 start_action = trap                 esp_proposals = aes256-sha1-modp1024             }             tun-to-rogaikopyta-3 {                 mode = tunnel                 local_ts = my_subnet                 remote_ts = remote_subnet3                 start_action = trap                 esp_proposals = aes256-sha1-modp1024            } ...<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u041e\u0434\u043d\u0438\u043c \u0438\u0437 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u043d\u0430 \u043d\u043e\u0432\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f ipsec \u0442\u0443\u043d\u043d\u0435\u043b\u0435\u0439 \u043c\u043d\u043e\u0433\u0438\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043b\u0430\u043a\u043e\u043d\u0438\u0447\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u043e\u0432. \u0421 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u044d\u0442\u043e \u043f\u0440\u0430\u0432\u0434\u0430, \u0432\u0435\u0434\u044c \u043c\u044b \u043c\u043e\u0433\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a:<\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u043a\u0440\u044b\u0442\u044b\u0439 \u0442\u0435\u043a\u0441\u0442<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>connections {     tun-to-rogaikopyta {         version = 1         local_addrs = my_private_ip         remote_addrs = remote_public_ip         proposals = aes256-sha1-modp1024         keyingtries = 1          local {             auth = psk             id = my_public_ip         }         remote {             auth = psk             id = remote_public_ip         }         children {             tun-to-rogaikopyta-1 {                 mode = tunnel                 local_ts = my_subnet                 remote_ts = remote_subnet1, remote_subnet2, remote_subnet3                 start_action = trap                 esp_proposals = aes256-sha1-modp1024<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0412 \u043c\u043e\u0451\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0431\u044b \u0441\u0438\u043b\u044c\u043d\u043e \u043f\u043e\u043c\u043e\u0433\u043b\u043e, \u043d\u043e \u0435\u0441\u0442\u044c \u043e\u0434\u043d\u043e \u043d\u043e, \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b Cisco ASA. \u041e\u043d\u0430 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0435\u0439 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438, \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043d\u0435\u0439 \u0443 \u043c\u0435\u043d\u044f <\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-440410","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/440410","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=440410"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/440410\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=440410"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=440410"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=440410"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}