• 目录:

    ssh 隧道连接两个虚拟网卡


    tun/tap 虚拟网卡

    linux 内核提供虚拟网卡的功能. 当你创建了一张虚拟网卡, 通过系统调用读取该网卡对应的文件, 就可以读取到链路层或网络层传输的数据. 同样的, 通过系统调用向该文件写入数据, 就相当于通过这张网卡发送数据.

    其中,

    tun 设备, 虚拟了网络层设备. 对应的是 IP数据报.

    tap 设备, 虚拟了链路层设备, 对应的是 以太网数据帧.

    下面这个命令, 可以创建一张能交互链路层数据的虚拟网卡, 设备名称为 tap0, 记住他的设备名称里最后一个数字0, 后面会有用到.

    # 创建一张虚拟网卡, 设备名称为 tap0, 指定为 tap 链路层模式
    ip tuntap add tap0 mode tap
    

    ssh -w

    ssh 提供现成的命令来连接两张网卡. 在这之前, 确认下 ssh-server 端的配置: ssh 配置#允许隧道

    ssh -o Tunnel=Ethernet -w 0:0 remotr_user@remote_host
    

    -o Tunnel=Ethernet: 如果是网络层, 对应的 Tunnel 配置应该是 -o Tunnel=point-to-point.

    -w 0:0: 这两个0代表的是网卡设备号(如: tap0)结尾的数字. 一个是本地的数字, 一个是远程的数字, 如果记不住前后顺序 -w local_tun[:remote_tun], 可以把两台机器上的网卡取成一样的名字.

    网络配置

    使用 ssh -w 命令, 就像是拿根网线把两张网卡接了起来. 接下来还需要手动配置下 ip 和 路由, 网络才能通.

    举个例子:

    # 配置机器S的 ip 和 网段 (xxxx:ff46/112)
    ifconfig tap0 inet6 add xxxx:ff46/112
    
    
    # 配置机器C的 ip 和 网段 (xxxx:ff45/122)
    ifconfig tap0 inet6 add xxxx:ff45/112
    # 配置机器C的 路由规则: 到机器S的数据, 走 tap0 这张网卡)
    route -6 add xxxx:ff46/112 dev tap0
    

    ssh 隧道 相关命令

    ssh 除了用来远程登录 linux服务器, 还有一系列网络相关的功能, 图形界面转发, 端口转发 等等.

    ssh -L

    把本地的一个端口, 转到远程去.

    ssh -L local_port:remote_host:remote_port remotr_user@remote_host
    

    ssh -R

    把远程的一个端口, 转到本地来. 访问远程机器上的端口时, 就像访问本地端口一样. 通常远程机器是一个有公网ip的云服务器, 这个命令可以当内网穿透使用.

    ssh -R remote_port:local_host:local_port remotr_user@remote_host
    

    ssh -D

    把本地的一个端口, 设置为 socks5 代理, 数据将通过远程的机器代理.

    ssh -D local_port remotr_user@remote_host
    

    常用参数

    -g: 相当于把默认的 Listen 127.0.0.1 改成 Listen 0.0.0.0.

    -q: 安静模式, 减少 warning 日志的输出.

    -f: 后台运行.

    -n: 只能在后台运行时使用, 从 /dev/null 获取输入, 意思是登录后在终端敲的命令都不管用了.

    -N: 不执行命令 (希望只作端口转发的时候用).

    -C: 压缩数据, 在慢网络环境下适用.

    正确的学习方法: man ssh. ssh 隧道这个搜索词, 已经被 -L -R -D 三个参数淹没了, 很难找到介绍 -w 参数的文章. 这个时候才能显现出官方文档的好处.

     -q      Quiet mode.  Causes most warning and diagnostic messages to be
             suppressed.
    
     -f      Requests ssh to go to background just before command execution.
             This is useful if ssh is going to ask for passwords or
             passphrases, but the user wants it in the background.  This
             implies -n.  The recommended way to start X11 programs at a
             remote site is with something like ssh -f host xterm.
    
             If the ExitOnForwardFailure configuration option is set to “yes”,
             then a client started with -f will wait for all remote port for‐
             wards to be successfully established before placing itself in the
             background.
    
     -n      Redirects stdin from /dev/null (actually, prevents reading from
             stdin).  This must be used when ssh is run in the background.  A
             common trick is to use this to run X11 programs on a remote
             machine.  For example, ssh -n shadows.cs.hut.fi emacs & will
             start an emacs on shadows.cs.hut.fi, and the X11 connection will
             be automatically forwarded over an encrypted channel.  The ssh
             program will be put in the background.  (This does not work if
             ssh needs to ask for a password or passphrase; see also the -f
             option.)
    
     -N      Do not execute a remote command.  This is useful for just for‐
             warding ports.
    
     -C      Requests compression of all data (including stdin, stdout,
             stderr, and data for forwarded X11, TCP and UNIX-domain connec‐
             tions).  The compression algorithm is the same used by gzip(1),
             and the “level” can be controlled by the CompressionLevel option
             for protocol version 1.  Compression is desirable on modem lines
             and other slow connections, but will only slow down things on
             fast networks.  The default value can be set on a host-by-host
             basis in the configuration files; see the Compression option.