树莓派穿透内网

家里的宽带没有公网IP,从外面没有办法SSH到树莓派上。如果有公网IP的话,现在一般的路由器都支持端口转发功能,在路由器的管理界面添加一条转发规则即可。

不过有一天,我突然想到了SSH的端口转发功能,其实很简单的一条命令:

ssh -N -f -R 8022:localhost:22 xxx@remote-host.com

简单解释一下,-N表示了不要执行任何命令,-f表示在后台执行,-R 8022:localhost:22表示remote-host.com上将会监听8022端口,并将所有的流量转发到localhost:22端口上来。就是这么简单。

当然了,前提是你要有一台有公网IP的主机,这个就自己想办法搞定吧,比如阿里云什么的。

但是,这个办法有个缺点,树莓派重启了就失效了,可以参考[这个][autosshd],在树莓派上略加修改就能用了,把autosshd脚本放到/etc/init.d下,再执行

update-rd.d autosshd defaults

autosshd加到自启动项里去。其实这个脚本就是利用了autossh这个工具。

不过我对上面的那个脚本做了些修改,供大家参考:

#!/bin/bash

### BEGIN INIT INFO
# Provides:          autossh
# Required-Start:    $network $local_fs
# Required-Stop:     $network $local_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: This script starts and stops the autossh daemon
### END INIT INFO

# Source function library.
#. /etc/rc.d/init.d/functions

# Source networking configuration.
#. /etc/sysconfig/network

# Check that networking is up.
#[ ${NETWORKING} = "no" ] && exit 0

TUNNEL_SSHCONFIG="/home/pi/.ssh/config"
TUNNEL_IDENTITY="/home/pi/.ssh/id_rsa"
TUNNEL_HOST="xxx@remote-host.com"
TUNNEL_REDIRECT="8022:localhost:22"

export AUTOSSH_PIDFILE="/var/run/autossh.pid"

# By default it's all good.
RETVAL=0

# Start function.
start() {
    local name=$1
    echo -n $"Starting ${name}: "
    if [ -e "/var/lock/subsys/${name}" ]; then
        if [ -e "/var/run/${name}.pid" ] && [ -e /proc/`cat /var/run/${name}.pid` ]; then
            echo -n $"already exists.";
            failure $"already exists.";
            echo
            return 1
        fi
    fi
    #daemon /usr/bin/autossh -M 0 -f -nNT -F ${TUNNEL_SSHCONFIG} -i ${TUNNEL_IDENTITY} ${TUNNEL_HOST}
    /usr/bin/autossh -f -M 0 -CNnqT -F ${TUNNEL_SSHCONFIG} -i ${TUNNEL_IDENTITY} -R ${TUNNEL_REDIRECT} ${TUNNEL_HOST} -o ServerAliveInterval=30 -o ServerAliveCountMax=5
    RETVAL=$?
    [ $RETVAL -eq 0 ] && touch "/var/lock/subsys/${name}"
    echo
    return $RETVAL
}

# Stop function.
stop() {
    local name=$1
    echo -n $"Stopping ${name}: "
    #killproc -p "/var/run/${name}.pid" ${name}
    kill `cat /var/run/${name}.pid`
    RETVAL=$?
    echo
    [ $RETVAL -eq 0 ] && rm -f "/var/lock/subsys/${name}"
    return $RETVAL
}

# See how we were called.
case "$1" in
    start)
        start "autossh"
        ;;
    stop)
        stop "autossh"
        ;;
    restart)
        $0 stop
        sleep 3
        $0 start
        ;;
    status)
        status "autossh"
        RETVAL=$?
        ;;
    *)
        echo $"Usage: $0 {start|stop|restart|status}"
        exit 1
        ;;
esac

exit $RETVAL

做了几点改进:

  1. 修改了一下在树莓派上可以跑,但是很多地方还有待改进
  2. 修改了ssh的启动参数,添加了-Cq,可以man ssh自己看
  3. 添加了-o ServerAliveInterval=30 -o ServerAliveCountMax=5,可以自动检测SSH连接可用性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值