内网穿透--ssh篇

条件说明

宽带无公网ip,局域网中的局域网,需要有一台有公网ip的服务器

场景说明

pc net ip lan ip
local / 192.168.31.60
server 11.12.13.14 192.168.0.100
  • local为本地电脑,家庭宽带,无公网ip

  • server为阿里云服务器,有固定公网ip,linux

配置

  • 修改服务器配置

    server上需编辑/etc/ssh/sshd_config,修改GatewayPorts为yes,更多请查看 man sshd_config

  • 本地机器操作

    ssh sshUser@11.12.13.14 -C -N -g -R \
        localhost:22:localhost:10022 \
        -o ExitOnForwardFailure=yes \
        -o ServerAliveInterval=60
    

    访问远程10022端口就是访问本地的22端口,心跳检测为60s,前面的localhost可更换为局域网其它电脑的ip、端口,比如换成3389,windows的远程桌面服务,即可随时访问家里电脑了,端口酌情替换。

其它

  • 服务器上新建一个用户,专门用于端口转发,并限制登录,执行以下命令

    useradd ddns -s /home/ddns/bin/login.sh -m          # 创建用户,指定shell
    passwd ddns                                         # 修改密码
    chown ddns:ddns -R /home/ddns                       # 修改文件夹权限
    vi /home/ddns/bin/login.sh                          # 创建login.sh文件,内容见下文
    chmod +x /home/ddns/bin/login.sh                    # 添加执行权限
    

    login.sh文件内容,远程登录后只能用ssh命令

    #!/bin/sh
    stty erase ^H
    stty kill ^U
    echo -en "SSH to Host :"
    read host
    echo -en "UserName: "
    read username
    /usr/bin/ssh $host -l $username
    
  • 本地服务配置(linux环境)

  1. vi /usr/lib/systemd/system/ddns.service

    [Unit]
    Description=ddns
    After=network.target
    
    [Service]
    Type=simple
    
    ExecStart=/usr/bin/ssh ddns@server-ip -C -N -g -R *:20010:localhost:80 -o ExitOnForwardFailure=yes -o ServerAliveInterval=60
    
    [Install]
    WantedBy=multi-user.target
    
  2. 配置免密登录到服务器

    把本地服务器公钥放到云服务器上

  3. 服务开机自启

    systemctl daemon-reload
    systemctl enable ddns           # 上面的文件名
    systemctl start ddns
    
  4. 服务断线重连(crontab)

    使用crontab定时任务隔几分钟执行下面命令

    #!/bin/bash
    DDNS=`systemctl status ddns | grep Active | awk '{print $3}'`
    if [ "$DDNS" == "(running)" ]
    	then
    		echo "ddns is running"
    	else
    		systemctl start ddns
    fi
    
上一篇:AWS-DDNS


下一篇:使用决策树算法进行鸢尾花数据分类