linux下建立ssh tunnel实现端口转发


下边的“重定向”即指端口转发。

一、本地隧道(参数-L)

表示对本地的访问将被tunnel重定向到远端。

1. 在2台主机间的重定向
第一个例子

假定现在的端口转发只涉及2台ssh主机,一台是node04,一台是192.168.1.104。现在的设想是,访问node04上localhost的3303端口将被映射到192.168.1.104主机的127.0.0.1:3306端口(远端端口)。

# 需求拓扑
node04(localhost):3303 -----------> 192.168.1.104(127.0.0.1:3306)
   │-----------------^------端口转发至--------^------------------^
   ┕ <---访问
   
#有shell,需要输入用户名密码
[baby@node04 ~]$ ssh -L 3303:localhost:3306 192.168.1.104

#有shell,指定用户名登录
[baby@node04 ~]$ ssh -L 3303:localhost:3306 root@192.168.1.104

#没有shell,指定用户名登录
[baby@node04 ~]$ ssh -L 3303:localhost:3306 -fN bee@192.168.1.104
        ^-------访问------^    ^-远端端口-^             -------^------<目标主机
                 │                    │--目标主机可达的远端端口--│
                 │------------端口转发至----------│ 


#对 -L 之后参数的说明:
#本端端口:远端主机IP/FQDN:远端端口  目标主机(即,隧道的对端,ssh tunnel peer)
  1. ssh先建立到目标主机(隧道的对端,peer)的连接,形成ssh tunnel。此时,本端端口指执行本ssh命令的本地主机的端口。而远端主机IP/FQDN指目标主机上的接口IP或FQDN。远端端口也位于目标主机上。
  2. 远端主机IP/FQDN将决定目标主机上侦听的远端端口的IP地址。比如,远端主机为localhost,则目标主机上侦听远端端口的IP就为127.0.0.1。远端主机IP为192.168.1.104,则目标主机上侦听远端端口的IP就为192.168.1.104。
  3. 本端端口可以和远端端口相同,也可以不相同。
  4. 参数-f 指后台运行
  5. 参数-N 指没有shell,不能在目标主机上运行命令。
第二个例子

有如下两台ssh主机,现要求在node04上通过ssh建立tunnel,使得对localhost的TCP 3333端口的访问,将被本地转发到node05的8888端口上。

node04:192.168.74.204(Local Host)
node05:192.168.74.205(Remote Host)

带shell建立的隧道需要logout退出,以关闭ssh本地转发的tunnel。

nc -l只接收一个TCP连接请求;
nc -lk可以接收多个TCP连接请求。

2. 在3台主机间的重定向

现有三台主机:

  • pc(192.168.201.1)
  • bastion(192.168.201.113)
  • server01(172.55.4.10)

假定pc可以访问bastion,bastion可以访问server01,但pc不能访问server01。现在bastion相当于一台堡垒机,要求pc可以把一个本地文件scp直接拷贝到server01上。

# 需求拓扑
pc(localhost):2222 <---通---> bastion:22 <----通----> server01:22 
                 ^-----------------不通----------------------^

# pc上
pc> ping 192.168.201.113
正在 Ping 192.168.201.113 具有 32 字节的数据:
来自 192.168.201.113 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.201.113 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.201.113 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.201.113 的回复: 字节=32 时间<1ms TTL=64

192.168.201.113 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 0ms,最长 = 0ms,平均 = 0ms

pc> ping 172.55.4.10
正在 Ping 172.55.4.10 具有 32 字节的数据:
请求超时。
请求超时。
请求超时。
请求超时。

172.55.4.10 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 0,丢失 = 4 (100% 丢失)# bastion上
[root@bastion ~]# ping -c 3 172.55.4.10
PING 172.55.4.10 (172.55.4.10) 56(84) bytes of data.
64 bytes from 172.55.4.10: icmp_seq=1 ttl=64 time=0.456 ms
64 bytes from 172.55.4.10: icmp_seq=2 ttl=64 time=0.612 ms
64 bytes from 172.55.4.10: icmp_seq=3 ttl=64 time=0.544 ms

--- 172.55.4.10 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2001ms
rtt min/avg/max/mdev = 0.456/0.537/0.612/0.066 ms

#pc上
pc> ssh -L 2222:172.55.4.10:22 root@192.168.201.113
root@192.168.201.113's password:
Last login: Sun Oct 16 13:58:27 2022 from 192.168.201.1
[root@bastion ~]#

pc> scp -P 2222 a.log root@localhost:/root/tmp
root@localhost's password: <-----这里输入的是server01的ssh登陆密码
a.log                                                 100%  167KB  20.9MB/s   00:00
文件将被拷贝到server01的/root/tmp中。

由此可见,-L后的参数

本端端口:远端主机IP/FQDN:远端端口  目标主机(即,隧道的对端,ssh tunnel peer)

