起因:突然一夜之间电信扰拨号ip全变内网地址了,这样即使用了动态域名,绑定的也不是本机ip,外部无法访问了。虽然打电话找电信反映说是可以改回来,但必须先解决眼前的问题,访问内网服务器上的svn仓库。
办法:由于还有一台在公网上的云主机,想到可通过它中转,只要内网主机先与云主机建立连接,这正好可以用ssh的远程转发功能,命令如下:
ssh -gN -R 3690:0.0.0.0:3690 -o ServerAliveInterval=60 [email protected]
结果连接是建立了,但是此时访问云主机3690端口却连不上,上去查看端口状态:
[[email protected]:~]netstat -ln -A inet
输出如下:
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 127.0.0.1:3690 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN
……
显示3690虽然在监听,但只在127.0.0.1上有效,因此无法接受外部连接。
可之前已经加上了-g参数,在ssh手册上说过此选项将使端口绑定在外部ip上,以使其它机器可以连接,但为何这里无效呢?
google得知答案(https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=228064):
原来-g只是对本地转发有效,要使远程转发也使用外部ip,必须修改远程主机上的sshd_config,增加
GatewayPorts yes
然后重启ssh服务即可。
再次建立转发并查看连接,发现已经监听的是0.0.0.0:3690,打开svn客户端更新顺利执行!