Bảo vệ vòng lặp thông thường là một tuyến host: gửi lưu lượng tới địa chỉ công khai của máy chủ VPN ra ngoài qua uplink để phiên mã hóa không bao giờ đi vào đường hầm của chính nó. Điều đó hoạt động cho tới đúng lúc bạn cũng muốn chạm tới một dịch vụ web trên cùng máy chủ đó qua đường hầm, vì ngoại lệ gắn với đích đến và đích đến là như nhau. Lối thoát là thôi phân loại theo đích đến và bắt đầu phân loại theo socket nào đã gửi gói tin.

Bắt đầu với hai luồng bạn muốn tách ra

Một luồng là bản thân phần vận chuyển OpenVPN đã mã hóa, thứ phải ra ngoài qua uplink, nếu không đường hầm sẽ mang chính kết nối ngoài của nó. Luồng còn lại là một yêu cầu HTTPS thông thường tới cùng địa chỉ công khai, thứ bạn muốn nằm trong đường hầm để nó tới dịch vụ từ một nguồn đường hầm. Cùng đích đến, nhiều khi cùng số cổng, đường đi yêu cầu khác nhau.

Trong phần này, giả sử có một máy khách ở 10.90.0.10 qua tun1, địa chỉ công khai của máy chủ là 198.51.100.25, và bảng chính chưa bị động tới với tuyến mặc định trỏ ra uplink thông thường. Phía máy chủ cũng phải chấp nhận dịch vụ web trên đường đi bên trong và trả lưu lượng về nguồn đường hầm; việc gửi gói tin tới một địa chỉ công khai không vô hiệu hóa trình lắng nghe hay chính sách tường lửa của máy chủ.

Trước khi thay đổi bất cứ điều gì, hãy ghi lại các quy tắc hiện tại của máy chủ và chọn những giá trị không ai khác dùng: một dấu, một số bảng và ba độ ưu tiên quy tắc. Giữ một đường quay lại máy không đi qua kết nối này, vì một sai sót ở đây sẽ lấy đi quyền truy cập từ xa của chính bạn chứ không chỉ làm hỏng một thẻ trình duyệt.

Đánh dấu socket mang phong bì

Cấu hình máy khách nhận một dấu cho các gói tin đi ra đã mã hóa và thôi tự cài đặt tuyến, để chính sách thay thế là thứ duy nhất quyết định đường đi:

mark 42
route-noexec
disable-dco

Số thập phân 42 là số thập lục phân 0x2a, và dạng thập lục phân chính là thứ các quy tắc định tuyến sẽ khớp. Tài liệu link-options mô tả mark áp dụng cho các gói tin đi ra đã mã hóa trên Linux, tức đúng socket mà bạn cần kiểm soát đường đi. Việc tắt offload kênh dữ liệu giữ ví dụ này trên đường đi không gian người dùng, nơi hành vi của dấu là hành vi được mô tả.

route-noexec chặn việc thêm và xóa tuyến tự động của OpenVPN. Nó không cài gì thay vào chỗ đó, nên từ lúc này chủ sở hữu tuyến phải duy trì mọi tuyến mà đường hầm cần. Nếu một đích riêng biến mất sau thay đổi, đó là chính sách thay thế còn thiếu, không phải lỗi ở dấu.

Đừng giữ tuyến host trong bảng chính cho 198.51.100.25 trong khi làm việc này. Một tuyến như vậy đưa trở lại đúng ngoại lệ mà thiết kế đang cố thu hẹp, và nó sẽ thắng cho luồng HTTPS trước khi bất kỳ chính sách nào bên dưới được hỏi tới.

Gửi mọi thứ còn lại vào bảng đường hầm

Khi giao diện đường hầm đã tồn tại và giữ địa chỉ của nó, chính sách trông như sau:

ip -4 route add default dev tun1 src 10.90.0.10 table 47100
ip -4 rule add priority 20000 lookup main suppress_prefixlength 0
ip -4 rule add priority 20001 not fwmark 0x2a lookup 47100
ip -4 rule add priority 20002 not fwmark 0x2a unreachable

Quy tắc đầu tiên giữ các tuyến cụ thể của máy chủ hiển thị, kể cả mạng cục bộ đã được phê duyệt, đồng thời làm tuyến mặc định của bảng chính trở nên vô hình với lần tra cứu này. Sự khác biệt đó quan trọng: chặn tuyến mặc định không giống với bỏ qua bảng, và những ngoại lệ cục bộ bạn vẫn cần tồn tại chính nhờ điều đó. Hãy đọc từng ngoại lệ một thay vì cho rằng kết quả là một công tắc dừng vạn năng.

