树莓派的机箱放到办公桌前面,总感觉风扇和硬盘声音太大了,尤其在晚上的时候,会显得很吵。所以将机箱放到偏僻的角落,这样会更加的安静。
如果你对树莓派集群感兴趣,可以看下这篇
如何在一个机箱中使用 8 台树莓派、2 个路由器、5 个风扇、2 个插板和 6 个硬盘,构建一个高效的集群?
当主机用有线网络在自己的局域网段内的时候,我发现和我的办公电脑的网段不一样的情况下,如果用 Wi-Fi 连接机箱中的网络,
信号会很弱
,而且电脑一般情况下只有一个无线网卡,那么我还得各办公电脑连接网线,这是很麻烦的。
有没有一种
能够把两个局域网连接起来的方式呢
? 其实是有的,很多公司在不同地点有办公区,都可以打通网络,那么今天我们用 OpenVPN 来实现两个局域网打通。
服务的部署是在一台树莓派上。
安装OpenVPN 并启动 Server 端
1. 安装
在终端窗口中依次输入以下命令:
(1) 更新软件包列表和软件包
sudo apt-get update #用于更新本地软件包列表
sudo apt-get upgrade #用于更新已安装的软件包
(2) 安装 OpenVPN
sudo apt-get install openvpn
(3) 安装 Easy-RSA
Easy-RSA 是一个证书管理工具,它通常用于创建和管理公钥证书以进行加密通信或用于 VPN 连接。Easy-RSA 常用于 OpenVPN 和 OpenSSL 等软件的证书创建和管理。
Easy-RSA 是一个方便快捷的证书管理工具,用于创建和管理公钥证书,保证加密通信的安全性。
sudo apt-get install easy-rsa
安装完之后,easy-rsa
在/usr/share/easy-rsa
目录下
也可以在 GitHub 下载:
GitHub - OpenVPN/easy-rsa: easy-rsa - Simple shell based CA utility
2. 生成 CA 证书以及服务端证书
安装完Easy-RSA
,进入/usr/share/easy-rsa/
目录。
cd /usr/share/easy-rsa/
(1)使用easyrsa工具初始化PKI(公共密钥基础设施)
sudo ./easyrsa init-pki
(2)构建一个根证书授权中心(CA)
sudo ./easyrsa build-ca
输入一个密码,这个密码后面前面 server 证书和 client 证书的时候会用到。
(3)生成 Server 端证书
sudo ./easyrsa gen-req server nopass
(4)对 server 证书用 CA 证书签名
sudo ./easyrsa sign-req server server
依次输入yes
和上个命令设置的 CA 证书密码
可以用sudo ls pki
查看一下刚才生成的内容
其中 private
文件夹中存放的是私钥,用sudo ls ./pki/private
,可以看到有 server 的证书
issued
文件夹中存放的是公钥。
将ca.crt
, server.crt
, server.key
三个内容复制到 /etc/openvpn
目录,命令如下:
sudo cp ./pki/ca.crt /etc/openvpn
sudo cp ./pki/issued/server.crt /etc/openvpn
sudo cp ./pki/private/server.key /etc/openvpn
3. 服务端配置文件
配置文件在/etc/openvpn/server.conf
, 用 vim 打开
sudo vim /etc/openvpn/server.conf
加入以下内容:
port 1194
proto udp
dev tun
ca /etc/openvpn/ca.crt
cert /etc/openvpn/server.crt
key /etc/openvpn/server.key
dh none
topology subnet
server 10.8.0.0 255.255.255.0
push "route 192.168.100.0 255.255.255.0"
ifconfig-pool-persist ipp.txt
push "dhcp-option DNS 192.168.100.1" # 这里改成你自己的 DNS 服务,或者公共的,比如 8.8.8.8 这种
# push "redirect-gateway def1 bypass-dhcp" #作用是让客户端所有的TCP/IP 流量都通过 VPN 连接转发到 OpenVPN 服务端,而不是通过客户机原本的网络。
keepalive 10 120
client-to-client
cipher AES-256-CBC
comp-lzo
client-to-client
persist-key
persist-tun
status /var/log/openvpn-status.log
verb 4
下面对参数进行解释一下:
• port 1194: OpenVPN 的服务端使用的端口号为 1194。
• proto udp: 使用 UDP 协议传输数据。
• dev tun: 使用虚拟网络设备。
• ca /etc/openvpn/ca.crt: CA 证书文件路径。
• cert /etc/openvpn/server.crt: 服务器证书路径。
• key /etc/openvpn/server.key: 服务器私钥路径。
• dh none: 使用静态密钥,而不是 DH 密钥交换。
• topology subnet: 使用子网拓扑。
• server 10.8.0.0 255.255.255.0: 分配给客户端的 IP 地址段。
• push "route 192.168.100.0 255.255.255.0": 推送路由到客户端,让客户端能够访问局域网内的 192.168.100.0/24 子网。
• ifconfig-pool-persist ipp.txt: 分配 IP 地址后将其持久化到文件中。
• push "dhcp-option DNS 192.18.0.2": 推送 DNS 服务器地址到客户端。
• keepalive 10 120: 使用心跳包保证连接的活性。
• client-to-client: 客户端间可以相互通信,而不仅仅是与服务端通信。
• cipher AES-256-CBC: 使用 AES-256 加密算法。
• comp-lzo: 启用 LZO 压缩,提高数据传输效率。
• persist-key, persist-tun: 重启后继续使用之前的密钥和虚拟网络设备。
• status /var/log/openvpn-status.log: 日志文件路径。
• verb 4: 日志详细级别为 4。启用更多的调试信息以获得有关 TLS 握手失败的更多详细信息
4. 启动服务端
sudo systemctl start openvpn
启动之后,查看一下状态,是否启动成功
sudo systemctl status openvpn
如下图所示的显示,表示启动成功了,如果不是这样,建议删除重新再安装。
配置开机自启动
sudo systemctl enable openvpn
如果修改了配置,想重启,用以下命令:
sudo systemctl daemon-reload
sudo systemctl restart openvpn
通常在修改或添加服务或守护程序的配置文件后需要执行 systemctl daemon-reload 命令重新加载服务状态和配置信息
客户端配置
1. 生成客户端证书
计划在 mac 电脑上使用,所以 mac 电脑算是客户端,创建证书的时候,我们将证书名叫macclient
生成证书:
cd /usr/share/easy-rsa
sudo ./easyrsa gen-req macclient nopass
证书签名:
sudo ./easyrsa sign-req client macclient
依次输入“yes” 和之前创建 CA 证书时输入的密码。
将证书移动到/etc/openvpn
目录
sudo cp ./pki/private/macclient.key /etc/openvpn
sudo cp ./pki/issued/macclient.crt /etc/openvpn
2. 给客户端生成一个.ovpn
文件
先进入到/etc/openvpn
目录,创建一个 client 目录
cd /etc/openvpn
sudo mkdir macclient
将 ca.crt
(CA 证书公钥), 客户端证书公钥(macclient.crt)、私钥(macclient.key)都复制到这个文件夹中
sudo cp ca.crt macclient
sudo cp macclient.crt macclient
sudo cp macclient.key macclient
然后添加一个macclient.ovpn
文件
sudo vim macclient/macclient.ovpn
内容如下:
client
dev tun
proto udp
remote 192.168.0.x 1194 # 这个 ip 换成 mac 能访问的树莓派 ip 地址,用于连接 OpenVPN server
#route-nopull # 这里注释了,不需要这个的好处是可以拉服务端的路由配置
route-metric 2000
route 192.168.100.0 255.255.255.0
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert macclient.crt
key macclient.key
comp-lzo
verb 4
至此已经配置完成
3. 在 mac 上使用.ovpn
文件,连接 OpenVPN server
在 Mac 上,客户有两个选择,一个是 OpenVPN
,另一个是Tunnelblick
, 下面以Tunnelblick
为例。
将上面步骤生成的 4 个文件ca.crt
macclient.crt
macclient.key
macclient.ovpn
,拷贝到 Mac 上,可以通过 scp
拷贝
scp -r [email protected]:/etc/openvpn/macclient dest
如果遇到权限问题,可以给/etc/openvpn/macclient
目录修改777
权限,如下命令:
sudo chmod -R 777 macclient
下载下来之后,可以将macclient.ovpn
文件拖动到Tunnelblick
配置中。
然后点击连接,结果处于“等待服务器回应状态”
不要慌,其实是防火墙的原因,可以先关闭树莓派的防火墙,试一下
树莓派关闭防火墙
在树莓派上关闭防火墙,可以按照以下步骤操作:
(1)打开终端或 SSH 到树莓派上。
(2)确认您是否有防火墙程序运行。树莓派通常默认没有安装防火墙程序。
(3)如果您已安装了防火墙程序,请停止该程序并禁用其自动启动。
(4)如果您使用的是 Raspbian 操作系统,则可以使用以下命令关闭防火墙:
sudo apt-get install ufw
sudo ufw disable
您将看到以下输出,表示防火墙已被禁用:
Firewall stopped and disabled on system startup
完成后,可以使用以下命令检查防火墙的状态:
sudo ufw status
此时输出应该显示防火墙已被禁用:
Status: inactive
这次很快就连接成功了。
防火墙的配置
我们上面为了快速,就关闭了防火墙,但是这样总归不安全,防火墙还是要开启的
sudo ufw enable
开启之后,咱们就又连不上 OpenVPN 的Server 了,要进行如下的配置
sudo iptables -A INPUT -p udp --dport 1194 -j ACCEPT
sudo iptables -A INPUT -p tcp -s 10.8.0.0/24 --dport 80 -j ACCEPT
貌似也很简单, 到这儿又可以连接了
连接完 vpn 之后,可以 ping 一下 OpenVPN server 的另一个局域网 ip(192.168.100.x),可以发现是 ping 的通的
路由的配置
启用 Linux 操作系统的 IP 转发功能。它允许 Linux 主机在不同的网络接口之间转发数据包。
sudo vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
当这个功能被启用后, Linux 主机就可以将一个网络的数据包转发到另一个网络,实现不同网络之间的互通。
在 OpenVPN Server 端可以查看进来的网络情况,方便 Debug
sudo apt-get install tcpdump
sudo tcpdump -i tun0
查看当前的路由情况。
roure -n
ip route list
路由这块儿的配置,需要根据自己的网络情况来配置,所以暂时先写到这儿。
以上内容仅当作练习,具体如果想打通局域网,还需要考虑稳定性。