Bạn hỏi: " Ai đó có thể giải thích tại sao vấn đề này xảy ra ngay từ đầu không? "
Dựa trên những gì được báo cáo trong Câu hỏi thường gặp về OpenVPN chính thức, tôi cá rằng nó gây ra bởi một vấn đề định tuyến trong công cụ OpenVPN.
Để làm rõ hơn kịch bản, hãy để tôi tham khảo sơ đồ sau:
Ở đây bạn có thể thấy:
- một "máy chủ" OpenVPN được kết nối với mạng nội bộ HEADQUARTER (10.0.1.0/24)
- một "máy khách" OpenVPN đang chạy tại một Trang web từ xa và được kết nối với mạng 192.168.1.0/24 từ xa
Cũng thế
- chúng tôi giả định rằng đường hầm OpenVPN được thiết lập và:
- OpenVPN "máy chủ" có thể truy cập thông qua riêng của mình tun giao diện, với địa chỉ 10.10.0.1. Ngoài ra, địa chỉ P2P, được sử dụng bởi giao diện điều chỉnh là 10.10.0.2 ( điều này rất quan trọng cho cuộc thảo luận sau này, vì vậy hãy nhấn mạnh nó )
- OpenVPN "khách hàng" có một tun giao diện với IP 10.10.0.2
Bây giờ, hãy giả sử rằng:
- "Máy khách" OpenVPN đã xác định lại cổng mặc định của nó, do đó, để chuyển hướng trong đường hầm tất cả lưu lượng IP đi;
- "Máy khách" OpenVPN đã kích hoạt IP_FORWARDING và, do đó, có thể định tuyến các gói đến từ mạng LAN nội bộ của nó (192.168.1.0/24) ( tôi nhấn mạnh điểm này, vì nó rất quan trọng cho cuộc thảo luận của chúng tôi ).
Với kịch bản như vậy, hãy kiểm tra chi tiết những gì xảy ra khi R_PC1 (192.168.1.2) gửi một gói, như yêu cầu echo, đến L_PC1 (10.0.1.2):
- sau khi rời R_PC1 NIC, gói tiếp cận máy khách OpenVPN;
- Máy khách OpenVPN (được cấu hình để hoạt động như một bộ định tuyến chung), định tuyến nó theo bảng định tuyến của nó. Vì cổng mặc định là đường hầm, nó sẽ gửi gói đến đường hầm;
- Gói tiếp cận giao diện điều chỉnh của máy chủ OpenVPN. OpenVPN sẽ "nhìn thấy" nó và, vì nó (máy chủ OpenVPN) biết rằng 10.0.1.2 là một địa chỉ thuộc mạng con LAN của nó, nó "chuyển tiếp" gói tin, từ TUN sang LAN;
- Gói đạt L_PC1.
Vì vậy, mọi thứ đều ổn ...
Bây giờ, hãy kiểm tra xem điều gì xảy ra với phản hồi echo mà L_PC1 trả lời cho R_PC1.
- echo-reply rời L_PC1 NIC và tiếp cận giao diện LAN của máy chủ OpenVPN (10.0.1.1);
Bây giờ, nếu chúng ta muốn OpenVPN Server có thể truy cập trang web từ xa, chúng ta cần xác định định tuyến bằng "tuyến tĩnh". Cái gì đó như:
route add -net 192.168.1.0 netmask 255.255.255.0 gw 10.10.0.2
Xin lưu ý địa chỉ P2P được sử dụng làm cổng .
Các tuyến tĩnh như vậy sẽ hoạt động ở cấp độ hệ điều hành. Nói cách khác, hệ điều hành cần định tuyến đúng gói. Nó có nghĩa như sau: "Xin vui lòng, tất cả lưu lượng truy cập đến mạng con 192.168.1.0/24 cần được chuyển tiếp đến công cụ OpenVPN, mà HĐH có thể nói chuyện qua địa chỉ P2P". Nhờ tuyến đường tĩnh như vậy, giờ ...
- gói rời khỏi bối cảnh định tuyến hệ điều hành và đến OpenVPN. Phiên bản OpenVPN đang chạy trên Máy chủ OpenVPN. Vì vậy, tại thời điểm này, HĐH không còn gì để làm và tất cả các định tuyến (trong VPN) được để lại cho phần mềm máy chủ OpenVPN.
Vì vậy, bây giờ, vấn đề là: làm thế nào, phần mềm máy chủ openvpn, sẽ có thể quyết định tuyến đường của gói, với SRC_IP 10.0.1.2 và DST_IP 192.168.1.2 ?
Xin lưu ý rằng, dựa trên cấu hình của máy chủ OpenVPN, nó không biết gì về mạng 192.168.1.0/24, cũng như máy chủ 192.168.1.2. Nó không phải là một khách hàng được kết nối. Đó không phải là một khách hàng địa phương. Và vì thế? OpenVPN, cũng biết rằng đó không phải là "Bộ định tuyến hệ điều hành", vì vậy nó không thực sự muốn (và có thể ....) gửi gói trở lại cổng cục bộ. Vì vậy, lựa chọn duy nhất, ở đây, là đưa ra một lỗi. Chính xác là lỗi bạn gặp phải
Nói với ngôn ngữ của Câu hỏi thường gặp: " ... nó không biết cách định tuyến gói đến máy này, vì vậy nó làm rơi gói ... ".
Làm thế nào chúng ta có thể giải quyết vấn đề?
Như bạn có thể thấy từ tài liệu chính thức , tùy chọn iroute phục vụ chính xác đến phạm vi của chúng tôi:
--iroute network [netmask]
Generate an internal route to a specific client. The netmask
parameter, if omitted, defaults to 255.255.255.255.
This directive can be used to route a fixed subnet from the server
to a particular client, regardless of where the client is
connecting from. Remember that you must also add the route to the
system routing table as well (such as by using the --route
directive). The reason why two routes are needed is that the
--route directive routes the packet from the kernel to OpenVPN.
Once in OpenVPN, the --iroute directive routes to the specific
client.
Vì vậy, bạn cần một:
--iroute 192.168.1.0 255.255.255.0
được áp dụng (cho máy chủ) khi máy khách OpenVPN của bạn kết nối, ví dụ như thông qua tệp cấu hình đặc biệt được xác định trên máy chủ (client-config-dir, v.v.).
Nếu bạn thắc mắc tại sao vấn đề này không xảy ra ở bước 2) ở trên, thì tôi hiểu rằng OpenVPN Client biết cách định tuyến nó, vì nó biết rằng đường hầm VPN là một cổng mặc định.
Điều tương tự không thể được thực hiện tại OpenVPN Server, vì có cổng mặc định không bị ghi đè. Ngoài ra, hãy xem xét rằng bạn có thể có một máy chủ OpenVPN có nhiều máy khách OpenVPN: mỗi máy khách biết cách truy cập máy chủ nhưng ... làm thế nào, máy chủ có thể quyết định máy khách nào đóng vai trò là cổng cho mạng con không xác định?
Đối với câu hỏi đầu tiên của bạn (Các quy tắc bắt buộc có thể được viết theo cách chung / một lần không? ), Tôi xin lỗi nhưng tôi không gặp phải vấn đề của bạn. Bạn có thể viết lại cung cấp thêm chi tiết?