如何透過 OpenVPN 存取單一本機?

如何透過 OpenVPN 存取單一本機?

這看起來是一個微不足道的問題,但我找不到答案。

在我的 LAN(圖中藍色)中,我有一個 NAS 和一個 Raspberry Pi,以及其他機器。我在 Raspberry Pi 中安裝了 OpenVPN 伺服器。我希望 OpenVPN 用戶端能夠存取 NAS,即 FTP、HTTP 等。

在這張圖中你有我的網路拓樸:

網路拓撲

我可以將 OpenVPN 用戶端連接到其伺服器。我知道存在子網路衝突,但無法更改子網路。

我的伺服器配置:

port 1194
proto udp
dev tun

ca /etc/openvpn/easy-rsa/keys/ca.crt
cert /etc/openvpn/easy-rsa/keys/myserver.crt
key /etc/openvpn/easy-rsa/keys/myserver.key
dh /etc/openvpn/easy-rsa/keys/dh1024.pem

server 10.8.0.0 255.255.255.0
#push "route 192.168.1.0 255.255.255.0"

ifconfig-pool-persist /etc/openvpn/easy-rsa/ipp.txt

keepalive 10 120
cipher AES-128-CBC
persist-key
persist-tun

status /var/log/openvpn-status.log
#log         /var/log/openvpn.log
log-append  /var/log/openvpn.log
verb 3

我的客戶端設定檔:

client

remote x.y.z.t 1194
proto udp
dev tun

ca /etc/openvpnclient/ca.crt
cert /etc/openvpnclient/client.crt
key /etc/openvpnclient/client.key

cipher AES-128-CBC

#route-method exe
#route-delay 3
#route 10.8.0.0 255.255.255.0
###route-nopull
route 192.168.1.20 255.255.255.255

resolv-retry infinite
nobind
persist-key
persist-tun

mute 20
verb 3

我可以使用 Windows 用戶端進行連接,但無法 ping 通或存取 NAS。我確信我仍然缺少一些東西,但不知道如何路由流量。我已經閱讀了許多有關該主題的主題,但仍然沒有運氣。

如果需要,我應該能夠在 OpenVPN 伺服器網路上的路由器中新增路由規​​則。


更新於 18/11/2019 @17.31 CET

我有兩個主要要求:

  1. 我需要用戶端存取 NAS,但不需要存取 LAN 上的其他電腦;
  2. 我需要客戶端即使在其子網路與 NAS 子網路(即 192.168.1.0/24)衝突時也能夠連線。

湯姆延和本文幫我解決了第一個問題。我相信第二個問題仍然沒有被發現。

問題 #1 的解決方案:

在伺服器設定中,我需要新增(取消註解)此行,以確保將請求從 OpenVPN 用戶端路由到 NAS:

push "route 192.168.1.0 255.255.255.0"

為了啟用從 NAS 回 OpenVPN 用戶端的路由,我新增了此路由規則在網路儲存中:

vi /etc/sysconfig/network-scripts/route-eth0

在該(空)設定檔中新增此行

10.8.0.0/24 via 192.168.1.88

service network restart保證靜態路由的應用。

之後我就限制了交通在樹莓派中透過 iptables。我實際上將其永久安裝iptables-persistent並關注本指南

iptables -A FORWARD -i tun0 -s 10.8.0.0/24 -d 192.168.1.20 -j ACCEPT


更新#2

是的,我需要許多客戶端才能連接,因此我想我應該避免 NAT 和偽裝。

答案1

您需要新增一條路由10.8.0.0/24(網關所在的位置192.168.1.88,即Rasp.PiOVPN 伺服器)到 或NASROUTER當然假設ROUTER是這種情況下的預設閘道NAS),以便NAS/ROUTER知道將回覆流量定向到哪裡。

如果不能,則需要執行SNAT/ MASQUERADEwith iptables(或者nftables,當然) on Rasp.Pi,以便來自 VPN 用戶端的所有流量看起來都源自伺服器。

用戶端不能存取除 Raspberry 和 NAS 本身之外的任何機器。

確保使用 限制轉送流量iptables。一旦您啟用了 IP 轉送Rasp.Pi(您必須這樣做,否則 VPN 用戶端將無法到達其 LAN),則用戶端可以新增他/她到達伺服器 LAN 中的某個主機所需的任何路由,因此不需要推動某些路線不會幫助你實現這個目標。

更新:

若要啟用 IP 轉送(並使設定在啟動後保持不變):

sysctl -w net.ipv4.ip_forward=1
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf

在這種情況下僅允許您需要的轉發(eth0tun0假設):

iptables -F FORWARD
iptables -P FORWARD DROP
iptables -A FORWARD -m conntrack --ctstate NEW -i tun0 -s 10.8.0.0/24 -o eth0 -d 192.168.1.20 -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

若要執行來源 NAT 來轉送通過 發出的流量(這樣您就不必在NAS/上設定回傳路由ROUTEReth0

iptables -t nat -F POSTROUTING

(如果您還需要鏈中的其他規則,請跳過上述內容)

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

或者,如果 的 IPeth0在一段時間內/啟動後保持不變:

iptables -t nat -A POSTROUTING -o eth0 -j SNAT 192.168.1.88

PS 如果你想刷新你接觸過的表,你可以這樣做:

for i in $(cat /proc/net/ip_tables_names); do iptables-restore /usr/share/iptables/empty-"$i".rules; done

另請注意,iptables命令在啟動時不會持久存在,因此您需要將規則儲存到檔案中iptables-save(並在啟動時配置系統以透過某種方式在啟動時恢復它們)。

更新2:

您確實應該檢查上面的內容,以了解如何正確配置FORWARD鏈(在filter表中)。如果沒有DROP策略(或DROP最後的「預設」規則),任何ACCEPT規則都將毫無用處。 (一旦你修復了這個部分,你的規則就不夠了DROP

為了避免子網路(更準確地說,路由)衝突,最好推送主機路由(無論如何這都是您需要的)而不是子網路路由,因此您應該push "route 192.168.1.20 255.255.255.255"(子網路遮罩實際上可以省略),因為有機會用戶端主機將具有到 LAN 主機(預設閘道除外)的主機路由要低得多(當將非/32位址指派給介面時,在 Linux 上總是新增子網路路由)。

例如,您也可以push "route 10.8.1.1"DNAT目的地設定為192.168.1.20on Rasp.Pi,以應對用戶端上已存在路由的極端情況192.168.1.20(然後您應該仍然可以使用 進行存取NAS10.8.1.1

iptables -t nat -A PREROUTING -d 10.8.1.1 -j DNAT --to-destination 192.168.1.20

相關內容