这看起来像是一个微不足道的问题,但我还没有找到答案。
在我的局域网(图中蓝色部分)中,我有一个 NAS 和一个 Raspberry Pi,还有其他机器。我在 Raspberry Pi 中安装了一个 OpenVPN 服务器。我希望 OpenVPN 客户端能够访问 NAS,也就是 FTP、HTTP 等。客户端必须不能访问除 Raspberry 和 NAS 本身之外的任何机器。
在这张图片中你有我的网络拓扑:
我可以将 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 服务器网络上的路由器中添加路由规则。
更新时间:2019 年 11 月 18 日 @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 客户端,我添加了此路由规则在 NAS 中:
vi /etc/sysconfig/network-scripts/route-eth0
在该(空)配置文件中添加此行
10.8.0.0/24 via 192.168.1.88
并service network restart
确保静态路由被应用。
之后我限制了交通在 Raspberry Pi 中通过 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
(或者,当然)来执行,以便来自 VPN 客户端的所有流量看起来都来自服务器。MASQUERADE
iptables
nftables
Rasp.Pi
客户端不能能够访问除 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
为了避免子网(更准确地说是路由)冲突,最好推送主机路由(无论如何这都是您所需要的)而不是子网路由,因此您应该(实际上可以省略子网掩码)代替,因为客户端主机具有到 LAN 主机(默认网关除外)的主机路由的可能性要低得多(在 Linux 上,当为接口分配push "route 192.168.1.20 255.255.255.255"
非地址时,始终会添加子网路由)。/32
您还可以例如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