{"id":16200889,"url":"https://github.com/observedobserver/autossh","last_synced_at":"2025-10-09T23:34:04.693Z","repository":{"id":102837573,"uuid":"105888838","full_name":"ObservedObserver/AutoSSH","owner":"ObservedObserver","description":"通过 AutoSSH 建立反向连接","archived":false,"fork":false,"pushed_at":"2020-02-27T12:02:26.000Z","size":3,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-09-23T16:52:14.918Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ObservedObserver.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2017-10-05T12:45:28.000Z","updated_at":"2020-02-27T12:03:07.000Z","dependencies_parsed_at":"2023-03-11T16:15:17.262Z","dependency_job_id":null,"html_url":"https://github.com/ObservedObserver/AutoSSH","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ObservedObserver/AutoSSH","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ObservedObserver%2FAutoSSH","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ObservedObserver%2FAutoSSH/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ObservedObserver%2FAutoSSH/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ObservedObserver%2FAutoSSH/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ObservedObserver","download_url":"https://codeload.github.com/ObservedObserver/AutoSSH/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ObservedObserver%2FAutoSSH/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279002311,"owners_count":26083340,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-09T02:00:07.460Z","response_time":59,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-10T09:34:41.183Z","updated_at":"2025-10-09T23:34:04.688Z","avatar_url":"https://github.com/ObservedObserver.png","language":"Shell","readme":"# AutoSSH\n\n\u003e 通过 AutoSSH 建立反向连接\n\n## 问题\n通过外网访问局域网内的设备，局域网内设备的IP为内网IP，在外网下无法直接访问，如公司内部的GPU服务器，平时只能在公司的局域网环境下访问，但一旦离开公司的局域网环境，便无法连接到GPU服务器。而公网IP由于IPv4的原因，非常稀少，不可能为每一台设备都分配自己的公网IP。\n为了能够访问到局域网中的设备，主要有两种方式：\n\n\u003e 端口映射：需要权限管理上级网关或者路由器或者防火墙\u003cbr\u003e\n\u003e 反向连接：需要一台外网服务器（VPS）做中继主机\u003cbr\u003e\n\u003e \u003cbr\u003e\n\u003e Internet上去主动连接一台内网是不可能的，一般的解决方案分两种，一种是端口映射（Port Forwarding），将内网主机的某个端口Open出防火墙，相当于两个外网主机通信；另一种是内网主机主动连接到外网主机，又被称作反向连接（Reverse Connection），这样NAT路由/防火墙就会在内网主机和外网主机之间建立映射，自然可以相互通信了。但是，这种映射是NAT路由自动维持的，不会持续下去，如果连接断开或者网络不稳定都会导致通信失败，这时内网主机需要再次主动连接到外网主机，建立连接。\n\n![](https://www.micronbot.com/usr/uploads/2016/07/3270104335.jpg)\n\n## 解决思路\n\n建立一个内网服务器到外网服务器的SSH隧道，使得其他设备可以通过中继主机访问内网设备。\nSSH除了用以登录VPS外，还可以用来构建数据传输的隧道。我们可将VPS的某一个端口（A）通过SSH绑定到另一个端口（B），这样所有通过端口A的数据都会被传到端口B。这就为我们实现反向连接提供了方案：\n\n首先将局域网内的服务器的某个端口映射到外网服务器的某个端口，这使得局域网内的服务器可以通过监听外网服务器上的某个端口，并将该端口上的数据全部传入自己的某个端口进行处理。\n例如，我们想在外网环境下使用ssh访问内网中的GPU服务器，我们在GPU服务器上监听外网继中服务器的端口8504, 将集中服务器8504端口获得的所有数据交给自己的22端口处理，变相的实现了通过ssh访问内网的GPU服务器。这种通过内网GPU服务器连接外网集中服务器，反而却实现了外网设备访问内网的操作 就叫做 **反向连接**\n\n内网GPU服务器监听外网继中服务器端口，可以在GPU服务器上执行\n```\nssh -NfR 2333:localhost:5000 root@gaylun.space\n```\n相当于将GPU服务器的5000端口绑定到中继服务器gaylun.space的2333端口上，可以通过ss -ant在继中服务器上查看状态\n```\nss -ant\n\nState      Recv-Q Send-Q Local Address:Port               Peer Address:Port                              \nLISTEN     0      128          *:2333                     *:*                  \n\n```\n但这种连接较不稳定，所以我们使用autossh建立一个守护进程。Autossh会在另一个端口上建立一个守护进程，监视ssh的连接，一旦断掉便进行重连。\n\n## 具体操作\n### Setp1\n在内网服务器上创建密钥对,创建时可以指定密钥文件名，不建议设置密码，为空即可。\n```\nssh-keygen\n```\n创建密钥的原因是我们将使用脚本自动通过ssh连接继中服务器，而连接时往往需要密码，为了避免手动输入密码，我们将在创建一对密钥用以直接访问。\n### Step2\n将生成的.pub文件里的内容复制到外网上的中继服务器服务器的~/.ssh/authorized_keys的尾部\u003cbr\u003e\n如果本地有多个密钥，则需要修改~/.ssh/config,添加如下信息，用以指定使用的密钥\n```\nHost \u003c要访问的地址\u003e\nIdentityFile ~/.ssh/\u003c私钥文件\u003e\nUser \u003c用户\u003e\n\n```\n\n### Step3\n创建tunel.sh文件（名字自定），内容如下\n```\n\nMORNITOR_PORT=12237\nREMOTE_PORT=2333\nSSH_HOST=gaylun.space\nSSH_PORT=22\nLOCAL_PORT=5000\nautossh -M $MORNITOR_PORT -N \\\n        -f -o 'PubkeyAuthentication=yes' \\\n           -o 'PasswordAuthentication=no' \\\n           -o 'ServerAliveInterval 30' \\\n           -o 'ServerAliveCountMax 3' \\\n        -R $REMOTE_PORT:localhost:$LOCAL_PORT \\\n           root@$SSH_HOST -p $SSH_PORT \u0026\n\n```\n执行 ./tunel.sh\n+ MORNITOR_PORT=监视器的端口（自定义，用以守护ssh的连接）\n+ REMOTE_PORT=被监听的端口（从被监听的端口获取数据，交给本地端口处理）\n+ SSH_HOST=目标主机地址\n+ SSH_PORT=目标主机ssh的端口（一般为22）\n+ LOCAL_PORT=本地端口\n\n\n### Step4\n完成以上操作之后，只能在继中服务器上通过localhost访问本地被监听的端口（变相访问GPU服务器上的端口），为了使得我们可以通过外网上的任何一台设备访问继中器上的被监听端口，我们需要修改ssh的配置。\u003cbr\u003e\n**修改中继服务器的/etc/ssh/sshd_config**\n```\nGatewayPorts yes \n\n```\n之后重启sshd\n```\nservice sshd restart\n```\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fobservedobserver%2Fautossh","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fobservedobserver%2Fautossh","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fobservedobserver%2Fautossh/lists"}