ฉันมี StrongSwan VPN ซึ่งด้วยเหตุผลบางอย่างที่ฉันไม่สามารถเชื่อมต่อผู้ใช้ iOS กับเซิร์ฟเวอร์ VPN ของฉันได้
บันทึกสั้นๆ สองสามข้อ:
เซิร์ฟเวอร์ StrongSwan ของฉันอยู่ด้านหน้าสำหรับลูกค้า VPN ที่เชื่อมต่อกับเครือข่ายของฉัน ฉันใช้ ไวร์การ์ด
สำหรับการกำหนดเส้นทางไซต์ต่อไซต์แบ็กเอนด์ของฉัน
ผู้ใช้ StrongSwan VPN ทั้งหมดได้รับการตรวจสอบกับ FreeRadius
เซิร์ฟเวอร์
ลูกค้า StrongSwan ถูกกำหนด IP บน 192.168.201.0/24
ซับเน็ตในขณะที่ WireGuard backbone net กำลังทำงานอยู่บน 192.168.200.0/24
เครือข่ายย่อย
ลูกค้าทั้งหมดจะได้รับที่อยู่ IPv6 สาธารณะที่เป็นของซับเน็ต /48 ที่มอบหมายให้ฉันด้วย
ฉันเรียกใช้ StrongSwan บน Ubuntu 20.04 และไฟล์กำหนดค่าของฉันอยู่ในไฟล์ /etc/swanctl/config/
โฟลเดอร์และรวมอยู่ในค่าเริ่มต้นเนื่องจากชื่อไฟล์ลงท้ายด้วย .conf
.
เนื้อหามีดังนี้:
# การตั้งค่าเซิร์ฟเวอร์ VPN เริ่มต้นสำหรับการเชื่อมต่อทั้งหมด
ค่าเริ่มต้น conn {
local_addrs = PUBLIC_IPV4, PUBLIC_IPV6
ท้องถิ่น {
auth = คีย์ Pub
ใบรับรอง = vpn-ecdsa.cer
id = vpn.example.com
}
รุ่น = 2
send_certreq = ไม่
send_cert = เสมอ
ไม่ซ้ำ = ไม่เคย
การกระจายตัว = ใช่
ห่อหุ้ม = ใช่
dpd_delay = 60 วินาที
rekey_time = 0 วินาที
}
# วิธีการเข้าสู่ระบบเริ่มต้น
ค่าเริ่มต้น eap {
ระยะไกล {
auth = eap-รัศมี
id = % ใดๆ
eap_id = % ใดๆ
}
}
การเชื่อมต่อ
{
# การกำหนดค่า Android ทั่วไปที่ขยายเพิ่มเติมลงไป
#
# ทำงานร่วมกับไคลเอนต์ StrongSwan VPN สำหรับ Android
conn-unix : conn-defaults, eap-defaults {
เด็ก {
สุทธิ {
local_ts = 0.0.0.0/0, ::/0
}
net-unix : ค่าเริ่มต้นของเด็ก {
}
esp_proposals = aes128gcm128-x25519
}
ข้อเสนอ = aes128-sha256-x25519
}
# ไคลเอนต์ Windows ทั้งหมดตรงกับกฎนี้ในการตรวจสอบชื่อผู้ใช้
# ทำโดย 'eap_start = ใช่' ใน strongswan.conf
#
# ทำงานร่วมกับไคลเอนต์ VPN ในตัว Windows 10
หน้าต่าง conn: conn-defaults, eap-defaults {
เด็ก {
สุทธิ {
local_ts = 0.0.0.0/0, ::/0
}
esp_proposals = aes256-sha256-prfsha256-modp1024
}
ข้อเสนอ = aes256-sha256-prfsha256-modp1024
พูล = IkeVPN-site-ipv4, IkeVPN-site-ipv6
}
# การกำหนดค่าที่คล้ายกันมากกับไคลเอนต์ Windows
# การกำหนดค่า ยกเว้น iOS ใช้คีย์ 2048 บิต
# ในขณะที่ Windows ใช้คีย์ 1024 บิต
#
# ใช้งานไม่ได้ในสถานะปัจจุบัน
conn-ios : conn-defaults, eap-defaults {
เด็ก {
สุทธิ {
local_ts = 0.0.0.0/0, ::/0
}
esp_proposals = aes256-sha2_256
พูล = IkeVPN-site-ipv4, IkeVPN-site-ipv6
}
ข้อเสนอ = aes256-sha256-prfsha256-modp2048
}
# ผู้ใช้ Android จับคู่กับการเชื่อมต่อนี้ตามที่เป็นอยู่
# เรียกใช้แอพไคลเอนต์ StrongSwan VPN ชื่อผู้ใช้ถูกส่งผ่านใน
# ฟิลด์ 'id' ไปยังเซิร์ฟเวอร์ StrongSwan VPN
conn-unix-site : connections.conn-unix {
ระยะไกล {
id = *@site.example.com
}
พูล = IkeVPN-site-ipv4, IkeVPN-site-ipv6
}
}
สระว่ายน้ำ
{
IkeVPN-ไซต์-ipv4 {
แอดเดรส = 192.168.201.0/24
DNS = 192.168.200.1
}
IkeVPN-ไซต์-ipv6 {
addrs = 2001:db8:cafe::/97
DNS = 2001:db8::1
}
}
การกำหนดค่าของฉันถูกสร้างขึ้นโดยใช้โครงสร้างที่กำหนดจากหน้าเว็บต่อไปนี้:
https://wiki.strongswan.org/projects/strongswan/wiki/Strongswanconf#Referencing-other-Sections
เหตุผลที่ฉันใช้มันเนื่องจากการหลีกเลี่ยงการตั้งค่าการกำหนดค่าเดียวกันซ้ำในโปรไฟล์การเชื่อมต่อทั้งหมดของฉัน
หากคุณไม่คุ้นเคยกับการตั้งค่านี้ การกำหนดค่าต่อไปนี้สำหรับ เชื่อมต่อ-ios
สิ่งนี้ควรถือว่าเทียบเท่า:
เชื่อมต่อ iOS {
# ได้รับจาก conn-default
local_addrs = PUBLIC_IPV4, PUBLIC_IPV6
ท้องถิ่น {
auth = คีย์ Pub
ใบรับรอง = vpn-ecdsa.cer
id = vpn.example.com
}
รุ่น = 2
send_certreq = ไม่
send_cert = เสมอ
ไม่ซ้ำ = ไม่เคย
การกระจายตัว = ใช่
ห่อหุ้ม = ใช่
dpd_delay = 60 วินาที
rekey_time = 0 วินาที
# ได้รับจาก eap-defaults
ระยะไกล {
auth = eap-รัศมี
id = % ใดๆ
eap_id = % ใดๆ
}
# ดึงมาจากโปรไฟล์ conn-ios ดั้งเดิมด้านบน
เด็ก {
สุทธิ {
local_ts = 0.0.0.0/0, ::/0
}
esp_proposals = aes256-sha2_256
พูล = IkeVPN-site-ipv4, IkeVPN-site-ipv6
}
ข้อเสนอ = aes256-sha256-prfsha256-modp2048
}
ใบรับรองเซิร์ฟเวอร์ที่แสดงอยู่ใน Conn-ค่าเริ่มต้น
ส่วนคือใบรับรอง ECDSA ที่ได้รับจาก Let's Encrypt โดยใช้ Acme.sh
ค่าการเข้ารหัสสำหรับ ข้อเสนอ
และ esp_proposals
ในการกำหนดค่า iOS นำมาจากคำใบ้ใน: https://wiki.strongswan.org/projects/strongswan/wiki/AppleClients.
เมื่อทดสอบการรวมกันของ Android หรือ Windows ผู้ใช้จะเชื่อมต่อโดยไม่มีปัญหาใด ๆ แต่เมื่อมีคนพยายามเข้าสู่ระบบโดยใช้ iPhone การเชื่อมต่อก็จะหยุดลง
เอาต์พุตจากบันทึกเมื่อ iPhone พยายามเชื่อมต่อมีดังนี้:
10[IKE] CLIENT_IPV4 กำลังเริ่มต้น IKE_SA
10[CFG] received proposals: IKE:AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_2048, IKE:AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/ECP_256, IKE:AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_1536, IKE:AES_CBC_128/HMAC_SHA1_96/PRF_HMAC_SHA1/MODP_1024, IKE:3DES_CBC /HMAC_SHA1_96/PRF_HMAC_SHA1/MODP_1024
10[CFG] ข้อเสนอที่กำหนดค่า: IKE:AES_CBC_128/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/CURVE_25519
10[IKE] ไม่พบข้อเสนอที่ตรงกัน ลองกำหนดค่าอื่น
10[CFG] received proposals: IKE:AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_2048, IKE:AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/ECP_256, IKE:AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_1536, IKE:AES_CBC_128/HMAC_SHA1_96/PRF_HMAC_SHA1/MODP_1024, IKE:3DES_CBC /HMAC_SHA1_96/PRF_HMAC_SHA1/MODP_1024
10[CFG] ข้อเสนอที่กำหนดค่า: IKE:AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_1024
10[IKE] ไม่พบข้อเสนอที่ตรงกัน ลองกำหนดค่าอื่น
10[CFG] ข้อเสนอที่เลือก: IKE:AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_2048
โฮสต์ระยะไกล 10 [IKE] อยู่หลัง NAT
10[ENC] กำลังสร้างการตอบสนอง IKE_SA_INIT 0 [ SA KE ไม่ใช่ N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) N(CHDLESS_SUP) N(MULT_AUTH) ]
10[NET] ส่งแพ็คเก็ต: จาก PUBLIC_IPV4[500] ถึง CLIENT_IPV4[6452] (456 ไบต์)
06[NET] ได้รับแพ็กเก็ต: จาก CLIENT_IPV4[13549] ถึง PUBLIC_IPV4[4500] (512 ไบต์)
06[ENC] ประเภทแอตทริบิวต์ที่ไม่รู้จัก INTERNAL_DNS_DOMAIN
06[ENC] แยกวิเคราะห์คำขอ IKE_AUTH 1 [ IDi N(INIT_CONTACT) IDr CPRQ(ADDR MASK DHCP DNS ADDR6 DHCP6 DNS6 DOMAIN) N(ESP_TFC_PAD_N) N(NON_FIRST_FRAG) SA TSi TSr N(MOBIKE_SUP) ]
06[CFG] กำลังมองหาการกำหนดค่าเพียร์ที่ตรงกับ PUBLIC_IPV4[vpn.example.com]...CLIENT_IPV4[PRIVATE_CLASS_A_ADDRESS]
06[CFG] เลือกการกำหนดค่าเพียร์ 'conn-ios'
06[IKE] เริ่มต้นเมธอด EAP_IDENTITY (id 0x00)
06[IKE] ได้รับ ESP_TFC_PADDING_NOT_SUPPORTED ไม่ได้ใช้การเติม ESPv3 TFC
06[IKE] เพียร์รองรับ MOBIKE
การรับรองความถูกต้อง 06 [IKE] ของ 'vpn.example.com' (ตัวฉันเอง) ด้วยลายเซ็น ECDSA-256 สำเร็จ
06[IKE] กำลังส่งใบรับรองเอนทิตีปลายทาง "CN=vpn.example.com"
06[IKE] ส่งใบรับรองผู้ออก "C=US, O=Let's Encrypt, CN=R3"
06[ENC] กำลังสร้างการตอบสนอง IKE_AUTH 1 [ IDr CERT CERT AUTH EAP/REQ/ID ]
06[ENC] แยกข้อความ IKE (2816 ไบต์) ออกเป็น 3 ส่วน
06[ENC] กำลังสร้างการตอบสนอง IKE_AUTH 1 [ EF(1/3) ]
06[ENC] กำลังสร้างการตอบสนอง IKE_AUTH 1 [ EF(2/3) ]
06[ENC] กำลังสร้างการตอบสนอง IKE_AUTH 1 [ EF(3/3) ]
06[NET] ส่งแพ็คเก็ต: จาก PUBLIC_IPV4[4500] ถึง CLIENT_IPV4[13549] (1236 ไบต์)
06[NET] ส่งแพ็คเก็ต: จาก PUBLIC_IPV4[4500] ถึง CLIENT_IPV4[13549] (1236 ไบต์)
06[NET] กำลังส่งแพ็คเก็ต: จาก PUBLIC_IPV4[4500] ถึง CLIENT_IPV4[13549] (500 ไบต์)
11[JOB] กำลังลบ IKE_SA ที่เปิดอยู่ครึ่งหนึ่งด้วย CLIENT_IPV4 หลังจากหมดเวลา
ผู้ใช้ iPhone กำลังเชื่อมต่อโดยใช้ไคลเอนต์ VPN ในตัวโดยใช้การตั้งค่าต่อไปนี้:
พิมพ์ IKEv2
คำอธิบาย: เซิร์ฟเวอร์ VPN
เซิร์ฟเวอร์: vpn.example.com
รหัสระยะไกล: vpn.example.com
รหัสท้องถิ่น: BLANK
การตรวจสอบชื่อผู้ใช้และรหัสผ่าน
ชื่อผู้ใช้: [email protected]
รหัสผ่าน: ItIsASSecret
มีใครรู้บ้างว่าทำไมการเชื่อมต่อถึงหยุดสำหรับผู้ใช้ iOS เมื่อโหลดไฟล์ เชื่อมต่อ-ios
ข้อมูลส่วนตัว?
อัปเดต
และเราก็ได้ออกเดินทาง! :-)
ตามคำแนะนำจาก @ecdsa ฉันได้เปลี่ยนใบรับรองเป็นใบรับรอง RSA 2048 บิต
เซิร์ฟเวอร์ Radius ของฉันถูกเรียก การตรวจสอบผู้ใช้สำเร็จและไคลเอนต์ได้รับการกำหนดที่อยู่ IP ผมมีความสุข. :-)
การกำหนดค่าของฉันสำหรับ เชื่อมต่อ-ios
ตอนนี้:
conn-ios : conn-defaults, eap-defaults {
# แทนที่ค่าเริ่มต้นจาก 'conn-default'
ท้องถิ่น {
auth = คีย์ Pub
ใบรับรอง = vpn-rsa.cer
id = vpn.example.com
}
เด็ก {
สุทธิ {
local_ts = 0.0.0.0/0, ::/0
}
esp_proposals = aes256-sha256
}
พูล = IkeVPN-site-ipv4, IkeVPN-site-ipv6
ข้อเสนอ = aes256-sha256-prfsha256-modp2048
}
ทุกอย่างเป็นไปตามที่เป็นจากการกำหนดค่าเริ่มต้นของฉัน