Hai vấn đề về tên xuất hiện trên gần như mọi cổng OpenVPN nhỏ. Bạn không thể truy cập một máy tính xách tay đang kết nối bằng tên trên chứng chỉ của nó, và các dịch vụ sau đường hầm hoàn toàn không có tên. Chúng trông như một vấn đề và cần cách xử lý ngược nhau, vì một địa chỉ thay đổi mỗi phiên còn địa chỉ kia thì không. Hãy quyết định bạn đang thêm loại tên nào trước khi sửa bất cứ thứ gì.

Quyết định theo từng tên, không theo cổng

Phép thử rất đơn giản: địa chỉ này có thay đổi khi máy khách kết nối lại không? Nếu có, tên phải được tạo từ phiên VPN. Nếu không, nó thuộc về một mục tĩnh mà bạn có thể đọc và xem lại.

Name kindSource of truthWhere it lives
Connected clientThe address OpenVPN just assignedGenerated hosts file, rewritten per session
Service behind the tunnelA fixed address you choseStatic address= drop-in
Anything with a certificate nameThe certificate, not the poolEither, but the name must match the certificate

Trộn lẫn hai loại là thất bại thường gặp. Một dịch vụ được ghim vào tệp được tạo sẽ biến mất ngay lần đầu script ghi lại tệp đó, và một máy khách được ghi vào mục tĩnh sẽ trỏ tới người giữ địa chỉ đó lần cuối. Cả hai lỗi đều vô hình cho tới khi một tên phân giải sang máy sai. Lúc đó người gỡ lỗi cho rằng DNS hỏng chứ không phải tệp.

Đường động: learn-address và pool

OpenVPN biết việc cấp phát, nên hãy để nó cho bạn biết. Những tùy chọn máy chủ này làm cho việc cấp phát bền vững và có thể viết script:

client-config-dir /etc/openvpn/ccd
ifconfig-pool-persist /etc/openvpn/ip-pool 60
script-security 2
learn-address /etc/openvpn/learn-address.sh

learn-address chạy script của bạn mỗi khi một địa chỉ được thêm, cập nhật hoặc xóa, và truyền thao tác, địa chỉ cùng tên chung. Một script tối thiểu thêm một dòng cho mỗi máy khách và xóa nó khi xóa:

#!/bin/sh
HOSTS=/etc/openvpn/hosts.lan
case "$1" in
  add|update) echo "$2 $3" >> "$HOSTS" ;;
  delete)     sed -i "/^$2 /d" "$HOSTS" ;;
esac
kill -HUP $(cat /var/run/dnsmasq.pid)

Trên thiết bị tun, đối số thứ hai là địa chỉ đường hầm của máy khách, nên dòng đó dùng được ngay. Trên thiết bị tap, OpenVPN truyền địa chỉ MAC của máy khách thay vào đó, vì một phân đoạn tap có thể mang các giao thức khác ngoài IPv4, và khi đó bạn phải tra địa chỉ trong tệp pool theo tên chung trước khi ghi bất cứ thứ gì.

Hãy rõ ràng về việc tệp được tạo là gì: một ảnh chụp ai đang kết nối ngay lúc này. Tên biến mất khi ngắt kết nối, đó chính là điều bạn muốn cho máy tính xách tay di chuyển giữa các mạng và chính là điều bạn không muốn cho một máy chủ chạy suốt đêm.

Đường tĩnh: address= và mở rộng miền

Trỏ dnsmasq vào tệp được tạo thay vì tệp hosts của hệ thống, và cấp cho nó một miền để các tên ngắn mở rộng thành tên đủ điều kiện:

domain=corp.example
no-hosts
addn-hosts=/etc/openvpn/hosts.lan
listen-address=127.0.0.1,10.8.0.1
bind-interfaces

Khi domain được đặt, một dòng như 10.8.0.6 alice trả lời cho cả alice và alice.corp.example. Giữ listen-address chỉ trên cổng đường hầm và loopback, vì một trình phân giải vô tình công bố trên giao diện LAN là dịch vụ bạn không định cung cấp.

Những dịch vụ không bao giờ đến từ pool có mục riêng. Đặt chúng trong một tệp drop-in riêng trong thư mục cấu hình của bản phân phối để bản cập nhật gói không thể ghi đè:

address=/files.corp.example/10.8.0.20
address=/db.corp.example/10.9.0.5

Hãy bàn giao trình phân giải, nếu không sẽ chẳng có gì xảy ra

Một trình phân giải không ai hỏi thì không thay đổi gì. Máy chủ phải quảng bá nó:

push "dhcp-option DNS 10.8.0.1"
push "dhcp-option DOMAIN corp.example"

Máy khách Windows tự áp dụng cả hai tùy chọn. Hầu hết máy khách Linux thì không: chúng cần một tích hợp trình phân giải được hỗ trợ như hook update-resolv-conf của bản phân phối hoặc cách xử lý DNS của NetworkManager, hoặc một miền tìm kiếm và máy chủ tên đặt thủ công. Hãy kiểm tra trình phân giải thực tế của máy khách thay vì giả định push đã được tuân thủ, vì một push bị bỏ qua trông giống hệt một máy chủ không trả lời.

Kiểm chứng ở ba lớp

Hỏi máy chủ trực tiếp trước, rồi một máy khách, rồi ứng dụng:

dig +short @10.8.0.1 alice.corp.example
getent hosts files.corp.example

Nếu các truy vấn trực tiếp trả lời mà ứng dụng thì không, lỗi nằm ở việc bàn giao cho máy khách chứ không phải ở vùng. Nếu tên phân giải được mà kết nối vẫn thất bại, tên vẫn ổn và thứ tiếp theo cần xem là tuyến đường hoặc tường lửa.

Ghi hai loại cạnh cấu hình: tên nào được tạo, tên nào được ghim và mỗi tên phải khớp với chứng chỉ nào. Người tiếp theo thêm máy chủ sẽ sao chép mẫu đầu tiên họ tìm thấy.

Bài viết liên quan