时效性
本篇撰写时间为2021.12.12,由于计算机技术日新月异,博客中所有内容都有时效和版本限制,具体做法不一定总行得通,链接可能改动失效,各种软件的用法可能有修改。但是其中透露的思想往往是值得学习的。
本篇前置:
- ExpRe[6] 云服务器[0] 基础使用,ssh连接
https://www.cnblogs.com/minor-second/p/15553737.html - ExpRe[10] Ubuntu[2] 准备神秘软件、备份恢复软件
https://www.cnblogs.com/minor-second/p/15578767.html
在第6期我们对云服务器有了基本的操作和使用能力。这期我们加强云与本地的联系。
访问指定端口并神秘
我们现在需要服务器能神秘(神秘是什么?神秘a
又是什么?请参考第10期)
第一种方法是采用和第10期类似的方式。安装神秘a
,然后通过:2017
端口进行配置。
-
ssh
登录上服务器,根据第10期命令在服务器安装神秘a
,自己curl 127.0.0.1:2017
自己,发现能连上
而且curl 127.0.0.1:2017 | grep 神秘
是有输出的。
这时就可以尝试用本地浏览器访问2017端口,去配置了 - 但是默认情况下,云服务器提供商的入站规则里肯定是不开放这个端口的,所以需要手动增加入站规则
注:虽然我们使用http://<公网IP>:2017
访问,其中有http
字样,但开放的不应是:80
端口,而应该是:2017
参考:
一般80作为网页服务器的访问端口,比如一个网站的ip地址是123.123.123.123,我们访问的是123.123.123.123:80,只是80是默认端口可以省略
也就是说并不是http
出现了就是访问80,而是http://
,且后面没有:xx
,则默认访问80
- 于是现在
http://<公网IP>:2017
可以访问,并可以配置了(用第10期的方法导入服务器等)
(当然vim ~/.bashrc
啥的也需要) - 验证:
curl -L www.google.com
,有输出了
端口转发
远程转发(-R
)
另一种神秘方式:你的本地可以神秘
不妨设本地神秘这边入站是8889端口,如图(对于win10,在左下方搜索按钮搜索代理即可找到该设置界面。对于其它系统就各自在相应的地方找)
那么你可以把这个可以神秘的端口做远程转发,即让远程主机能访问你本地的8889端口
即首先ssh -R 18889:localhost:8889 root@<公网IP>
这样服务器的18889
就对应了你本地可以神秘的8889
接下来尝试
export http_proxy='http://127.0.0.1:18889'
curl cip.cc
export http_proxy='http://127.0.0.1:20171'
curl cip.cc
如果你本地使用的神秘节点和上节通过http://<公网IP>:2017
配置使用的神秘节点不同,那么两次curl
结果是不同的
上图第一个结果是export http_proxy='http://127.0.0.1:18889'
的,然后改成export http_proxy='http://127.0.0.1:20171'
之后就是第二个结果。
本地转发(-L
)
另一种转发恰好相反,是让本地可以通过某个端口访问远程主机的端口。可以让本地借用远程主机神秘。
比如远程主机可以上神秘地带(就是刚刚配置到20171的)
我们现在在MobaXterm
中ssh -L localhost:11111:localhost:20171 <神秘服务器账号>@<神秘服务器IP>
验证现象:
- 首先我们用本地机器(并在代理服务器设置中关掉代理),因此不能神秘
- 然后我们只需在“代理”设置中选择对应的本地端口,即可通过不同的远程主机神秘。有趣的是,我们现在有两台远程服务器,还有本机的神秘软件,所以在代理设置处共有可能设置3个端口(11111,22222,8889),分别对应不同的ip
-
动态转发(-D
)
找到一台直接可以神秘的机器(比如“可用区:新加坡”),而不是像之前那样神秘软件“共享来共享去”的ssh -D localhost:11111 root@<可以直接神秘的公网IP>
动态转发用的是sock5协议,设置比较复杂。需要左下角搜索Internet选项,然后连接 - 局域网设置 - 高级,如图设置(把其它类型的代理服务器地址去掉,只留下SOCKS5)
注:Ubuntu的这个界面就没藏这么深,很难说这不是Windows历史遗留问题。Windows“两种风格设置界面”已经被吐槽很久了……
此时在新的MobaXterm
终端中尝试curl -x socks5://127.0.0.1:11111 cip.cc
可以神秘,但curl -x socks5://127.0.0.1:11111 -L google.com
不行,原因是google.com
不能被本地DNS解析。应该改成curl -x socks5h://127.0.0.1:11111 -L google.com
由此看出,(时效性:截至2021.12.12)像github.com
之类本地能解析域名的就可以用socks5
,google.com
之类的就要用socks5h
总结和问答练习
- Q: 转发实际上更常用的是“跳板”功能,即涉及三台机器的关系(而不是两台)。试举例说明。
A: 设计一个场景:比如远程服务器可以按172
开头的内网IP地址,访问内网的某个机器X
(其它机器不行)。
我们通过远程服务器作为跳板,即可通过本地转发,用本地端口访问的X
端口。应用:访问X
中的tensorboard等。
现在,用docker容器模拟一个类似的场景
(当然想看容器的tensorboard是不推荐如上操作的。根据docker官方文档,不推荐手动改iptables
使得curl <内网IP>:<端口>
能访问。推荐端口映射。22
用于ssh是个特例)
- 在docker容器中
cat /etc/hosts
看到容器的内网IP地址 - 按照19期做出适当设置使得容器允许ssh连接
- 在容器的宿主尝试
ssh <内网IP>
可以连接容器 - 宿主适当设置
no_proxy
(如localhost,127.0.0.1
这种,否则宿主的127.0.0.1:2017
访问代理的2017端口。此处我们需要的是<内网IP>
不过代理) - 在容器中
curl 127.0.0.1:22
看到输出(如Protocal mismatch
等) - 在宿主中
curl <内网IP>:22
也可以看到同样输出
本地新开一个ssh
终端,使用ssh -L localhost:2022:<容器IP>:22 root@<宿主IP>
本地再新开一个终端,curl localhost:2022
,即可看到Protocol mismatch