ฉันกำลังพยายามติดตั้งเซิร์ฟเวอร์ Strongswan ที่ทำงานในโหมดอุโมงค์แยก ซึ่งหมายความว่าฉันต้องปิดการใช้งานโดยใช้เซิร์ฟเวอร์เป็นเกตเวย์เริ่มต้นในฝั่งไคลเอ็นต์ และปิดใช้งานการจัดเส้นทางแบบคลาสเต็มในไคลเอนต์ VPN
แล้วต้องส่ง DHCP ตัวเลือก 121
(เส้นทางคงที่แบบไม่มีคลาส) และ ตัวเลือก DHCP 249
(เส้นทางคงที่แบบไม่มีคลาสของ Microsoft) เมื่อไคลเอ็นต์ขอที่อยู่ IP จากเซิร์ฟเวอร์ Strongswan VPN
ฉันต้องการทั้งตัวเลือก 121 และ 249 เพื่อพิจารณาชุดค่าผสมของระบบปฏิบัติการทั้งหมดที่สามารถเชื่อมต่อได้ (Windows, Linux, Android, MacOS, iPhones เป็นต้น)
ฉันไม่ประสบความสำเร็จมากนักในการใช้เซิร์ฟเวอร์ ISC DHCP กับ Strongswan เนื่องจากฉันไม่มีความสุขที่จะฟังทราฟฟิกผ่านอินเทอร์เฟซ WireGuardมันบอกว่าไม่รองรับ WireGuard หรืออินเทอร์เฟซย้อนกลับ และโดยพื้นฐานแล้วไม่สนใจคำขอ DHCP ที่มาจากเซิร์ฟเวอร์ Strongswan VPN ที่อีกด้านหนึ่งของลิงก์ wireguard
ดังนั้นฉันจึงเปลี่ยนไปใช้เซิร์ฟเวอร์ Freeradius DHCP เนื่องจาก Strongswan ใช้ Freeradius เพื่อตรวจสอบสิทธิ์ผู้ใช้อยู่แล้วเมื่อลงชื่อเข้าใช้เซิร์ฟเวอร์ Strongswan VPN
ท้ายที่สุด: มันจะยากแค่ไหน เพราะฉันเพิ่งจะเพิ่ม "ไฟล์ปรับแต่งบางไฟล์ไปยัง Freeradius" :-)
ปรากฎว่ามันยุ่งยากเล็กน้อย แต่ฉันจัดการให้ Freeradius ฟังทราฟฟิกบนลิงก์ Wireguard ของฉันโดยใช้การกำหนดค่าต่อไปนี้:
ฟัง {
พิมพ์ = dhcp
# เครือข่ายย่อย 192.168.200.0/24 เป็นเครือข่ายย่อย WireGuard ของฉันที่ทำหน้าที่เป็น
# กระดูกสันหลังของไซต์ต่อไซต์ VPN
ipaddr = 192.168.200.4
src_ipaddr = 192.168.200.4
พอร์ต = 67
อินเตอร์เฟส = wg0
ออกอากาศ = ไม่
}
ในไฟล์ strongswan.conf ฉันมีดังต่อไปนี้:
ชารอน {
load_modular = ใช่
ปลั๊กอิน {
รวมถึงstrongswan.d/charon/*.conf
dhcp {
force_server_address = ใช่
identity_lease = ใช่
อินเตอร์เฟส = wg0
โหลด = ใช่
เซิร์ฟเวอร์ = 192.168.200.4
use_server_port = ใช่
}
}
}
อย่างไรก็ตาม: ฉันได้รับเซิร์ฟเวอร์ Freeradius DHCP เพื่อแจกจ่ายที่อยู่ IP ให้กับไคลเอนต์ VPN เมื่อ Strongswan ส่ง DHCP-Discover หรือ DHCP-Request ไปยังเซิร์ฟเวอร์ Freeradius DHCP แต่อย่างใด ฉันไม่สามารถส่งเส้นทางคงที่ได้
ฉันสามารถดูในไฟล์ พจนานุกรม
ซึ่งอาศัยอยู่ใน /etc/freeradius/3.0
ว่ากำลังโหลดพจนานุกรมสำหรับตัวเลือกเฉพาะของ dhcp /usr/share/freeradius/dictionary.dhcp
.
ในไฟล์นั้นฉันพบข้อมูลสองรายการต่อไปนี้:
# ตัวเลือกเส้นทางคงที่แบบไม่มีคลาส
ATTRIBUTE DHCP-Classless-Static-Route 121 octets
...
ATTRIBUTE DHCP-ไซต์เฉพาะ-25 249 octets
ตาม StrongSwan วิกิพีเดีย ฉันสามารถตั้งค่าเกตเวย์ hop ถัดไปสำหรับเส้นทางคงที่ของฉัน 0.0.0.0
ดังนั้นถ้าอยากจะบอกว่าซับเน็ต 192.168.200.0/24
สามารถเข้าถึงได้ผ่านลิงก์ VPN ฉันต้องเข้ารหัสเส้นทางเป็นออคเต็ตที่เขียนเป็นรหัสฐานสิบหกโดยใช้คำสั่ง: {CIDR}{Network}{Gateway}
ดังนั้น 192.168.200.0/24 ผ่าน 0.0.0.0
กลายเป็น 0x18C0A8C800000000
ดังนั้นฉันคิดว่าฉันควรแก้ไข อัปเดตการตอบกลับ
ใน dhcp DHCP-ค้นพบ
และ dhcp คำขอ DHCP
ดังต่อไปนี้:
อัปเดตคำตอบ {
&DHCP-โดเมนชื่อเซิร์ฟเวอร์ = 192.168.200.1
&DHCP-ซับเน็ตมาสก์ = 255.255.255.0
&DHCP-IP-Address-Lease-Time = 86400
&DHCP-Classless-Static-เส้นทาง = 0x18C0A8C800000000
&DHCP-ไซต์เฉพาะ-25 = 0x18C0A8C800000000
&DHCP-DHCP-ตัวระบุเซิร์ฟเวอร์ = 192.168.200.4
}
อย่างไรก็ตาม ฉันไม่เห็นว่าเส้นทางถูกพุชไปยังตารางเส้นทางของฉัน เมื่อฉันพยายามเข้าสู่ระบบผ่านไคลเอนต์ Windows VPN
แล้วฉันพลาดอะไรไป?
อัปเดต
ปรากฎว่าการเข้ารหัสสำหรับตัวเลือก DHCP 249 นั้นแตกต่างจากตัวเลือก DHCP 121 เล็กน้อย
อย่างน้อยตาม หน้าเว็บ Microsoft สำหรับตัวเลือก DHCP 249.
อย่างไรก็ตาม ฉันเริ่มสับสนเล็กน้อยว่าสิ่งนี้แปลเป็นการเข้ารหัสใน Freeradius ได้อย่างไร
เท่าที่ผมบอก ผมบอกแล้วว่า header ขึ้นต้นด้วย DHCP option 249 เพราะอะไร DHCP-ไซต์เฉพาะ-25
ถูกกำหนดไว้ในพจนานุกรม
แต่เว็บเพจของ Microsoft บอกว่าไบต์แรกหลังจากนั้นคือความยาวของเส้นทางทั้งหมดใน DHCP ที่วัดเป็นไบต์ ตามด้วยการเข้ารหัสเดียวกันสำหรับเส้นทางตามที่กำหนดไว้ในตัวเลือก DHCP 121
ดังนั้นเส้นทางที่เข้ารหัส 0x18C0A8C800000000
จะต้องต่อท้ายด้วย 08
เพื่อให้สอดคล้องกับ Microsoft Static Routes ตอนนี้อ่าน:
&DHCP-ไซต์เฉพาะ-25 = 0x0818C0A8C800000000
ฉันได้ทดสอบด้วยการดัดแปลงนั้น แต่ก็ยังไม่มีโชค
การปรับปรุงครั้งที่สอง
เล่นซออีกเล็กน้อยกับไฟล์คอนฟิกูเรชันสำหรับ DHCP จากนั้นตรวจสอบผ่าน tcpdump
ในสิ่งที่เกิดขึ้นจริง
เมื่อใดก็ตามที่ไคลเอนต์เข้าสู่ระบบ Strongswan คำขอสำหรับที่อยู่ IP จะถูกส่งต่อไปยังเซิร์ฟเวอร์ DCHP ดังนั้นใน essense Strongswan จึงทำหน้าที่เป็นตัวแทนส่งต่อ DHCP หากฉันได้รับส่วนนั้นถูกต้อง
ใน tcpdump ฉันเห็นการแลกเปลี่ยนต่อไปนี้เกิดขึ้น:
ลูกค้าส่ง DHCP Discover
เซิร์ฟเวอร์ตอบกลับด้วยข้อเสนอ DHCP
ลูกค้าส่งคำขอ DHCP
เซิร์ฟเวอร์ตอบกลับด้วย DHCP ACK
ประเด็นแรกของฉันจากการตรวจสอบ tcpdump คือฉันไม่ต้องคำนวณ bytelength บนเส้นทางสแตติกที่เข้ารหัสเพราะนั่นทำให้เอาต์พุตจาก tcpdump สับสน
กล่าวอีกนัยหนึ่งคือการเข้ารหัสสำหรับ DHCP ตัวเลือก 121 และ DHCP ตัวเลือก 249 เหมือนกัน.
การอ่านเพิ่มเติมแนะนำการกำหนดเส้นทางแบบคงที่เชื่อมโยงกับข้อมูล DHCP แต่ฉันไม่เคยเห็นแพ็กเก็ตนั้นใน tcpdump
ผลลัพธ์จาก tcpdump เมื่อรันด้วยการกำหนดค่าเริ่มต้นของฉัน อัปเดตการตอบกลับ
ด้านบนให้เซสชันต่อไปนี้:
tcpdump: กำลังฟัง wg0, RAW ประเภทลิงก์ (Raw IP), ขนาดการจับภาพ 262144 ไบต์
10:58:17.185671 IP (tos 0x0, ttl 64, id 46089, offset 0, flag [none], proto UDP (17), ความยาว 300)
192.168.200.1.67 > 192.168.200.4.67: [udp sum ok] BOOTP/DHCP, คำขอจาก 7a:a7:8f:1f:b7:88, ความยาว 272, xid 0x5c9716b5, ค่าสถานะ [ไม่มี] (0x0000)
เกตเวย์-IP 192.168.200.1
Client-Ethernet-Address 7a:a7:8f:1f:b7:88
ส่วนขยายผู้ขาย-rfc1048
คุกกี้วิเศษ 0x63825363
ข้อความ DHCP ตัวเลือก 53 ความยาว 1: ค้นพบ
ตัวเลือก Client-ID 61 ความยาว 22: ประเภทฮาร์ดแวร์ 108, 61:73:73:65:40:68:6f:6d:65:2e:6d:6f:6c:67:61:61:72:64: 2e:65:75
ตัวเลือกคำขอพารามิเตอร์ 55 ความยาว 2:
เซิร์ฟเวอร์ชื่อโดเมน, เซิร์ฟเวอร์ชื่อ Netbios
END ตัวเลือก 255, ความยาว 0
10:58:17.195305 IP (tos 0x0, ttl 64, id 19475, offset 0, flag [none], proto UDP (17), ความยาว 328)
192.168.200.4.67 > 192.168.200.1.67: [bad udp cksum 0x129d -> 0x9ffd!] BOOTP/DHCP, Reply, length 300, xid 0x5c9716b5, flags [none] (0x0000)
IP ของคุณ 192.168.201.13
เกตเวย์-IP 192.168.200.1
Client-Ethernet-Address 7a:a7:8f:1f:b7:88
ส่วนขยายผู้ขาย-rfc1048
คุกกี้วิเศษ 0x63825363
ข้อความ DHCP ตัวเลือก 53 ความยาว 1: ข้อเสนอ
Subnet-Mask ตัวเลือก 1 ความยาว 4: 255.255.255.0
โดเมนเนมเซิร์ฟเวอร์ ตัวเลือก 6 ความยาว 4: 192.168.200.1
ตัวเลือกระยะเวลาเช่า 51 ความยาว 4: 86400
Server-ID ตัวเลือก 54 ความยาว 4: 192.168.200.4
Classless-Static-Route ตัวเลือก 121 ความยาว 8: (192.168.200.0/24:0.0.0.0)
Classless-Static-Route-Microsoft Option 249 ความยาว 8: (192.168.200.0/24:0.0.0.0)
END ตัวเลือก 255, ความยาว 0
พันธมิตรฯ ตัวเลือก 0 ความยาว 0 เกิดขึ้น 12
10:58:17.219444 IP (tos 0x0, ttl 64, id 46098, offset 0, flag [none], proto UDP (17), ความยาว 312)
192.168.200.1.67 > 192.168.200.4.67: [udp sum ok] BOOTP/DHCP, คำขอจาก 7a:a7:8f:1f:b7:88, ความยาว 284, xid 0x5c9716b5, ค่าสถานะ [ไม่มี] (0x0000)
เกตเวย์-IP 192.168.200.1
Client-Ethernet-Address 7a:a7:8f:1f:b7:88
ส่วนขยายผู้ขาย-rfc1048
คุกกี้วิเศษ 0x63825363
ตัวเลือกข้อความ DHCP 53 ความยาว 1: คำขอ
ตัวเลือก Client-ID 61 ความยาว 22: ประเภทฮาร์ดแวร์ 108, 61:73:73:65:40:68:6f:6d:65:2e:6d:6f:6c:67:61:61:72:64: 2e:65:75
ขอ IP ตัวเลือก 50 ความยาว 4: 192.168.201.13
Server-ID ตัวเลือก 54 ความยาว 4: 192.168.200.4
ตัวเลือกคำขอพารามิเตอร์ 55 ความยาว 2:
เซิร์ฟเวอร์ชื่อโดเมน, เซิร์ฟเวอร์ชื่อ Netbios
END ตัวเลือก 255, ความยาว 0
10:58:17.228663 IP (tos 0x0, ttl 64, id 19477, offset 0, flag [none], proto UDP (17), ความยาว 328)
192.168.200.4.67 > 192.168.200.1.67: [bad udp cksum 0x129d -> 0x9d02!] BOOTP/DHCP, Reply, length 300, xid 0x5c9716b5, flags [none] (0x0000)
IP ของคุณ 192.168.201.8
เกตเวย์-IP 192.168.200.1
Client-Ethernet-Address 7a:a7:8f:1f:b7:88
ส่วนขยายผู้ขาย-rfc1048
คุกกี้วิเศษ 0x63825363
ตัวเลือกข้อความ DHCP 53 ความยาว 1: ACK
Subnet-Mask ตัวเลือก 1 ความยาว 4: 255.255.255.0
โดเมนเนมเซิร์ฟเวอร์ ตัวเลือก 6 ความยาว 4: 192.168.200.1
ตัวเลือกระยะเวลาเช่า 51 ความยาว 4: 86400
Server-ID ตัวเลือก 54 ความยาว 4: 192.168.200.4
Classless-Static-Route ตัวเลือก 121 ความยาว 8: (192.168.200.0/24:0.0.0.0)
Classless-Static-Route-Microsoft Option 249 ความยาว 8: (192.168.200.0/24:0.0.0.0)
END ตัวเลือก 255, ความยาว 0
พันธมิตรฯ ตัวเลือก 0 ความยาว 0 เกิดขึ้น 12
ความจริงที่ฉันเห็น Classless-Static-Route
และ Classless-Static-Route-Microsoft
มีการประกาศและพวกเขาบอกว่าซับเน็ตนั้นแน่นอน 192.168.200.0/24
มีให้บริการผ่านอุโมงค์ บอกเป็นนัยว่าฉันมาถูกทางแล้ว
อย่างไรก็ตาม:
เส้นทางยังไม่ปรากฏในตารางเส้นทางของฉัน
อาจมีบางสิ่งที่เกี่ยวข้องกับบรรทัดต่อไปนี้:
192.168.200.4.67 > 192.168.200.1.67: [udp cksum ไม่ดี 0x129d -> 0x9ffd!] BOOTP/DHCP, ตอบกลับ, ความยาว 300, xid 0x5c9716b5, ค่าสถานะ [ไม่มี] (0x0000)
ใครรู้บ้างว่าอะไรเป็นอะไรต้องแก้ไข?