远端主机IP/FQDN:远端端口还可以是目标主机可达的IP:端口,不一定非得是目标主机上的IP:端口。

二、远程隧道(参数-R)

表示对远端的访问将被tunnel重定向到本地。

1. 在2台主机间的重定向
第一个例子
ssh -R *:6000:localhost:5000 remote.example.com
或者
ssh -qTfnN -R *:12345:127.0.0.1:80 root@XXXX -p [ssh端口号] -o GatewayPorts=yes
参数详解:
-q Quiet mode. 安静模式
-T Disable pseudo-tty allocation. 不占用 shell 了
-f Requests ssh to go to background just before command execution. 后台运行,并推荐加上 -n 参数
-n 把 stdin重定向到/dev/null (实际上防止从stdin读取数据)
-N Do not execute a remote command. 不执行远程命令,就端口转发

#需要让 remote.example.com 主机的所有者将以下选项之一
#添加到 /etc/ssh/sshd_config 中:
GatewayPorts yes       
# 或
GatewayPorts clientspecified

#第一个选项意味着 remote.example.com 上
#的所有网络接口都可以使用远程转发的端口。
#第二个意味着建立隧道的客户端可以选择地址。
#默认情况下,此选项设置为 no。

#使用clientspecified选项
#作为 ssh 客户端仍必须指定可以共享你这边转发端口的接口。通过在本地端口之前添加网络地址范围来进行此操作。有几种方法可以做到,包括:
ssh -R *:6000:localhost:5000                   # 所有网络
ssh -R 0.0.0.0:6000:localhost:5000             # 所有网络
ssh -R 192.168.1.15:6000:localhost:5000        # 单个网络
ssh -R remote.example.com:6000:localhost:5000  # 单个网络

另外,可以限制主机上的转发。如果你需要在联网主机上更严格的安全性,那么这对你来说可能很重要。 sshd 守护程进程的 PermitOpen 选项控制是否以及哪些端口可用于 TCP 转发。默认设置为 any,这让上面的所有示例都能正常工作。要禁止任何端口转发,请选择 none,或仅允许的特定的“主机:端口”。详细可以:man sshd_config

示例:
node04:192.168.74.204(Local Host)
node05:192.168.74.205(Remote Host)

node04通过命令在node05上建立tunnel,使得访问node05的TCP 8000端口的流量被重定向到node04本地的localhost:6000端口上来。

在远端node05上访问8000端口,将被重定向到node04。

此时,发现node05上telnet 192.168.74.205 8000还不行,只可以telnet localhost 8000。
原因:

  1. 需要在/etc/ssh/sshd_config中配置:
GatewayPorts yes
当然也可以配置
GatewayPorts clientspecified
  1. ssh的命令必须写完整限定参数“ RemoteIP:RemotePort:LocalIP:LocalPort ”:
ssh -R *:8000:localhost:6000 192.168.74.205

这里*表示远端的所有接口地址,也可以使用一个远端主机的接口地址来作限定。

远端开始侦听接口

这时再访问远端主机的接口



注意:telnet终端中backspace键要如下输入

Ctrl + backspace
第二个例子(反向隧道)

假设有两台主机
server01(192.168.201.101)
server02(172.16.10.102)
组网如下:

server01 --------> FireWall(SNAT)---------> server02

已知防火墙FireWall使用了SNAT,server01可以ssh访问server02,但server02不能ssh访问server01。
现要求在server02上开启tcp端口2222,使得对server02:2222的访问被ssh tunnel重定向到server01的tcp端口22。

[john@server01 ~]$ ssh -R 2222:192.168.201.101:22 172.16.10.102

现在只需在server02上运行

[john@server02 ~]$ ssh -p 2222 username@localhost

从而实现server02对server01的ssh访问——俗称“内网穿透”。

2. 在3台主机间的重定向

假设有三台主机
server01(10.100.20.101)
bastion(172.16.100.100)
server02(10.200.30.102)
组网如下:

server01 <--------- bastion ---------> server02

bastion可以ssh连接server01,也可以ssh连接server02,但server01和server02不能实现ssh连接。
现在需要scp从server02拷贝文件到server01,且不在bastion上中转文件。

[john@bastion ~]$ ssh -R 2222:server01:22 server02

上述命令将在server02上开启tcp端口2222。对server02:2222的访问将被bastion通过ssh tunnel重定向到server01的tcp端口22。
然后,可以用scp将server02的文件拷贝到server01上。

[john@server02 ~]$ scp -P 2222 file.tgz bee@localhost:~/
bee@localhost's password: <-----这里输入的是server01的ssh登陆密码
file.tgz                                               100%  21143KB  18.6MB/s   00:00
文件将被拷贝到server01的~/中。

拷贝过程通过bastion的ssh tunnel中转,但不占用bastion的外存。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值