Máy khách OpenVPN đứng khi máy chủ của nó chạy trên cùng một máy chủ
Hai phiên bản OpenVPN trên một máy chủ tranh nhau cùng một cổng cục bộ và cùng một bảng định tuyến. Ghim cổng, tách các thiết bị và kiểm tra bảng nào thắng.
Tôi có một máy phòng thí nghiệm nhận một đường hầm từ một trang từ xa và đồng thời quay số ra mạng của nhà cung cấp. Hồ sơ gửi đi đã hoạt động trong nhiều tuần. Sau khi máy chủ nhận vào được thêm, cái gửi đi đã kết nối rồi ngừng truyền lưu lượng trong vài giây, hoặc từ chối khởi động với lỗi địa chỉ đã được sử dụng. Các tệp cấu hình không thay đổi; máy chủ chỉ đơn giản có thêm tiến trình OpenVPN thứ hai với ý kiến riêng về cổng và tuyến.
Sự cố không ngẫu nhiên và không phải vấn đề xác thực. Hai daemon trên một máy tranh nhau cùng một socket cục bộ và cùng một bảng định tuyến, và cái khởi động hoặc kết nối lại sau cùng thường thắng. Biết mình đang gặp va chạm nào trong hai va chạm này sẽ quyết định nơi cần xem trước.
Đọc triệu chứng theo chiều ngược lại
Bắt đầu từ lúc đường hầm chết. Lỗi bind khi khởi động chỉ về phía lắng nghe: thứ gì đó đã sở hữu cổng đó, và OpenVPN từ chối khởi động thay vì chia sẻ nó. Một đường hầm đi lên rồi im lặng chỉ về định tuyến, vì một tuyến do phiên bản kia cài đặt có thể kéo các gói của kết nối bên ngoài ra khỏi đường đi của chúng.
Cả hai trường hợp tạo ra cùng một khiếu nại của người dùng, đó là lý do các vòng thử lại và script giám sát không sửa được gì. Chúng kết nối lại máy khách vào đúng cuộc xung đột đó. Câu hỏi đầu tiên hữu ích là tiến trình có còn chạy khi lưu lượng dừng lại không.
Một socket và một thiết bị cho mỗi phiên bản
Máy chủ lắng nghe liên kết cổng của nó; máy khách gửi đi cũng cần một cổng cục bộ cho lưu lượng được đóng gói của nó. Khi cả hai sống trên cùng một máy chủ, hành vi mặc định của máy khách có thể va chạm với cổng của máy chủ. Cổng cục bộ của máy khách có thể được ghim, và việc liên kết có thể được bỏ qua ở nơi đối tác không cần cổng nguồn cố định:
lport 1195
nobind
dev tun1Những con số đó là ví dụ, không phải yêu cầu. Điều quan trọng là máy khách ngừng tranh cổng của máy chủ và mỗi phiên bản nhận một thiết bị đường hầm riêng. Hai daemon dùng chung tun0 ghi đè trạng thái thiết bị của nhau ngay cả khi cổng của chúng khác nhau, nên một thiết bị cho mỗi đường hầm là bắt buộc.
nobind thuộc phía máy khách. Máy chủ vẫn phải liên kết và lắng nghe, vì vậy đừng sao chép dòng này vào cấu hình máy chủ, và đừng tắt liên kết trên máy khách mà đối tác của nó lọc theo cổng nguồn cố định.
Chọn một chủ sở hữu cho tuyến mặc định
Chỉ một kết nối có thể cài đặt tuyến mặc định. Nếu cả hai hồ sơ đều chuyển hướng toàn bộ lưu lượng, kết nối thứ hai sẽ thay thế kết nối thứ nhất một cách âm thầm, và kết nối thứ nhất có vẻ bị hỏng. Hoặc giữ đường hầm gửi đi được tách riêng và chỉ đẩy các tiền tố của nhà cung cấp, hoặc cấp cho nó một bảng định tuyến riêng.
ip rule add from 10.9.0.2 table 120
ip route add default dev tun1 table 120
ip route get 10.9.0.2Các địa chỉ và số bảng ở trên là chỗ giữ chỗ. Ngay sau khi thêm quy tắc, hãy xác nhận rằng địa chỉ của chính máy chủ VPN vẫn được phân giải qua bảng thông thường; một bảng bắt lưu lượng vận chuyển bên ngoài sẽ phá hỏng đường hầm mà nó lẽ ra phải bảo vệ, và vòng kết nối lại tiếp theo trông giống như một nhà cung cấp không đáng tin cậy.
Đối với một thiết lập phải chịu được việc kết nối lại và khởi động lại, không gian tên mạng là ranh giới vững chắc hơn. Máy khách thứ hai chạy trong không gian tên của riêng nó với các giao diện và tuyến riêng, và chỉ những dịch vụ cần vượt ranh giới mới được lộ ra. Máy chủ giữ một tuyến mặc định, và việc kết nối lại của không gian tên không thể ghi đè nó.
Xác minh bằng bảng, không phải dòng trạng thái
Một máy khách báo cáo đã kết nối chỉ chứng minh kênh điều khiển của nó. Ghi lại trạng thái định tuyến trước và sau mỗi lần kết nối, sau đó hỏi nhân hệ điều hành thiết bị nào mà một đích thực sẽ dùng:
ip route show
ip route get 10.40.0.20
ss -lunp | grep 1194Nếu thiết bị được chọn cho địa chỉ nhà cung cấp thay đổi khi đường hầm thứ hai khởi động, bạn có va chạm tuyến. Nếu cả hai tiến trình xuất hiện trên cùng một cổng cục bộ, bạn có va chạm socket. Sửa cái đầu mà không sửa cái thứ hai chỉ chuyển sự cố sang lần kết nối lại tiếp theo.
Ghi các cổng, thiết bị, bảng và chủ sở hữu tuyến vào runbook của máy chủ. Nếu không, người tiếp theo thêm đường hầm thứ ba sẽ phát hiện lại đúng va chạm đó, và bằng chứng duy nhất nhìn thấy được sẽ là một kết nối hoạt động cho đến khi daemon của người khác khởi động lại.