Điểm:0

OpenVPN: Can't route to private network once connected to VPN tunnel

lá cờ cm

I'm trying to setup an OpenVPN server to allow tunnelling to a private network (192.168.0.0/16) but when my VPN client is connected it cannot reach hosts on this network. No firewall is currently setup for the network/all ports are open. The server running OpenVPN is assigned the IP 192.168.0.2 on the private network

server.conf

local 1.2.3.4
port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh.pem
auth SHA512
tls-crypt tc.key
topology subnet
server 10.8.0.0 255.255.255.0
server-ipv6 fddd:1194:1194:1194::/64
push "redirect-gateway def1 ipv6 bypass-dhcp"
push "route 192.168.0.0 255.255.0.0"
push "dhcp-option DNS 10.8.0.1"
ifconfig-pool-persist ipp.txt
keepalive 10 120
cipher AES-256-CBC
user nobody
group nogroup
persist-key
persist-tun
verb 3
crl-verify crl.pem
explicit-exit-notify

client.ovpn

client
dev tun
proto udp
remote 1.2.3.4 1194
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
auth SHA512
cipher AES-256-CBC
ignore-unknown-option block-outside-dns
block-outside-dns
verb 3
<ca>
REDACTED
</ca>
<cert>
REDACTED
</cert>
<key>
REDACTED
</key>
<tls-crypt>
REDACTED
</tls-crypt>

Client connected to the OpenVPN server can ping the OpenVPN gateway as well as using its IP on the other subnet. However it can't ping a different host on the same network...

[26/10/21 19:58:32] user@client:~$ ping 10.8.0.1
PING 10.8.0.1 (10.8.0.1) 56(84) bytes of data.
64 bytes from 10.8.0.1: icmp_seq=1 ttl=64 time=27.3 ms
^C
--- 10.8.0.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 27.276/27.276/27.276/0.000 ms
[26/10/21 19:58:49] user@client:~$ ping 192.168.0.2
PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data.
64 bytes from 192.168.0.2: icmp_seq=1 ttl=64 time=27.3 ms
^C
--- 192.168.0.2 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 27.271/27.271/27.271/0.000 ms
[26/10/21 19:58:52] user@client:~$ ping 192.168.0.3
PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data.
^C
--- 192.168.0.3 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

OpenVPN server can ping a different host on the same network...

root@server:~# ping 192.168.0.3
PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data.
64 bytes from 192.168.0.3: icmp_seq=1 ttl=63 time=1.26 ms
^C
--- 192.168.0.3 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 1.262/1.262/1.262/0.000 ms

OpenVPN server route table...

root@server:~# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         172.31.1.1      0.0.0.0         UG    100    0        0 eth0
10.8.0.0        0.0.0.0         255.255.255.0   U     0      0        0 tun0
172.31.1.1      0.0.0.0         255.255.255.255 UH    100    0        0 eth0
192.168.0.0     192.168.0.1     255.255.255.0   UG    0      0        0 ens10
192.168.0.1     0.0.0.0         255.255.255.255 UH    0      0        0 ens10

192.168.0.3 routing table...

root@server:~# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         _gateway        0.0.0.0         UG    100    0        0 eth0
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
_gateway        0.0.0.0         255.255.255.255 UH    100    0        0 eth0
192.168.0.0     192.168.0.1     255.255.0.0     UG    0      0        0 ens10
192.168.0.1     0.0.0.0         255.255.255.255 UH    0      0        0 ens10

Any help is appreciated.

Thanks.

