隧道代理的实现

This commit is contained in:
estom
2024-04-23 22:04:50 +08:00
parent 0366489c3a
commit da5e956d1e
3 changed files with 210 additions and 0 deletions

View File

@@ -165,3 +165,57 @@ service iptables save
```
## 使用场景
https://www.cnblogs.com/f-ck-need-u/p/10482832.html
### 本地端口
#### 问题
如下图假如host3和host1、host2都同互相通信但是host1和host2之间不能通信如何从host1连接上host2
对于实现ssh连接来说实现方式很简单从host1 ssh到host3再ssh到host2也就是将host3作为跳板的方式。但是如果不是ssh而是http的80端口呢如何让host1能访问host2的80端口
#### 转发实现
ssh支持本地端口转发语法格式为
```
ssh -L [local_bind_addr:]local_port:remote:remote_port middle_host
```
以上图为例实现方式是在host1上执行
```
[root@xuexi ~]# ssh -g -L 2222:host2:80 host3
```
其中"-L"选项表示本地端口转发其工作方式为在本地指定一个由ssh监听的转发端口(2222),将远程主机的端口(host2:80)映射为本地端口(2222),当有主机连接本地映射端口(2222)时本地ssh就将此端口的数据包转发给中间主机(host3)然后host3再与远程主机的端口(host2:80)通信。
"-g"选项,指定该选项表示允许外界主机连接本地转发端口(2222),如果不指定"-g"则host4将无法通过访问host1:2222达到访问host2:80的目的。甚至host1自身也不能使用172.16.10.5:2222而只能使用localhost:2222或127.0.0.1:2222这样的方式达到访问host2:80的目的之所以如此是因为本地转发端口默认绑定在回环地址上。可以使用bind_addr来改变转发端口的绑定地址例如
```
[root@xuexi ~]# ssh -L 172.16.10.5:2222:host2:80 host3
```
这样host1自身就能通过访问172.16.10.5:2222的方式达到访问host2:80的目的。一般来说使用转发端口都建议同时使用"-g"选项,否则将只有自身能访问转发端口。
#### 通信过程
当host4发起172.16.10.5:2222的连接时(即步骤①),数据包的目标地址和端口为"172.16.10.5:2222"。由于host1上ssh已经监听了2222端口并且知道该端口映射自哪台主机哪个端口所以将会把该数据包目标地址和端口替换为"172.16.10.3:80"并将此数据包通过转发给host3。当host3收到该数据包时发现是host1转发过来请求访问host2:80的数据包所以host3将代为访问host2的80端口。
所以host1和host3之间的通信方式是SSH协议这段连接是安全加密的因此称为"安全隧道"而host3和host2之间通信协议则是HTTP而不是ssh。
#### 最佳实践
最后关于端口转发有一个需要注意的问题ssh命令中带有要执行的命令。考虑了下面的三条在host1上执行的命令的区别。
```
[root@xuexi ~]# ssh -g -L 22333:host2:22 host3
[root@xuexi ~]# ssh -g -L 22333:host2:22 host3 "ifconfig"
[root@xuexi ~]# ssh -g -L 22333:host2:22 host3 "sleep 10"
```
第一条命令开启了本地端口转发且是以登录到host3的方式开启的所以执行完该命令后将跳到host3主机上当退出host3时端口转发功能将被关闭。另外host1上之所以要开启端口转发目的是为了与host2进行通信而不是跳到host3上所以应该在ssh命令行上加上"-f"选项让ssh在本机host1上以后台方式提供端口转发功能而不是跳到host3上来提供端口转发功能。
第二条命令在开启本地转发的时候还指定了要在host3上执行"ifconfig"命令但是ssh的工作机制是远程命令执行完毕的那一刻ssh关闭连接所以此命令开启的本地端口转发功能有效期只有执行ifconfig命令的一瞬间。
第三条命令和第二条命令类似只不过指定的是睡眠10秒命令所以此命令开启的本地转发功能有效期只有10秒。
结合上面的分析开启端口转发功能时建议让ssh以后台方式提供端口转发功能且明确指示不要执行任何ssh命令行上的远程命令。即最佳开启方式为
```
[root@xuexi ~]# ssh -f -N -g -L 22333:host2:22 host3
```
### 远程端口转发

View File