這看起來是一個微不足道的問題,但我找不到答案。
在我的 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
我有兩個主要要求:- 我需要用戶端存取 NAS,但不需要存取 LAN 上的其他電腦;
- 我需要客戶端即使在其子網路與 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.Pi
OVPN 伺服器)到 或NAS
(ROUTER
當然假設ROUTER
是這種情況下的預設閘道NAS
),以便NAS
/ROUTER
知道將回覆流量定向到哪裡。
如果不能,則需要執行SNAT
/ MASQUERADE
with 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
在這種情況下僅允許您需要的轉發(eth0
並tun0
假設):
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
/上設定回傳路由ROUTER
)eth0
:
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.20
on Rasp.Pi
,以應對用戶端上已存在路由的極端情況192.168.1.20
(然後您應該仍然可以使用 進行存取NAS
)10.8.1.1
:
iptables -t nat -A PREROUTING -d 10.8.1.1 -j DNAT --to-destination 192.168.1.20