Nikita Kipriyanov avatar
lá cờ za
Vui lòng hiển thị định tuyến trên các máy chủ khác với `192.168.0.2`. Đồng thời hiển thị bảng định tuyến trên hệ thống được đặt thành cổng mặc định của các máy chủ đó (có thể là `192.168.0.1`). Ngoài ra, *không bao giờ sử dụng `route`*, nó cổ, gây hiểu lầm và thực sự khó đọc. Xóa `net-tools` ngay lập tức (nhân tiện, Debian 10 và 11 đã có sẵn theo mặc định mà không có gói này, vì vậy nó chắc chắn không cần thiết). Luôn sử dụng `ip route` và các tính năng khác của `iproute2`, đây là cách thích hợp để định cấu hình và làm việc với ngăn xếp mạng Linux "hiện đại" (khoảng năm 2000).
Nikita Kipriyanov avatar
lá cờ za
Tôi sẽ làm hỏng suy nghĩ: Tôi nghi ngờ không có gì sai với đường dẫn từ 10.8.x.x đến 192.168.0.x, nhưng có một số vấn đề theo hướng ngược lại. Đó là các gói ngược lại không thể được gửi, không được chuyển tiếp.
Mark Hingston avatar
lá cờ cm
Cảm ơn @NikitaKipriyanov. Tôi đã cập nhật câu hỏi của mình với bảng định tuyến cho 192.168.0.3. Đã lưu ý về việc sử dụng `ip route`. Tôi không biết cách cập nhật bảng định tuyến cho các máy chủ trên mạng LAN cho cấu hình này.
Nikita Kipriyanov avatar
lá cờ za
Nói chung, bạn chạy một dịch vụ VPN *trên bộ định tuyến*, chẳng hạn như cổng mặc định cho một số mạng LAN. Hoặc trên một bộ định tuyến khác, nhưng thứ là cổng phải có một tuyến dành riêng cho VPN thông qua nó. // Và bạn vẫn đang sử dụng route.Hãy giết thói quen này bằng lửa, điều này còn tệ hơn hút thuốc. Nghiêm túc mà nói, Docker sẽ không thể thực hiện được nếu không có chức năng của `ip route`, vì tiện ích `route` không biết gì về không gian tên mà Docker được xây dựng trên đó. ifconfig, route, iptunnel, tunctl, brctl, vconfig – tất cả những thứ này đã được thay thế và không được sử dụng nữa.
Điểm:1
lá cờ bq

Giao thức Internet chỉ nhìn vào địa chỉ IP đích khi định tuyến các gói. Họ không quan tâm một gói đến từ đâu. Họ không quan tâm rằng gói có thể là một phần của phiên hoặc kết nối hoặc ứng dụng lớn hơn. Điều duy nhất quan trọng là địa chỉ IP đích. IP sau đó nhìn vào bảng định tuyến để xác định phải làm gì với từng gói, chỉ dựa trên địa chỉ đích. (Về mặt kỹ thuật, những thứ như tường lửa đầy đủ trạng thái và định tuyến kiểm soát có thể khiến điều này trở thành lời nói dối, nhưng nó sẽ phù hợp với các mục đích hiện tại.)

Như @Nikita đã chỉ ra và đầu ra của tuyến đường(8) chương trình, máy chủ như 192.168.0.3 (và, có lẽ, các máy chủ khác trên mạng của bạn) chỉ biết gửi các gói đến bộ định tuyến của bạn tại 192.168.0.1. Họ không có gì để yêu cầu họ gửi các gói đến hệ thống OpenVPN của bạn tại 192.168.0.2.. Cho nên .3 và bạn bè sẽ gửi tất cả lưu lượng truy cập của họ đến bộ định tuyến của bạn. Bộ định tuyến của bạn không biết về VPN của bạn. Bộ định tuyến của bạn sẽ loại bỏ các gói hoặc gửi chúng đến Internet công cộng (nơi bộ định tuyến chặng tiếp theo có thể sẽ loại bỏ nó).

Có nhiều giải pháp khả thi.

Giải pháp số 1 - Dễ dàng nhưng không hiệu quả

Nói với bộ định tuyến của bạn rằng 10.8.0.0/24 có thể truy cập thông qua cổng tại 192.168.0.2. Điều này sẽ dẫn đến một lộ trình kẹp tóc - các gói sẽ đi từ các máy chủ như .3, tới giao diện mạng LAN của bộ định tuyến tại .1, sau đó sao lưu cùng một giao diện bộ định tuyến và tới cổng OpenVPN tại .2. Điều này là không hiệu quả, nhưng nên làm việc.

Bạn không nói bộ định tuyến của mình là gì, nhưng nếu đó là Linux, lệnh sẽ giống như:

tuyến ip thêm 10.8.0.0/24 qua 192.168.0.2

