Định tuyến một subnet LAN qua OpenVPN và giữ tuyến mặc định
Giữ tuyến mặc định của LAN trong khi một subnet đi qua đường hầm. So sánh bảng chính sách với các sửa đổi bảng chính, rồi chọn NAT hoặc tuyến phía máy chủ.
Các máy vừa định tuyến cho LAN vừa quay số VPN rơi vào cùng một cuộc tranh luận với chính mình: đường hầm muốn sở hữu tuyến mặc định, còn LAN cần lấy lại nó. Khi OpenVPN kết nối, nó có thể cài một tuyến mặc định qua đường hầm hoặc một cặp nửa tuyến mặc định, điều đúng cho laptop nhưng sai cho một cổng mà hàng xóm mong nhận trả lời từ địa chỉ LAN của nó. Câu trả lời không phải là bỏ qua VPN. Câu trả lời là cho hai quyết định hai bảng khác nhau.
Một tuyến mặc định, hai chủ sở hữu
Lưu lượng được chuyển tiếp và lưu lượng phát sinh cục bộ không nhất thiết phải đi cùng một đường. Các máy khách LAN chỉ cần đường hầm cho những đích bạn chọn, trong khi các phiên quản trị của chính máy chủ và các trả lời của nó cho những máy khách đó cần tuyến mặc định của LAN. Trộn cả hai vào bảng chính sẽ áp đặt một câu trả lời cho hai câu hỏi khác nhau.
OpenVPN có một công tắc dành riêng cho việc này. route-noexec ngăn máy khách chạm vào bảng chính, và các giá trị mà nó lẽ ra dùng được xuất sang một script route-up dưới dạng route_vpn_gateway, dev và địa chỉ giao diện. Sau đó bạn quyết định bảng nào nhận tuyến nào, trong mã bạn có thể đọc lại sau này.
Bảng chính sách so với việc viết lại bảng chính
| Approach | What it buys | What it costs |
|---|---|---|
| Separate table plus source rule | LAN traffic and host traffic keep independent defaults | Every lookup now depends on rule order |
| Editing the main table only | Fewer moving parts on a single-purpose host | One mistake takes the gateway offline entirely |
| Two half-default routes | Works for a full-tunnel client | Ambiguous on a host that must answer on its LAN address |
Bảng riêng là lựa chọn duy nhất mở rộng ra ngoài một subnet. Đặt tên cho nó một lần, rồi tham chiếu bằng tên để không ai phải nhớ một con số:
echo "10 vpn" >> /etc/iproute2/rt_tables
ip rule add from 192.168.50.0/24 table vpn
ip route add default via 10.8.0.1 dev tun0 table vpnCác địa chỉ ở đây là chỗ giữ chỗ. Thay tiền tố LAN, cổng của đường hầm và tên thiết bị từ triển khai của bạn trước khi chạy bất cứ thứ gì.
Quy tắc cũng phải khớp với máy chủ
Một quy tắc chỉ khớp với tiền tố LAN bao phủ các gói được chuyển tiếp. Nó không bao phủ lưu lượng do chính cổng tạo ra, cũng không bao phủ các trả lời gửi về cho máy khách LAN, vốn mang địa chỉ LAN của cổng làm nguồn. Những tra cứu đó rơi xuống main và vẫn có thể ra ngoài qua đường hầm.
Thêm quy tắc thứ hai cho địa chỉ LAN của chính cổng, hoặc mở rộng quy tắc đầu tiên thành một tập bao gồm cả hai. Thứ tự quan trọng: đặt quy tắc cụ thể hơn lên trước và kiểm tra kết quả bằng một tra cứu nêu rõ nguồn.
ip route get 203.0.113.9 from 192.168.50.1Nếu nó báo thiết bị đường hầm cho một đích lẽ ra phải ở cục bộ, thì tập quy tắc sai bất kể bảng chứa gì.
NAT hay một tuyến ở phía bên kia
Máy chủ VPN biết subnet của đường hầm và không biết gì khác. Các gói đến với địa chỉ nguồn LAN không có đường về trừ khi ai đó cung cấp một đường, và có đúng hai cách để cung cấp. Thêm một tuyến cho tiền tố LAN trên máy chủ giữ nguồn gốc hiển thị từ đầu đến cuối, điều mà một thiết kế đã được kiểm toán thường muốn. Việc masquerade trên cổng viết lại nguồn thành địa chỉ đường hầm và không cần sự hợp tác nào từ máy chủ.
iptables -t nat -A POSTROUTING -s 192.168.50.0/24 -o tun0 -j MASQUERADEChọn NAT khi bạn không kiểm soát máy chủ và không thể thêm tuyến ở đó. Chọn tuyến phía máy chủ khi nhật ký, kiểm soát truy cập hoặc tính đối xứng của đường về quan trọng, vì masquerade xóa địa chỉ gốc khỏi mọi thứ phía bên kia ghi lại.
Dù thế nào, chuyển tiếp phải được bật, và lọc đường ngược nghiêm ngặt có thể loại bỏ trả lời khi main không chọn đường hầm cho nguồn đó. Kiểm tra giá trị thực tế trước khi đổ lỗi cho đường hầm.
Làm cho sự phân tách sống sót qua lần kết nối lại
Các quy tắc và tuyến thêm bằng tay biến mất khi giao diện được tạo lại, và một mục bảng cũ có thể sống lâu hơn phiên đã biện minh cho nó. Đặt quy tắc bảng, tuyến của đường hầm và mục masquerade vào script route-up của máy khách, và xóa bảng ở đầu script để một cổng cũ không thể sống sang phiên mới.
Xác minh từ cả hai đầu: một tra cứu trên cổng với nguồn LAN, và một yêu cầu thật từ máy khách LAN đến một đích phải đi qua đường hầm. Một tuyến tồn tại nhưng không bao giờ được chọn hành xử đúng như không có tuyến nào, cho đến khi bạn đọc các bộ đếm.