WireGuard و OpenVPN تنها انتخاب‌ها نیستند. در IPsec، دو طرف ابتدا دربارهٔ هویت و حفاظت توافق می‌کنند و سپس جریان مشخصی را محافظت می‌کنند. امشب با strongSwan یک آزمایش دو-host می‌سازیم و IKE SA را از CHILD SA جدا می‌خوانیم.

این جلسه بخشی از دورهٔ لینوکس ۳۰۳ در ۴۰ شب است.

محیط تمرین: دو Ubuntu 24.04 Clone؛ strongswan-swanctl و charon-systemd سری 5.9؛ بدون daemon starter هم‌زمان.

جایگاه در دوره: هدف‌های 334.4 آزمون 303-300.

مذاکره و حمل داده#

IKEv2 کلید و هویت و پارامترهای نشست را هماهنگ می‌کند. ESP حفاظت ترافیک IP را بر عهده دارد. IKE SA برای گفتگو و CHILD SA برای ترافیک محافظت‌شده‌اند؛ داشتن اولی الزاماً اثبات عبور داده نیست. در حالت tunnel یک بستهٔ IP داخلی حمل می‌شود؛ transport طراحی دیگری دارد. L2TP به‌تنهایی سازوکار رمزنگاری معادل IPsec نیست.

سرور بیرونی 192.168.56.10 و client بیرونی 192.168.56.20 هستند. برای آزمایش داخلی، روی lo سرور 10.31.0.1/32 و روی lo کلاینت 10.31.0.2/32 اضافه کن. فقط همین دو آدرس در traffic selector قرار می‌گیرند.

sudo apt install strongswan-swanctl charon-systemd
openssl rand -hex 32

فرمان دوم را یک بار در محیط خصوصی اجرا و راز تصادفی را امن به دو VM برسان. PSK آزمایش، راز واقعی سازمان نیست؛ برای طرح سازمانی، احراز هویت گواهی و چرخهٔ ابطال را هم ارزیابی کن.

پیکربندی سمت srv#

روی Clone تازه، فایل /etc/swanctl/swanctl.conf را با مالک root و مجوز 600 بساز. placeholder راز را پیش از اجرا با مقدار مشترک واقعی lab عوض کن:

connections {
  lab {
    version = 2
    local_addrs = 192.168.56.10
    remote_addrs = 192.168.56.20
    local {
      auth = psk
      id = srv.example.test
    }
    remote {
      auth = psk
      id = client.example.test
    }
    children {
      lab-net {
        local_ts = 10.31.0.1/32
        remote_ts = 10.31.0.2/32
      }
    }
  }
}
secrets {
  ike-lab {
    id-1 = srv.example.test
    id-2 = client.example.test
    secret = "REPLACE_WITH_SHARED_RANDOM_LAB_SECRET"
  }
}

سمت client باید local/remote address، id و selectorها جابه‌جا شوند؛ نام child یکسان می‌ماند. راز مشترک در هر دو طرف یکسان است. assignmentها در نحو strongSwan در خط‌های مستقل نوشته شده‌اند؛ syntax فایل را با قالب‌های INI دیگر مخلوط نکن.

روی هر دو طرف، daemon strongswan را start و config را load کن:

sudo swanctl --load-all
sudo swanctl --list-conns

از client:

sudo swanctl --initiate --child lab-net
sudo swanctl --list-sas
ping -I 10.31.0.2 10.31.0.1
sudo ip xfrm policy
sudo ip xfrm state

نام unit نصب‌شده را از بستهٔ charon-systemd تأیید کن. در فایروال، UDP/500، UDP/4500 و در مسیر بدون encapsulation پروتکل ESP باید متناسب با peerها مجاز باشند. فایل strongswan.conf و پوشهٔ strongswan.d تنظیم daemon را دارند؛ connectionهای این درس با swanctl مدیریت می‌شوند، نه racoon قدیمی جزوه.

آزمون و برگشت#

باید IKE و CHILD SA فعال، selector درست و counter ترافیک افزاینده داشته باشی. IP عمومی‌نما را ping کردن، اثبات عبور داخل IPsec نیست؛ مبدأ داخلی را صریح انتخاب کرده‌ایم. ID یا PSK غلط باید مذاکره را رد کند. ip xfrm state می‌تواند دادهٔ حساس کلید داشته باشد؛ خروجی خام را عمومی نکن.

برای پایان، child آزمایشی را با swanctl --terminate --child lab-net متوقف، آدرس‌های lo افزوده‌شده را حذف و Clone را برگردان. مرجع syntax: swanctl.conf و راهنمای quickstart .