นี่คือความต่อเนื่องของคำถามก่อนหน้าของฉัน ในการส่งเส้นทางคงที่จากการใช้งานเซิร์ฟเวอร์ Freeradius DHCP ร่วมกับเซิร์ฟเวอร์ Strongswan VPN
เมื่อทำการดีบัก Freeradius โดยใช้ tcpdump และ Wireshark ฉันพบว่าฉันสามารถส่งเส้นทางคงที่แบบไม่มีคลาสจากเซิร์ฟเวอร์ Freeradius DHCP โดยการเพิ่ม DHCP-Classless-Static-เส้นทาง
และ DHCP-ไซต์เฉพาะ-25
(หรือที่เรียกว่า Microsoft static route) ตัวเลือกของฉัน DHCP-ค้นพบ
และ DHCP-คำขอ
ส่วนของไฟล์การกำหนดค่าเซิร์ฟเวอร์ dhcp
อย่างไรก็ตาม: ปรากฏว่าไคลเอนต์ Microsoft VPN ไม่ยอมรับเส้นทางแบบคงที่หากฉันตั้งค่าเกตเวย์เริ่มต้นเป็น 0.0.0.0
ตามที่ เอกสารสตรองสวอน.
อย่างน้อยฉันก็ไม่พบเส้นทางที่โฆษณาบนไคลเอนต์ Windows ของฉันเมื่อใช้งาน พิมพ์เส้นทาง -4
.
นอกจากนี้ ฉันไม่สามารถเพิ่มเส้นทางด้วยตนเองบนไคลเอนต์ Windows เมื่อฉันใช้งาน 0.0.0.0
เป็นเกตเวย์มาตรฐานผ่านอินเทอร์เฟซ VPN
อย่างไรก็ตาม:
สมมติว่าฉันต้องการเข้าถึงซับเน็ต 192.168.200.0/24
ผ่าน VPN และเซิร์ฟเวอร์ VPN ของฉันกำหนดที่อยู่ 192.168.201.2/24
ไปยังไคลเอ็นต์ Windows ของฉัน จากนั้นเป็นไปได้ที่จะสร้างเส้นทางคงที่บนฝั่งไคลเอนต์ windows โดยประกาศว่าซับเน็ต 192.168.200.0/24 สามารถเข้าถึงได้ผ่าน 192.168.201.2 โดยใช้คำสั่ง windows:
เส้นทางเพิ่ม 192.168.200.0 มาสก์ 255.255.255.0 192.168.201.2
ฉันรู้ว่ามันดูแปลกๆ แต่ฉันสามารถ ping โฮสต์ใดก็ได้บน 192.168.200.0
subnet ตราบเท่าที่ใช้งานได้ฉันก็มีความสุข :-)
แต่: ฉันจะมีความสุขมากกว่านี้ถ้าฉันสามารถทำสิ่งเดียวกันได้ด้วยการโฆษณาเส้นทางจากเซิร์ฟเวอร์ VPN ของฉัน แทนที่จะดำเนินการด้วยตนเองบนไคลเอนต์ VPN ทั้งหมด :-)
นั่นหมายความว่าฉันต้องทำโปรแกรมไดนามิกเล็กน้อยกับการกำหนดค่า DHCP ใน Freeradius กรณีของฉันหมายความว่าฉันต้องอ้างอิงถึงโมดูล Perl ใน DHCP-Discover และ DHCP-request ที่คว้าที่อยู่ IP VPN ของไคลเอ็นต์ที่กำหนด แปลงเป็นออคเต็ตและรวมเข้ากับเส้นทางสแตติกที่กำหนดเป็นออคเต็ตด้วย
ตัวอย่าง:
เครือข่ายย่อย 192.168.200.0/24
จะถูกเข้ารหัสเป็น 0x18c0a8c8
เนื่องจากซับเน็ตมาสก์ถูกเข้ารหัสก่อน
ลูกค้า 192.168.201.2/24
จะถูกเข้ารหัสเป็น 0xc0a8c902
เนื่องจากเป็นเพียงการแปลงตัวเลขแต่ละตัวในที่อยู่ IP เป็นเลขฐานสิบหก
การเข้ารหัสขั้นสุดท้ายสำหรับเส้นทางจะเป็น: 0x18c0a8c8c0a8c902
เนื่องจากเป็นเพียงการต่อสายสองสายเข้าด้วยกัน
แล้วต้องใช้ อัปเดตการตอบกลับ
ด้วยรหัสต่อไปนี้:
อัปเดตคำตอบ {
&DHCP-Classless-Static-เส้นทาง = 0x18c0a8c8c0a8c902
&DHCP-ไซต์เฉพาะ-25 = 0x18c0a8c8c0a8c902
}
หากมีเส้นทางเพิ่มเติม เส้นทางทั้งหมดจะถูกเชื่อมเข้าด้วยกันเป็นสตริงยาวเส้นเดียว
ส่วนที่ยุ่งยาก:
สมมติว่าคุณมีการกำหนดค่าเริ่มต้นของเซิร์ฟเวอร์ Freeradius DHCP ตามที่พบใน freeradius/3.0/sites-available/dhcp
ไฟล์.
โครงสร้างทั่วไปของไฟล์สำหรับ DHCP-Discover และ DHCP-Request เป็นดังนี้:
dhcp DHCP-คำขอ {
อัปเดตคำตอบ {
&DHCP-Message-Type = DHCP-Ack
}
อัปเดตคำตอบ {
# ตัวเลือก DHCP ทั่วไป เช่น GW เริ่มต้น, DNS, เวลาเช่าที่อยู่ IP เป็นต้น
}
อัปเดตการควบคุม {
&ชื่อพูล := "vpn_pool"
}
dhcp_sqlippool
ตกลง
}
เท่าที่ฉันรวบรวมได้ฉันต้องเรียกโมดูล perl ของฉันหลังจากนั้น dhcp_sqlippool
ได้รับการเรียกและก่อนที่จะกลับ ตกลง
, เพราะ dhcp_sqlippool
เป็นโมดูลที่กำหนด ipaddress ให้กับไคลเอนต์ VPN
นั่นหมายความว่าเวอร์ชันของฉันจะเป็นดังนี้:
dhcp DHCP-คำขอ {
อัปเดตคำตอบ {
&DHCP-Message-Type = DHCP-Ack
}
อัปเดตคำตอบ {
# ตัวเลือก DHCP ทั่วไป เช่น GW เริ่มต้น, DNS, เวลาเช่าที่อยู่ IP เป็นต้น
}
อัปเดตการควบคุม {
&ชื่อพูล := "vpn_pool"
}
dhcp_sqlippool
เพิร์ล
# หากโมดูล Perl ไม่ส่งคืนข้อผิดพลาด
ถ้า (ตกลง) {
อัปเดตคำตอบ {
# Perl-Route มีสตริงเข้ารหัสฐานสิบหกพร้อมเส้นทางทั้งหมด
&DHCP-Classless-Static-Route = Perl-เส้นทาง
&DHCP-ไซต์เฉพาะ-25 = Perl-เส้นทาง
}
}
#ไม่แน่ใจว่าจำเป็นไหม?
อัปเดตคำตอบ {
&DHCP-จุดสิ้นสุดของตัวเลือก = 255
}
ตกลง
}
เพื่อให้มันใช้งานได้ ฉันต้องเปิดใช้งาน perl ภายใต้ freeradius/3.0/mods-enabled
โฟลเดอร์และแก้ไขชื่อไฟล์ใน freeradius/3.0/mods-enabled/perl
เพื่อชี้ไปที่โมดูล Perl ของฉัน เช่น:
ชื่อไฟล์ = ${modconfdir}/${.:instance}/dhcp/Options.pm
แต่ฉันจะอ้างอิงการโทรไปยัง perl ได้อย่างไร?
ฉันคิดว่าฉันต้องเปิดใช้งานสาย func_post_auth = post_auth
ใน freeradius/3.0/mods-enabled/perl
และสร้าง ย่อย post_auth
ในโมดูล perl ของฉันเพื่อจัดการการโทรจาก Freeradius แต่เท่าที่ฉันเห็นในบันทึกของฉัน ฉันได้รับข้อผิดพลาดต่อไปนี้ใน Freeradius:
(8) perl: perl_embed:: module = /etc/freeradius/3.0/mods-config/perl/dhcp/Options.pm ,
func = post_auth exit status= รูทีนย่อยที่ไม่ได้กำหนด &main::post_auth ถูกเรียก
...
(8) [perl] = ล้มเหลว
(8) } # dhcp DHCP-ค้นพบ = ล้มเหลว
แล้วอะไรล่ะที่ฉันไม่เห็น?