ssh 怎么通过跳板机传文件到内网_SSH 命令的三种代理功能(-L/-R/-D)

news/2023/9/25 18:29:45

ssh 命令除了登陆外还有三种代理功能:

  • 正向代理(-L):相当于 iptable 的 port forwarding
  • 反向代理(-R):相当于 frp 或者 ngrok
  • socks5 代理(-D):相当于 ss/ssr

如要长期高效的服务,应使用对应的专用软件。如没法安装软件,比如当你处在限制环境下想要访问下某个不可达到的目标,或者某个临时需求,那么 ssh 就是你的兜底方案。

正向代理:

所谓“正向代理”就是在本地启动端口,把本地端口数据转发到远端。

用法1:远程端口映射到其他机器

HostB 上启动一个 PortB 端口,映射到 HostC:PortC 上,在 HostB 上运行:

HostB$ ssh -L 0.0.0.0:PortB:HostC:PortC user@HostC

这时访问 HostB:PortB 相当于访问 HostC:PortC(和 iptable 的 port-forwarding 类似)。

用法2:本地端口通过跳板映射到其他机器

HostA 上启动一个 PortA 端口,通过 HostB 转发到 HostC:PortC上,在 HostA 上运行:

HostA$ ssh -L 0.0.0.0:PortA:HostC:PortC  user@HostB

这时访问 HostA:PortA 相当于访问 HostC:PortC。

两种用法的区别是,第一种用法本地到跳板机 HostB 的数据是明文的,而第二种用法一般本地就是 HostA,访问本地的 PortA,数据被 ssh 加密传输给 HostB 又转发给 HostC:PortC。

反向代理:

所谓“反向代理”就是让远端启动端口,把远端端口数据转发到本地。

HostA 将自己可以访问的 HostB:PortB 暴露给外网服务器 HostC:PortC,在 HostA 上运行:

HostA$ ssh -R HostC:PortC:HostB:PortB  user@HostC

那么链接 HostC:PortC 就相当于链接 HostB:PortB。使用时需修改 HostC 的 /etc/ssh/sshd_config,添加:

GatewayPorts yes

相当于内网穿透,比如 HostA 和 HostB 是同一个内网下的两台可以互相访问的机器,HostC是外网跳板机,HostC不能访问 HostA,但是 HostA 可以访问 HostC。

那么通过在内网 HostA 上运行 ssh -R 告诉 HostC,创建 PortC 端口监听,把该端口所有数据转发给我(HostA),我会再转发给同一个内网下的 HostB:PortB。

同内网下的 HostA/HostB 也可以是同一台机器,换句话说就是内网 HostA 把自己可以访问的端口暴露给了外网 HostC。

按照前文《韦易笑:内网穿透:在公网访问你家的 NAS》中,相当于再 HostA 上启动了 frpc,而再 HostC 上启动了 frps。

本地 socks5 代理

在 HostA 的本地 1080 端口启动一个 socks5 服务,通过本地 socks5 代理的数据会通过 ssh 链接先发送给 HostB,再从 HostB 转发送给远程主机:

HostA$ ssh -D localhost:1080  HostB

那么在 HostA 上面,浏览器配置 socks5 代理为 127.0.0.1:1080,看网页时就能把数据通过 HostB 代理出去,类似 ss/ssr 版本,只不过用 ssh 来实现。

使用优化

为了更好用一点,ssh 后面还可以加上:-CqTnN 参数,比如:

$ ssh -CqTnN -L 0.0.0.0:PortA:HostC:PortC  user@HostB

其中 -C 为压缩数据,-q 安静模式,-T 禁止远程分配终端,-n 关闭标准输入,-N 不执行远程命令。此外视需要还可以增加 -f 参数,把 ssh 放到后台运行。

这些 ssh 代理没有短线重连功能,链接断了命令就退出了,所以需要些脚本监控重启,或者使用 autossh 之类的工具保持链接。

功能对比

正向代理(-L)的第一种用法可以用 iptable 的 port-forwarding 模拟,iptable 性能更好,但是需要 root 权限,ssh -L 性能不好,但是正向代理花样更多些。反向代理(-R)一般就作为没有安装 frp/ngrok/shootback 时候的一种代替,但是数据传输的性能和稳定性当然 frp 这些专用软件更好。

socks5 代理(-D)其实是可以代替 ss/ssr 的,区别和上面类似。所以要长久使用,推荐安装对应软件,临时用一下 ssh 挺顺手。

--

补充下 iptable 的 port-forwarding 怎么设置,十分管用的功能,两个函数即可:

