ssh不仅可以用来登录命令行,也可以用来建立加密隧道,更是可以将多个网络通过隧道形成一个虚拟的局域网
而且配置起来也简单方便。
1 准备环境
1个ssh服务器A,示例使用的是ubuntu22
2个ssh客户端B,C。都是ubuntu18
2 创建网络设备
服务端A
创建tap设备
ip tuntap add mod tap
ip link set tap0 up
ip tuntap add mod tap
ip link set tap1 up
注意:这里的tap0,是系统生成的名字,后面的数字是设备编号。设备号不同,生成的名字也不同。
创建网桥设备
brctl addbr br0
ip link set br0 up
brctl addif br0 tap0
brctl addif br0 tap1
ip addr add 11.0.0.1/24 dev br0
客户端B
创建tap设备
同服务端一样,也需要创建tap设备
ip tuntap add mod tap
ip link set tap0 up
ip addr add 11.0.0.2/24 dev tap0
3 配置文件
服务端A
修改配置文件,路径为/etc/ssh/sshd_config
将其中PermitTunnel打开注释并且修改为yes,
并且使用systemctl restart sshd.service重启服务
客户端B
在~/.ssh目录下创建config文件,内容如下
Host server-tunnel
Hostname x.x.x.x
Port 22
User user
Tunnel ethernet
TunnelDevice 0:0
Host:表示连接名字
Hostname:服务器的IP或者域名
User :登录名
Tunnel :yes或者ethernet;我们这里用需要ethernet
TunnelDevice :x1:x2;网络设备号,也就是网络接口tapx后面的那个数字,x1本地网络设备号,x2服务端网络设备号。
4 客户端B连接
现在,万事俱备只欠东风了。
在客户端B,使用命令ssh -Nf server-tunnel
输入密码或者使用公钥登录后,就可将客户端B和服务端A通过tap设备连接起来。
如果连接失败,可以使用ssh -Nv server-tunnel,调试下失败的原因。
成功后,就可以互ping通了。
客户端B
root@Dev:~/.ssh# ping 11.0.0.1
PING 11.0.0.1 (11.0.0.1) 56(84) bytes of data.
64 bytes from 11.0.0.1: icmp_seq=1 ttl=64 time=5.74 ms
64 bytes from 11.0.0.1: icmp_seq=2 ttl=64 time=7.06 ms
64 bytes from 11.0.0.1: icmp_seq=3 ttl=64 time=7.39 ms
^C
--- 11.0.0.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 5.740/6.731/7.395/0.720 ms
服务端A
lq@lq-server ~> ping 11.0.0.2
PING 11.0.0.2 (11.0.0.2) 56(84) bytes of data.
64 bytes from 11.0.0.2: icmp_seq=1 ttl=64 time=6.28 ms
64 bytes from 11.0.0.2: icmp_seq=2 ttl=64 time=6.85 ms
^C
--- 11.0.0.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 6.283/6.568/6.854/0.285 ms
lq@lq-server ~>
5 客户端C的连接
客户端C的连接和客户端B是一样的。
稍稍有点区别的是,需要把~/.ssh/config文件中TunnelDevice 0:0修改为TunnelDevice 0:1
表示与服务端tap1设备建立点对点连接关系。
现在,在客户端C的tap设备上添加IP地址11.0.0.3/24,那么至此
服务器A和客户端B、C通过tap设备建立起虚拟局域网。
客户端C
user@user:~$ ping 11.0.0.1
PING 11.0.0.1 (11.0.0.1) 56(84) bytes of data.
64 bytes from 11.0.0.1: icmp_seq=1 ttl=64 time=37.9 ms
64 bytes from 11.0.0.1: icmp_seq=2 ttl=64 time=41.8 ms
^C
--- 11.0.0.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 37.900/39.839/41.779/1.939 ms
user@user:~$
user@user:~$ ping 11.0.0.2
PING 11.0.0.2 (11.0.0.2) 56(84) bytes of data.
64 bytes from 11.0.0.2: icmp_seq=1 ttl=64 time=46.6 ms
64 bytes from 11.0.0.2: icmp_seq=2 ttl=64 time=45.7 ms
^C
--- 11.0.0.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 45.710/46.153/46.596/0.443 ms
user@user:~$