使用SSH创建VPN
服务端与客户端均要求Linux系统
-
客户端证书准备
创建相关目录,这里以
~/sshtunnel
为例进入
~/sshtunnel
目录创建证书
ssh-keygen -t ecdsa
创建
known_hosts
文件touch known_hosts
-
服务器端帐号准备
建立名为
sshtunnel
的帐号,用于连接服务器sudo useradd -s /bin/false -d /home/sshtunnel -m sshtunnel
将用户添加到
netdev
组sudo usermod -a -G netdev sshtunnel
添加私钥
sudo mkdir /home/sshtunnel/.ssh
sudo vi /home/sshtunnel/.ssh/authorized_keys
sudo chown -R sshtunnel:sshtunnel /home/sshtunnel/
修改
/etc/ssh/sshd_config
允许该帐号创建 tunnel追加:
Match User sshtunnel PermitTunnel yes
-
网络规划
服务器与客户端之间使用 tun 设备通信,这是一种点对点通信设备,只允许两个 IP 之间进行通信,一个为本机 IP,另一个为对端 IP (Point-to-Point 地址)。
我们假设:
- 服务器端使用
tun0
设备,客户端使用tun1
设备。实际使用中两个设备名称可以相同,这里为方便介绍。 - 服务端 IP 为
10.30.0.1
,客户端 IP 为10.30.0.2
。我们建议网关角色使用奇数 IP。 - 由原理可知,服务器方对端 IP 应设置为
10.30.0.2
,客户方对端 IP 应设置为10.30.0.1
- 服务器及客户端子网掩码均设置为
255.255.255.255
- 服务器端使用
-
服务器端准备 tun 设备
如果此时客户端进行连接,由于我们的帐号并非 root 权限,无法创建 tun 设备。如果 ssh 连接时使用
-v
参数,会看到open failed: administratively prohibited: open failed
错误。假设我们本地及服务器端均使用
tun0
设备sudo ip tuntap add dev tun0 mode tun user sshtunnel group netdev
然后我们可以预先配置一下网络参数
在
/etc/network/interfaces
中添加以下内容auto tun0 iface tun0 inet static address 10.30.0.1 netmask 255.255.255.255 pointopoint 10.30.0.2