ssh正向代理

我知道, 来看我博客的一大部分人都可能使用过shadowsocks, 使用之后, 你不直接访问某些网站, 而通过代理机器进行.

你也可以借助OpenSSH完成这件事情:

1
~ ❤  ssh -D 9000 ali

在本机上监听9000端口, 而后在firefox或是其他浏览器中进行设置:

简单设置之后, 你就可以遨游天空了.

连接好之后, 可以这样进行检查(netstat -tnlp是我为数不多记得较为清楚的命令):

1
2
3
4
5
~ ❤  netstat -tnlp
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 23882/ssh
...

这里我不是很想介绍正向代理与反向代理的区别, 就推荐一下 这篇博客正向代理与反向代理【总结】, 有兴趣的同学可以读读看.

下面两部分是我认为我在OpenSSH中用到的最为变态的功能了, 它们真正的诠释了你对 本机以及远程机器的控制.并且是以一种看似魔法的形式. 鉴于我的能力水平, 希望不理解的读者能够提出一些建议.

端口映射

为远端服务器添加端口(可用作内网穿透)

假如我们在本机上开启了一个HTTP服务, 在公网是无法访问的, 那是因为TCP连接的建立 需要两个要素, 可以访问的IP, 以及正确的端口. 鉴于我们平时的网络情况, 如下图所示:

是没有公网IP的, 所以别人根本无法访问你的服务, 而内网穿透所要做的, 就是将本地的 端口映射至公网服务器的的某个端口中, 其他用户可以间接与你建立起连接.

1
2
3
4
5
6
7
8
9
10
11
12
13
# 在本机, 将本机的80端口映射到了远端的8000
~ ❤ ssh -N -v -g -R 8000:127.0.0.1:80 ali

# 在远端, 请注意, 默认的是监听127.0.0.1:8000, 也就是只允许本机访问
# 你仍然可以使用curl或是telnet检测一下
root@xxx ~$ netstat -tnlp
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:8000 0.0.0.0:* LISTEN 26741/0
...

root@xxx ~$ curl 127.0.0.1:8000
<html>
</html>

如果想要放到配置文件中

1
2
3
4
5
6
7
8
9
10
Host ali
HostName 1.2.3.4
Port 22
User root
IdentityFile ~/.ssh/id_rsa_test
RemoteForward 8000 localhost:4000

Controlmaster auto
Controlpath ~/.ssh/ssh-%r@%h:%p.sock
ControlPersist 600

本地添加端口

现实生活的限制真的很大, 有些时候需要被大家访问. 可有些时候却是不愿意被别人访问 只能本机或是固定的一些IP进行访问. 这种情况, 你能想到什么, 对了, 就是数据库, 数据库还是有所限制的好, 但有时却又不那么方便.

这时, 我们可以考虑将远程的端口映射到本地, 简单的欺骗一下MySQL服务器, 让它认为 服务是从本机发出的.

1
2
3
4
5
6
7
8
9
10
11
12
13
## 在远程, 看到mysql此时监听的是3306, 但是只能本机访问
root@xxx ~$ netstat -tnlp
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 28498/mysqld


## 在本地, 我们想把 `本地的13306 => 远程的3306`, 可以看到本地监听了13306这个端口
~ ❤ ssh -L 13306:127.0.0.1:3306 ali
~ ❤ netstat -tnlp
tcp6 0 0 :::13306 :::* LISTEN 27577/ssh:
...
## 就可以这样使用了.
~ ❤ mysql -u root -h 127.0.0.1 -P 13306 -p

如果你因为这样就结束, 那么真的太天真了, -L参数是可以添加到config文件中的:

1
2
3
4
5
6
7
8
9
10
Host ali
HostName 1.2.3.4
Port 22
User root
IdentityFile ~/.ssh/id_rsa_test
LocalForward 13306 127.0.0.1:3306

Controlmaster auto
Controlpath ~/.ssh/ssh-%r@%h:%p.sock
ControlPersist 600

不知道大家有没有发现, 为什么一定要是127.0.0.1:3306呢, 换用别的IP或是域名行不行, 欢迎读者进行探索哈.