#! /bin/sh# create forward rule by source interface
# http://serverfault.com/questions/532569/how-to-do-port-forwarding-redirecting-on-debian
PortForward1() {local IN_IF=$1local IN_PORT=$2local OUT_IP=$3local OUT_PORT=$4local IPTBL="/sbin/iptables"echo "1" > /proc/sys/net/ipv4/ip_forward$IPTBL -A PREROUTING -t nat -i $IN_IF -p tcp --dport $IN_PORT -j DNAT --to-destination ${OUT_IP}:${OUT_PORT}$IPTBL -A FORWARD -p tcp -d $OUT_IP --dport $OUT_PORT -j ACCEPT$IPTBL -A POSTROUTING -t nat -j MASQUERADE
}# create forward rule by source ip
# http://blog.csdn.net/zzhongcy/article/details/42738285
ForwardPort2() {local IN_IP=$1local IN_PORT=$2local OUT_IP=$3local OUT_PORT=$4local IPTBL="/sbin/iptables"echo "1" > /proc/sys/net/ipv4/ip_forward$IPTBL -t nat -A PREROUTING --dst $IN_IP -p tcp --dport $IN_PORT -j DNAT --to-destination ${OUT_IP}:${OUT_PORT}$IPTBL -t nat -A POSTROUTING --dst $OUT_IP -p tcp --dport $OUT_PORT -j SNAT --to-source $IN_IP
}

第一个函数是按照网卡名称设置转发:

PortForward1 eth1 8765 202.115.8.2 8765

这时,本地 eth1 网卡的 8765 端口就会被转发给 202.115.8.2 的 8765 端口。

第二个函数是按照本机的 ip 地址,比如本机是 192.168.1.2:

PortForward2 192.168.1.2 8765 202.115.8.2 8765

那么任何访问本机 192.168.1.2 这个地址 8765 端口,都会被转发到 202.115.8.2:8765

这个 iptable 的 port forwarding 是内核层运行的,性能极好,只不过每次重启都需要重新设置下。


https://dhexx.cn/news/show-16969.html

相关文章

java开发_2020年Java开发就业前景怎么样?

点击上方“千锋教育”后台回复「 JAVA」,领取视频学习教程Java属于编程语言的核心语言,很多公司都在用Java,Java语言开发优势显著稳定性好,在服务器端Java发挥高性能、安全稳健的特性。2019年Java岗位需求仍呈现持续上升趋势供不应…

git学习 本地常用操作01

注意: Microsoft的Word格式是二进制格式,因此,版本控制系统是没法跟踪Word文件的改动不要使用Windows自带的记事本编辑任何文本文件开始git项目: 初始化本地项目: 初始化:git init; //git init dir 同时创建…

Havel-Hakimi定理(握手定理)

Havel-Hakimi定理(握手定理) 由非负整数组成的非增序列s(度序列):d1,d2,…,dn(n>2,d1>1)是可图的,当且仅当序列: s1…

vscode在html看到图片的插件_三个强大的PPT插件工具

今天分享三个强大的PPT插件工具,我知道,很多同学都不需要做很专业的PPT,只要不是太丑,看得过去,直接套用模板就可以了。即使我们自己会做专业的PPT,但是也会偷懒,直接套用模板,差一点…

IOS开发网络篇—数据安全

一、简单说明 1.说明 在开发应用的时候,数据的安全性至关重要,而仅仅用POST请求提交用户的隐私数据,还是不能完全解决安全问题。 如:可以利用软件(比如Charles)设置代理服务器,拦截查看手机的请…

javaweb 图书管理系统完整代码_基于Java web的图书管理系统

源码编号:B-E00029点击查看(分类规则)项目类型:Java EE项目(非开源)项目名称:基于Java web的图书管理系统(library_system)当前版本:V2.0.2版本难度等级:✩✩复杂程度:✩✩ 点击查看难度等级用户类型&#…

python学习笔记24(路径与文件 (os.path包, glob包))

python学习笔记24(路径与文件 (os.path包, glob包)) os.path模块主要用于文件的属性获取,在编程中经常用到,以下是该模块的几种常用方法。 >>> import os.path >>> path /home/ethon/doc/file.txt >>>…

代码和普通的java_【Java基础】2、Java中普通代码块,构造代码块,静态代码块区别及代码示例...

Java中普通代码块,构造代码块,静态代码块区别及代码示例。Java中普通代码块,构造代码块,静态代码块区别及代码示例执行顺序:静态代码块>静态方法(main方法)>构造代码块>构造方法。其中静态代码块在jvm加载类的…

imp 日志_海贼王:罗杰航海日志公开,把2个 “冥王”留给了路飞

本平台为了热爱漫画,热爱壁纸美图和热爱二次元的朋友们而建, 仅作兴趣分享。如有侵权请联系删除。声明:本公众号所有图片均来源于网络,如有侵权或违法行为,请及时告知删除。本公众号所有资源仅用于漫迷学习交流&#x…

【Linux导论】Linux发行版本(Linux Distributions)

原文 LFS101x.2 Introduction to Linux (Linux Foundation) Chapter 01: The Linux Foundation - Section 3: Course Linux Requirements Chapter 02: Linux Philosophy and Concepts - Section 5: Linux Distributions Chapter 01: The Linux Foundation - Section 3: Course …