Lưu lượng chưa đánh dấu sau đó rơi vào bảng đường hầm, lấy nguồn đường hầm và ra ngoài qua VPN. Lưu lượng đã đánh dấu trượt bài kiểm tra fwmark ở hai quy tắc tiếp theo và tiếp tục tới lần tra cứu chính thông thường thấp hơn trong danh sách, nơi tuyến mặc định của uplink vẫn còn. Quy tắc unreachable cuối cùng là thứ ngăn một luồng chưa đánh dấu lặng lẽ rơi trở lại uplink khi thiếu tuyến đường hầm. Bộ chọn là dấu từ đầu đến cuối, và địa chỉ đích không bao giờ đi vào quyết định.

Giữ chốt chặn đó tại chỗ qua các lần ngắt kết nối, và cài nó cùng với phần còn lại của chính sách thay vì làm bằng tay. Một quy tắc biến mất cùng giao diện không phải chính sách, đó là sự tình cờ. Xóa chính sách khi đường hầm sụp làm thay đổi chế độ hỏng từ “bị chặn” sang “bị rò”, và một tuyến đường hầm cũ hết hạn sau đó là vấn đề dễ giải thích hơn nhiều so với lưu lượng thoát ra qua giao diện sai.

Để đường về thấy cùng một dấu

Dấu đi ra chỉ là một nửa cơ chế, và đây là phần mà hầu hết các bản tái tạo bỏ sót. Các câu trả lời cho phiên mã hóa tới trên uplink và chịu sự kiểm tra đường về, thứ hỏi liệu nguồn có được định tuyến ngược lại theo đúng đường đã tới không. Không có trợ giúp, lần tra cứu đó áp dụng chính sách đường hầm chưa đánh dấu của bạn và kết luận gói tin đang ở giao diện sai.

Bản sửa thuộc về chủ sở hữu tường lửa: lưu dấu trên kết nối đi ra, khôi phục nó lên các gói tin đi vào khớp, và bật xử lý dấu có xác thực nguồn cho đường đi liên quan. Việc OpenVPN đặt dấu socket không làm gì trong ba điều đó, và một công thức chỉ liệt kê các tùy chọn máy khách là chưa đầy đủ. Hãy yêu cầu tích hợp đó bằng văn bản, vì đó là phần ít thấy nhất của thiết kế và dễ mất nhất khi làm lại.

Kiểm tra đường về lỏng lẻo cũng không phải thứ thay thế. Chế độ lỏng vẫn cần một tuyến tồn tại cho nguồn, và chốt chặn unreachable bạn thêm vào cố ý loại bỏ một tuyến cho các lần tra cứu chưa đánh dấu. Hãy hoàn tất và rà soát tích hợp dấu kết nối trước khi dựa vào thiết kế này, và coi bộ lọc máy chủ là câu hỏi riêng: dấu là tín hiệu định tuyến, không phải sự cho phép. Nếu thiếu tích hợp, triệu chứng là một phiên thiết lập được rồi im lặng ngay khi các câu trả lời bắt đầu tới.

Chứng minh bằng hai lần tra cứu tuyến

So sánh điều nhân chạy quyết định cho hai ngữ cảnh, và đọc các trường dev và src thay vì trạng thái thoát:

ip -4 route get 198.51.100.25
ip -4 route get 198.51.100.25 mark 0x2a

Lần tra cứu đầu nên phân giải tới tun1 với nguồn đường hầm, và lần thứ hai tới uplink. Đây là các lần tra cứu tổng hợp, nên chúng chứng minh chính sách chứ không phải tiến trình đang chạy: hãy xác nhận riêng đường vận chuyển thực tế của máy khách đang chạy, rồi thực hiện một yêu cầu HTTPS thật với kiểm tra chứng chỉ vẫn bật.

Ghi lại những gì thiết kế không bao phủ trước khi tuyên bố hoàn tất. DNS, IPv6 và vòng đời của các quy tắc mỗi thứ cần quyết định riêng, và đây là ví dụ định tuyến IPv4 chứ không phải cấu hình riêng tư đầy đủ. Giá trị của nó là bộ chọn: phong bì nhận ngoại lệ uplink, và một dịch vụ thông thường ở cùng địa chỉ không phải thừa hưởng nó.

Bài viết liên quan