ssh 执行远程命令和端口转发

执行远程命令

查看远程主机是否运行进程httpd

ssh user@remote_host 'ps ax | grep httpd'

绑定本地端口

假定我们要让 1081 端口的数据,都通过 SSH 传向远程主机,命令就这样写

ssh -D 1081 user@remote_host

SSH 会建立一个 socket,去监听本地的 1081 端口,所有链接本地 1081 端口的数据都会被转发到 remote_host

如果 remote_host 具备翻墙的功能,那么这个命令相当于在本地的 1081 端口上建立一个 sock 的代理服务器

使用 netstat 命令观察在 localhost:1081 上建立 tcp 监听端口

sudo netstat -lt     
Proto Recv-Q Send-Q Local Address           Foreign Address         State       
tcp        0      0 0.0.0.0:ssh             0.0.0.0:*               LISTEN      
tcp        0      0 localhost:1081          0.0.0.0:*               LISTEN   

在本机的所有网卡上监听 1081 端口

ssh -D 0.0.0.0:1081 user@remote_host
ssh -o GatewayPorts=true -D 1081 user@remote_host

使用 netstat 命令观察

sudo netstat -lt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 0.0.0.0:ssh             0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:1081            0.0.0.0:*               LISTEN

本地端口转发

有时,绑定本地端口还不够,还必须指定数据传送的目标主机,从而形成点对点的 端口转发

为了区别后文的 远程端口转发 ,我们把这种情况称为 本地端口转发(Local forwarding)

假定 host1 是本地主机,host2 是远程主机。由于种种原因,这两台主机之间无法连通

但是,另外还有一台 host3,可以同时连通前面两台主机。因此,很自然的想法就是,通过 host3,将 host1 连上 host2

我们在 host1 执行下面的命令:

ssh -L 1081:host2:1080 host3

命令中的 L 参数一共接受三个值,分别是 本地端口:目标主机:目标主机端口,它们之间用冒号分隔

这条命令的意思,就是指定 SSH 绑定本地端口 1081,然后指定 host3 将所有的数据,转发到目标主机 host21080 端口

这样一来,我们只要连接 host11081 端口,就等于连上了 host21080 端口

本地端口转发 使得 host1host3 之间仿佛形成一个数据传输的秘密隧道,因此又被称为 SSH隧道

host1上 使用 netstat 命令观察

sudo netstat -lt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State         
tcp        0      0 0.0.0.0:ssh             0.0.0.0:*               LISTEN        
tcp        0      0 localhost:1081          0.0.0.0:*               LISTEN

host1 的所有网卡上监听 1081 端口

ssh -L 0.0.0.0:1081:host2:1080 host3

ssh -o GatewayPorts=true -L 1081:host2:1080 host3

使用 netstat 命令观察

sudo netstat -lt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 0.0.0.0:ssh             0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:1081            0.0.0.0:*               LISTEN

远程端口转发

既然 本地端口转发 是指绑定本地端口的转发,那么 远程端口转发(remote forwarding) 当然是指绑定远程端口的转发

还是接着看上面那个例子,host1host2 之间无法连通,必须借助 host3 转发

但是,特殊情况出现了,host3 是一台内网机器,它可以连接外网的 host1,但是反过来就不行,外网的 host1 连不上内网的 host3

这时,本地端口转发 就不能用了,怎么办?

解决办法是,既然 host3 可以连 host1,那么就从 host3 上建立与 host1SSH 连接,然后在 host1上使用这条连接就可以了。

我们在 host3 执行下面的命令:

ssh -R 1081:host2:1080 host1

R 参数也是接受三个值,分别是 远程主机端口:目标主机:目标主机端口

这条命令的意思,就是让 host1 监听它自己的 1081 端口,然后将所有数据经由 host3,转发到 host21080端口

由于对于 host3 来说,host1 是远程主机,所以这种情况就被称为 远程端口绑定

绑定之后,我们在 host1 就可以连接 host2

这里必须指出,远程端口转发 的前提条件是,host1host3 两台主机都有 sshDssh 客户端

host1上 使用 netstat 命令观察

sudo netstat -lt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State         
tcp        0      0 0.0.0.0:ssh             0.0.0.0:*               LISTEN        
tcp        0      0 localhost:1081          0.0.0.0:*               LISTEN

host1 的所有网卡上监听 1081 端口

host1/etc/ssh/sshd_config 文件下添加, user-name 为 ssh 登录 host1 的用户名

Match User <user-name>
        GatewayPorts yes

我们在 host3 执行下面的命令:

ssh -R 1081:host2:1080 host1

host1上 使用 netstat 命令观察

sudo netstat -lt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address       State
tcp        0      0 0.0.0.0:ssh             0.0.0.0:*             LISTEN
tcp        0      0 0.0.0.0:1081            0.0.0.0:*             LISTEN

参考链接

本地端口转发是通过SSH连接在本地主机上执行命令。它允许将本地主机上的一个端口转发远程主机上的另一个端口。通过这种方式,可以在本地主机上访问远程主机上的服务。例如,可以将本地主机的8080端口转发远程主机的80端口,这样就可以通过在本地浏览器中访问localhost:8080来访问远程主机上的网页服务。\[1\] 要执行本地端口转发,可以使用以下命令: ``` ssh -L <本地端口>:<目标主机>:<目标端口> <用户名>@<远程主机> ``` 其中,<本地端口>是要转发的本地主机端口,<目标主机>是要连接的远程主机的IP地址或主机名,<目标端口>是要转发到的远程主机端口,<用户名>是远程主机的用户名,<远程主机>是要连接的远程主机的IP地址或主机名。\[1\] 例如,要将本地主机的8080端口转发远程主机的80端口,可以使用以下命令: ``` ssh -L 8080:localhost:80 user@example.com ``` 这将在本地主机上建立一个监听8080端口SSH隧道,并将所有流量转发到远程主机的80端口。然后,可以通过在本地浏览器中访问localhost:8080来访问远程主机上的网页服务。\[1\] #### 引用[.reference_title] - *1* *2* *3* [一文彻底搞懂ssh端口转发](https://blog.csdn.net/MyySophia/article/details/128211718)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值