Giải pháp #2 - Không xâm phạm nhưng tẻ nhạt

Bạn có thể định cấu hình một tuyến tĩnh trên mỗi máy chủ LAN, cho chúng biết thông tin định tuyến giống như #1, nhưng ở mọi nơi. Đây sẽ là một khó khăn nhỏ để định cấu hình và bảo trì, nhưng sẽ là giải pháp hiệu quả nhất giúp duy trì cấu trúc liên kết mạng hiện tại của bạn. Lệnh tương tự như trên (dành cho Linux), nhưng bạn phải chạy nó trên mọi máy chủ LAN. Bạn cũng cần làm điều đó trên tất cả các thiết bị khác sẽ hoạt động qua VPN, bao gồm hộp Windows, máy in, máy tính bảng, điện thoại, bóng đèn wifi, v.v. Cuối cùng, bạn sẽ quên một thiết bị và tự hỏi tại sao nó không hoạt động, hãy dành thời gian kéo mái tóc của bạn ra, và sau đó cảm thấy như một dope khi bạn nhớ tại sao.

Giải pháp #3 - Tinh vi nhưng đột phá

Bạn có thể đặt cổng VPN của mình trên đường dẫn định tuyến tới Internet. Có hai lựa chọn thay thế phụ ở đây.

Giải pháp #3A - VPN trên bộ định tuyến

Ngay cả các bộ định tuyến của người tiêu dùng đôi khi cũng có thể chạy triển khai OpenVPN ngày nay, đặc biệt nếu bạn sử dụng chương trình cơ sở của bên thứ ba (OpenWRT, DD-WRT, v.v.). Tuy nhiên, chúng thường thiếu mã lực CPU để có hiệu suất phù hợp. Bạn cũng có thể thay thế người tiêu dùng bằng thứ gì đó tốt hơn -- một bộ định tuyến thương mại hoặc một Linux khác. Bạn thậm chí có thể thử lại cổng VPN của mình dưới dạng VPN+bộ định tuyến+tường lửa.

Trong trường hợp này, VPN và bộ định tuyến giống nhau, vì vậy bạn không phải lo lắng về việc bộ định tuyến có khớp với cổng VPN hay không. Điều này có thể là hiệu quả nhất, về mặt thiết kế mạng.

Giải pháp #3B - Cổng ngăn xếp và Bộ định tuyến

Bạn có thể đặt cổng VPN giữa bộ định tuyến và phần còn lại của mạng LAN, với các mạng con IP khác nhau ở hai bên của cổng VPN. Tất cả các máy chủ LAN khác gửi đến cổng VPN để truy cập Internet. Cổng VPN gửi và chuyển tiếp đến bộ định tuyến để truy cập Internet.

Điều này sẽ yêu cầu đặt hai giao diện mạng trong cổng VPN -- một cho mạng LAN và một cho chuyển giao cho rotuer. (Hoặc thực hiện một lộ trình kẹp tóc trên cổng VPN, điều này còn tệ hơn #1 vì bây giờ tất cả các Lưu lượng truy cập Internet đang kẹp tóc).

Ưu điểm chính của phương pháp này là: Bạn có thể giữ bộ định tuyến hiện tại của mình (có thể ISP của bạn khiến bạn sử dụng thiết bị của họ, có thể nó có một số thuộc tính hữu ích khác cho bạn). Nếu hộp VPN bị hỏng, bạn có thể kéo nó ra khỏi bức tranh và (có thể) nhanh chóng định cấu hình lại bộ định tuyến để thế chỗ.

Mark Hingston avatar
lá cờ cm
Rất hữu ích cảm ơn bạn
Ben Scott avatar
lá cờ bq
@MarkHingston: Tôi rất vui vì bạn thấy điều này hữu ích. Nếu bạn cần thêm trợ giúp, vui lòng thêm thông tin cụ thể vào nhận xét và/hoặc sửa lại câu hỏi của bạn. Nếu bạn cho rằng câu hỏi của mình đã được giải quyết, vui lòng [chấp nhận câu trả lời](https://stackoverflow.com/help/someone-answers).

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.