Đây là phần tiếp theo của câu hỏi trước đây của tôi trong việc gửi các tuyến tĩnh từ việc triển khai máy chủ Freeradius DHCP kết hợp với máy chủ Strongswan VPN.
Khi gỡ lỗi Freeradius bằng tcpdump và Wireshark, tôi phát hiện ra rằng tôi có thể gửi các tuyến tĩnh không phân loại từ máy chủ Freeradius DHCP bằng cách thêm DHCP-Classless-Static-Route
và DHCP-Site-cụ thể-25
(còn gọi là tuyến đường tĩnh của Microsoft) cho tôi DHCP-Khám phá
và Yêu cầu DHCP
các phần của tệp cấu hình máy chủ dhcp.
Tuy nhiên: Có vẻ như các tuyến tĩnh không được máy khách Microsoft VPN chấp nhận nếu tôi đặt cổng mặc định thành 0.0.0.0
theo đề xuất của tài liệu Strongswan.
Ít nhất tôi không thể tìm thấy các tuyến được quảng cáo trên máy khách Windows của mình khi sử dụng in tuyến đường -4
.
Ngoài ra, tôi không thể thêm các tuyến theo cách thủ công trên máy khách Windows khi tôi đang sử dụng 0.0.0.0
làm cổng tiêu chuẩn trên giao diện VPN.
Tuy nhiên:
Hãy nói rằng tôi muốn truy cập mạng con 192.168.200.0/24
qua VPN và máy chủ VPN của tôi chỉ định địa chỉ 192.168.201.2/24
cho máy khách Windows của tôi. Sau đó, thực sự có thể tạo một tuyến tĩnh ở phía máy khách windows bằng cách khai báo rằng mạng con 192.168.200.0/24 có thể truy cập được qua 192.168.201.2 bằng cách sử dụng lệnh windows:
lộ trình thêm mặt nạ 192.168.200.0 255.255.255.0 192.168.201.2
Tôi biết nó trông hơi lạ, nhưng tôi có thể ping bất kỳ máy chủ nào trên 192.168.200.0
mạng con, miễn là nó hoạt động là tôi hài lòng. :-)
Nhưng: Tôi sẽ vui hơn nếu tôi có thể làm điều tương tự bằng cách quảng cáo các tuyến đường từ máy chủ VPN của mình thay vì thực hiện thủ công trên tất cả các máy khách VPN. :-)
Điều đó có nghĩa là tôi phải thực hiện một chút lập trình động cho cấu hình DHCP trong Freeradius. Trong trường hợp của tôi, điều đó có nghĩa là tôi phải tạo một tham chiếu đến một mô-đun perl trong DHCP-Discover và DHCP-request để lấy địa chỉ ip vpn của máy khách được chỉ định, chuyển đổi nó thành các octet và kết hợp nó với các tuyến tĩnh cũng được cung cấp dưới dạng octet.
Một ví dụ:
mạng con 192.168.200.0/24
sẽ được mã hóa thành 0x18c0a8c8
vì mặt nạ mạng con được mã hóa trước.
Khách hàng 192.168.201.2/24
sẽ được mã hóa thành 0xc0a8c902
vì nó chỉ chuyển đổi từng số trong địa chỉ ip thành hex.
Mã hóa cuối cùng cho tuyến đường sẽ là: 0x18c0a8c8c0a8c902
vì nó chỉ là sự kết hợp của hai chuỗi.
sau đó tôi phải sử dụng cập nhật trả lời
với đoạn mã sau:
cập nhật câu trả lời {
&DHCP-Classless-Static-Route = 0x18c0a8c8c0a8c902
&DHCP-Site-cụ thể-25 = 0x18c0a8c8c0a8c902
}
Nếu có thêm bất kỳ tuyến đường nào thì tất cả các tuyến đường sẽ được nối thành một chuỗi dài.
Phần khó khăn:
Giả sử bạn có cấu hình mặc định của máy chủ DHCP Freeradius như trong freeradius/3.0/sites-available/dhcp
tập tin.
Cấu trúc chung của tệp cho DHCP-Discover và DHCP-Request như sau:
dhcp DHCP-Yêu cầu {
cập nhật câu trả lời {
&DHCP-Message-Type = DHCP-Ack
}
cập nhật câu trả lời {
# Các tùy chọn DHCP chung, chẳng hạn như thời gian thuê GW, DNS, địa chỉ IP mặc định, v.v.
}
kiểm soát cập nhật {
&Tên nhóm := "vpn_pool"
}
dhcp_sqlippool
Vâng
}
Sau đó, theo như tôi đã thu thập được, tôi cần gọi mô-đun perl của mình sau dhcp_sqlippool
đã được gọi và trước khi trở lại Vâng
, bởi vì dhcp_sqlippool
là mô-đun gán ipaddress cho máy khách VPN.
Điều đó có nghĩa là phiên bản của tôi sẽ giống như:
dhcp DHCP-Yêu cầu {
cập nhật câu trả lời {
&DHCP-Message-Type = DHCP-Ack
}
cập nhật câu trả lời {
# Các tùy chọn DHCP chung, chẳng hạn như thời gian thuê GW, DNS, địa chỉ IP mặc định, v.v.
}
kiểm soát cập nhật {
&Tên nhóm := "vpn_pool"
}
dhcp_sqlippool
perl
# Nếu mô-đun perl không trả về lỗi
nếu (được) {
cập nhật câu trả lời {
# Perl-Route chứa một chuỗi mã hóa hex với tất cả các tuyến đường.
&DHCP-Classless-Static-Route = Perl-Route
&DHCP-Site-specific-25 = Perl-Route
}
}
# Không chắc chắn nếu cái này là cần thiết?
cập nhật câu trả lời {
&DHCP-Cuối-Tùy chọn = 255
}
Vâng
}
Để làm cho nó hoạt động, tôi phải kích hoạt perl bên dưới freeradius/3.0/đã bật mod
thư mục và sửa đổi tên tệp trong freeradius/3.0/mods-enabled/perl
để trỏ nó đến mô-đun perl của tôi. Chẳng hạn như:
tên tệp = ${modconfdir}/${.:instance}/dhcp/Options.pm
Nhưng làm cách nào để tham chiếu cuộc gọi đến perl đúng cách?
Tôi nghĩ rằng tôi phải kích hoạt dòng func_post_auth = post_auth
Trong freeradius/3.0/mods-enabled/perl
và tạo một post_auth phụ
trong mô-đun perl của tôi để xử lý các cuộc gọi từ Freeradius, nhưng theo như tôi có thể thấy trong nhật ký của mình, tôi gặp lỗi sau trong Freeradius:
(8) perl: perl_embed:: module = /etc/freeradius/3.0/mods-config/perl/dhcp/Options.pm ,
func = trạng thái thoát post_auth = Chương trình con chưa xác định &main::post_auth được gọi.
...
(8) [perl] = thất bại
(8) } # dhcp DHCP-Discover = fail
Vì vậy, nó là gì mà tôi không nhìn thấy?