使用SSH创建VPN

服务端与客户端均要求Linux系统

  1. 客户端证书准备

    创建相关目录,这里以 ~/sshtunnel 为例

    进入 ~/sshtunnel 目录

    创建证书

    ssh-keygen -t ecdsa

    创建 known_hosts 文件

    touch known_hosts

  2. 服务器端帐号准备

    建立名为 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
    
  3. 网络规划

    服务器与客户端之间使用 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
  4. 服务器端准备 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