使用OpenVPN异地组网-下篇:访问客户端内网
1. 前言
本教程分为上下两篇,目录:
上篇中,我们完成了OpenVPN的安装和基本配置,这篇我们来实现访问家庭内网。
网络结构图:
2. VPN网关配置
连接到内网的Linux服务器上进行操作。
2.1 打开IP转发
编辑文件 /etc/sysctl.conf
,找到如下内容取消注释,如果没有可以自行添加:
net.ipv4.ip_forward=1
2.2 防火墙规则
使用命令 ip addr
查看本机网卡和openvpn的网卡,比如我这里,本机网卡是 eth0,openvpn的网卡是 tun0。
iptables -A FORWARD -i tun0 -o eth0 -s 192.168.230.0/24 -d 192.168.0.0/24 -j ACCEPT
iptables -A FORWARD -i eth0 -o tun0 -s 192.168.0.0/24 -d 192.168.230.0/24 -j ACCEPT
这里只配置动态ip网段的转发规则,没有配置静态网段的,因为我的所有使用静态ip的VPN客户端没有访问内网的需求,如果有需要,可以自行添加。
2.3 NAT伪装(可选)
重要
这一步为可选操作,如果选择使用NAT伪装,那么会简单很多,省很多事儿。你也不用给每个内网设备添加一个静态路由。如果不想太折腾,建议最好是使用NAT伪装。
iptables -t nat -A POSTROUTING -s 192.168.230.0/24 -d 192.168.0.0/24 -j MASQUERADE
同样的,这里也只配置动态ip网段。
3. 内网设备配置
重要
如果你选择使用NAT伪装,那么这一步就可以直接跳过!
注意
你需要给内网每台设备都添加一条静态路由。当然,如果没有访问某台内网设备的需求,则可以不添加,比如手机、电视、智能家居之类的。
为内网其它设备添加静态路由。
因为我们家中内网的设备,默认网关是192.168.0.1,但是如果流量从VPN用户发来,内网中的其它设备由于没有连接VPN,会将返回的数据发给192.168.0.1网关,192.168.0.1无法处理这个数据包,导致响应无法到达 VPN 用户。所以我们需要添加一条路由,告诉设备,来自VPN这个网段的数据,应该发送给192.168.0.200网关。
下面添加的路由中 192.168.0.200
就是 Linux服务器 内网ip。
3.1 Windows
route add 192.168.230.0 mask 255.255.255.0 192.168.0.200
如果你想重启后仍然生效,加上 -p
参数:
route -p add 192.168.230.0 mask 255.255.255.0 192.168.0.200
查看现有路由:
route print
删除一条路由:
route delete 192.168.230.0
3.2 Linux
sudo ip route add 192.168.230.0/24 via 192.168.0.200
如果你想开机自动添加,可以写入 /etc/network/interfaces
、/etc/netplan
、或 /etc/rc.local
,具体方式取决于你的发行版。
以 Debian12 为例:
编辑 /etc/network/interfaces
文件,添加 up
和 down
语句来设置和移除静态路由:
auto eth0
iface eth0 inet static
address 192.168.1.10
netmask 255.255.255.0
gateway 192.168.1.1
up ip route add 192.168.230.0/24 via 192.168.0.200
down ip route del 192.168.230.0/24 via 192.168.0.200
上述配置将在接口 eth0
启动时添加一条到 192.168.2.0/24
网络的静态路由,下一跳为 192.168.1.2
;在接口关闭时删除该路由。
保存并关闭文件后,重启网络服务以应用更改:
sudo systemctl restart networking
查看当前路由:
ip route
删除一条路由:
sudo ip route delete 192.168.230.0/24 via 192.168.0.200
注意
via
后面是你当时设置的下一跳(VPN 客户端的内网 IP)
3.3 macOS
注意
由于我没有 mac 电脑,无法验证是否有效
sudo route -n add 192.168.230.0/24 192.168.0.200
重启后会失效,想要永久保留可以通过 launchd 或 shell 脚本自启动。
删除一条路由:
sudo route -n delete 192.168.230.0/24 192.168.0.200
4. 最后
完成上述操作之后,我们就能成功通过VPN,在异地访问到内网的其它设备了🎉。