Score:2

ผู้ใช้ iPhone ไม่เชื่อมต่อกับ StrongSwan VPN ในขณะที่ผู้ใช้ Android และ Windows 10 เชื่อมต่อได้อย่างไร

ธง us

ฉันมี 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
  }

ทุกอย่างเป็นไปตามที่เป็นจากการกำหนดค่าเริ่มต้นของฉัน

cn flag
ไม่มีการส่งข้อมูลซ้ำ ดังนั้นเป็นไปได้มากว่าไคลเอนต์ไม่เชื่อถือ/สนับสนุนใบรับรองเซิร์ฟเวอร์ คุณใช้ Let's Encrypt ซึ่งไคลเอ็นต์ส่วนใหญ่ควรสนับสนุนสิ่งเดียวที่ฉันคิดได้คือไคลเอนต์มีปัญหากับใบรับรองเซิร์ฟเวอร์ ECDSA คุณลองใช้ใบรับรอง RSA หรือไม่
us flag
ไม่ใช้ร่วมกับ iPhone แต่ควรทดสอบได้ง่าย อย่างไรก็ตาม เอาต์พุตจากบันทึกแจ้งว่าการตรวจสอบใบรับรองสำเร็จแล้ว ดู: `การรับรองความถูกต้องของ 'vpn.example.com' (ตัวฉันเอง) ด้วยลายเซ็น ECDSA-256 สำเร็จ`
us flag
คงจะแปลกที่ Lets Encrypt ECDSA ไม่ทำงานกับ VPN เนื่องจากฉันมี iPhone และ iPad ที่ใช้ใบรับรองเดียวกันเมื่อส่งหรือรับเมล เนื่องจากเซิร์ฟเวอร์เมลของฉันโฮสต์อยู่บนเครื่องเดียวกันกับ VPN ของฉัน
cn flag
ข้อความบันทึกมาจากเซิร์ฟเวอร์ที่สร้างลายเซ็น (ไม่ได้ตรวจสอบ) ซึ่งไม่ได้บอกว่าไคลเอนต์สามารถตรวจสอบได้หรือไม่ (คุณต้องเข้าถึงบันทึกไคลเอนต์ผ่าน Xcode เพื่อสิ่งนั้น) และเห็นได้ชัดว่าเมลไคลเอ็นต์เป็นซอฟต์แวร์คนละชิ้นกับไคลเอนต์ VPN ดังนั้นคุณจึงไม่สามารถเปรียบเทียบทั้งสองได้
us flag
ถูกต้อง. ความท้าทายที่ใหญ่ที่สุดของฉันในการดีบั๊ก iPhone คือฉันไม่มี iPhone จริง ๆ เพื่อนจึงทำการทดสอบจากระยะไกล ซึ่งโดยพื้นฐานแล้วตอบกลับเพียงว่า "ใช้งานได้" หรือ "ใช้งานไม่ได้" เดาว่าฉันต้องทำ over-the-shoulder debugging สักหน่อยในครั้งต่อไปที่ฉันพบเพื่อน
cn flag
ฉันจะลองใช้ใบรับรอง RSA เห็นได้ชัดว่าไคลเอ็นต์ของ Apple ไม่รองรับ [RFC 7427](https://datatracker.ietf.org/doc/html/rfc7427) (มิฉะนั้น คุณจะเห็นอัลกอริทึมแฮชแจ้งในข้อความ `IKE_SA_INIT`) และในฐาน IKEv2 RFC ตัวเลือกสำหรับ ECDSA ค่อนข้างจำกัด (เส้นโค้งเฉพาะและอัลกอริทึมแฮช) ดังนั้นพวกเขาอาจยอมรับ/ใช้งานได้ก็ต่อเมื่อกำหนดค่าอย่างชัดเจนใน [โปรไฟล์การกำหนดค่า](https://wiki.strongswan.org/projects/strongswan/wiki/AppleIKEv2Profile) (มีตัวเลือก `CertificateType` ที่สามารถตั้งค่าเป็น ` ECDSA256`).
us flag
@ecdsa: และเราก็มียานแล้ว! :-) คุณช่วยกรุณาเพิ่มคำตอบเพื่อที่คุณจะได้รับเครดิตสำหรับคำตอบที่ถูกต้อง? :-)
Score:0
ธง cn

ดังที่เราเห็นในบันทึก ไคลเอ็นต์ไม่สนับสนุน อาร์เอฟซี 7427 (มิฉะนั้นการแจ้งเตือนอัลกอริทึมแฮชจะได้รับการแลกเปลี่ยนระหว่าง IKE_SA_INIT) ซึ่งกำหนดการรับรองความถูกต้องตามลายเซ็นที่ยืดหยุ่น

ในขณะที่ IKEv2 ยังรองรับ ECDSA โดยไม่มีส่วนขยายนั้น อาร์เอฟซี 4754 เพิ่มการสนับสนุนที่จำกัดเท่านั้น (อาจใช้เฉพาะเส้นโค้ง NIST สามเส้นและแต่ละเส้นมีการกำหนดอัลกอริทึมแฮชเฉพาะ) ดังนั้นจึงเป็นไปได้ที่ไคลเอนต์ Apple จะยอมรับ/ใช้ ECDSA หากกำหนดค่าอย่างชัดเจนใน โปรไฟล์การกำหนดค่า (มีตัวเลือก ประเภทใบรับรอง ที่สามารถตั้งค่าได้เช่น ECDSA256).

หากการใช้โปรไฟล์การกำหนดค่าไม่ใช่ตัวเลือก ทางเลือกเดียวคือใช้ ใบรับรองเซิร์ฟเวอร์ RSAอย่างน้อยก็จนกว่า Apple จะดำเนินการรองรับ RFC 7427 ในไคลเอ็นต์ IKEv2 ของตน

us flag
ขอขอบคุณ. โซลูชันนี้มีไว้สำหรับโรงเรียนที่มีผู้ใช้มากกว่า 200 คน ดังนั้นฉันจึงต้องการสิ่งที่สามารถใช้กับการสนับสนุนทางเทคนิคสำหรับผู้ใช้ปลายทางให้น้อยที่สุดเท่าที่จะเป็นไปได้ ดังนั้นเป้าหมายคือเพียงบอกพวกเขาว่าจะเชื่อมต่อกับเซิร์ฟเวอร์ใดและชื่อผู้ใช้และรหัสผ่านใดที่จะใช้ สิ่งใดก็ตามที่นอกเหนือจากนั้นถือว่า "ซับซ้อนเกินไป" สำหรับผู้ใช้ปลายทาง :-)

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา