Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SSH 隧道 #19

Open
jsiwa opened this issue Jun 19, 2024 · 1 comment
Open

SSH 隧道 #19

jsiwa opened this issue Jun 19, 2024 · 1 comment

Comments

@jsiwa
Copy link
Owner

jsiwa commented Jun 19, 2024

SSH 隧道(SSH Tunneling),也称为 SSH 端口转发,是通过安全的 SSH 协议创建一个加密的连接,来转发本地或远程的端口流量。它主要用于在不安全的网络环境中安全地访问远程服务,或者绕过防火墙的限制。

SSH 隧道的类型

SSH 隧道有三种主要类型:

  1. 本地端口转发(Local Port Forwarding):
    通过将本地端口的流量转发到远程主机的指定端口,实现对远程服务的安全访问。

  2. 远程端口转发(Remote Port Forwarding):
    将远程服务器端口的流量转发到本地主机的指定端口,实现从远程服务器访问本地服务。

  3. 动态端口转发(Dynamic Port Forwarding):
    将本地端口作为 SOCKS 代理,动态地将流量转发到不同的远程主机和端口。

1. 本地端口转发

本地端口转发用于将本地端口的流量通过 SSH 隧道转发到远程主机上的指定端口。常见应用场景是通过 SSH 隧道访问远程数据库、Web 服务器等。

示例

假设你有一台远程服务器 remote-server.com,上面运行着 MySQL 数据库,监听端口为 3306。你可以通过以下命令创建本地端口转发:

ssh -L 3307:localhost:3306 [email protected]
  • -L:指定本地端口转发。
  • 3307:本地机器上的端口,任意未被占用的端口。
  • localhost:目标主机(相对于远程服务器)。
  • 3306:目标主机上的端口(MySQL 默认端口)。
  • username:远程服务器的用户名。
  • remote-server.com:远程服务器的地址。

完成上述命令后,你可以通过访问本地的 3307 端口来连接远程服务器上的 MySQL:

mysql -h 127.0.0.1 -P 3307 -u your_mysql_user -p

2. 远程端口转发

远程端口转发用于将远程服务器上的端口流量通过 SSH 隧道转发到本地机器上的指定端口。常见应用场景是通过远程服务器访问本地的服务。

示例

假设你在本地机器上运行一个 Web 服务器,监听端口为 8080。你可以通过以下命令创建远程端口转发:

ssh -R 9090:localhost:8080 [email protected]
  • -R:指定远程端口转发。
  • 9090:远程服务器上的端口,任意未被占用的端口。
  • localhost:目标主机(相对于本地机器)。
  • 8080:目标主机上的端口(本地 Web 服务器端口)。
  • username:远程服务器的用户名。
  • remote-server.com:远程服务器的地址。

完成上述命令后,你可以通过访问远程服务器上的 9090 端口来访问本地机器上的 Web 服务器。

3. 动态端口转发

动态端口转发用于创建一个 SOCKS 代理,通过该代理动态转发流量到不同的远程主机和端口。常见应用场景是绕过防火墙或访问被限制的资源。

示例

假设你希望通过远程服务器 remote-server.com 作为代理访问网络资源。你可以通过以下命令创建动态端口转发:

ssh -D 1080 [email protected]
  • -D:指定动态端口转发。
  • 1080:本地机器上的端口,用于 SOCKS 代理。
  • username:远程服务器的用户名。
  • remote-server.com:远程服务器的地址。

完成上述命令后,你可以将本地应用程序(如浏览器)的代理设置为 127.0.0.1:1080,通过该 SOCKS 代理访问网络。

使用 SSH 隧道的安全性

SSH 隧道通过 SSH 协议加密所有流量,确保数据在传输过程中不被窃听或篡改。同时,通过使用 SSH 密钥验证,可以进一步增强连接的安全性。

总结

SSH 隧道是一种强大的工具,可以在不安全的网络环境中安全地访问远程服务。通过本地端口转发、远程端口转发和动态端口转发,可以满足不同的访问需求。了解和掌握 SSH 隧道的使用方法,可以大大提高网络连接的安全性和灵活性。

@jsiwa
Copy link
Owner Author

jsiwa commented Jun 19, 2024

当然,我会逐步解释这个 SSH 命令 ssh -Nf -L 19000:12.1.1.1:9000 user 中每个部分的含义。

命令概览

ssh -Nf -L 19000:12.1.1.1:9000 user@hostname
  • ssh: 使用 Secure Shell 协议来连接到远程服务器。
  • -N: 不执行远程命令,只进行端口转发。这通常用于在只需要创建一个隧道时使用。
  • -f: 使 SSH 进入后台运行,这样可以在不阻塞当前终端的情况下保持隧道打开。
  • -L 19000:12.1.1.1:9000: 本地端口转发选项,将本地机器的 19000 端口转发到远程机器的 12.1.1.1:9000。
    • 19000: 本地机器的端口号。
    • 12.1.1.1: 远程机器的 IP 地址。
    • 9000: 远程机器上的端口号。
  • user: 用于登录远程服务器的用户名。
  • hostname: 远程服务器的主机名或 IP 地址(在命令中未显示)。

详细解释

-N

-N 选项告诉 SSH 不执行远程命令,只进行端口转发。这在只需要创建一个隧道时非常有用。通常用于端口转发或创建一个 SSH 隧道,不需要在远程主机上执行命令。

-f

-f 选项让 SSH 进入后台运行。一旦 SSH 验证成功并建立连接后,它就会把任务转移到后台,以便当前终端可以继续使用。这与 -N 选项一起使用非常常见,因为你不需要执行任何命令,只需保持隧道打开。

-L 19000:12.1.1.1:9000

-L 选项定义了本地端口转发。格式是 local_port:remote_host:remote_port

  • 19000: 本地机器上的端口号。你将通过本地的 localhost:19000 访问隧道。
  • 12.1.1.1: 远程主机的 IP 地址或主机名。
  • 9000: 远程主机上的端口号。

这意味着所有发送到本地 localhost:19000 的流量将通过 SSH 隧道转发到远程主机 12.1.1.1 的端口 9000

user@hostname

  • user: 用于登录远程服务器的用户名。
  • hostname: 远程服务器的主机名或 IP 地址(在命令中未显示,但假定存在)。

完整命令示例:

ssh -Nf -L 19000:12.1.1.1:9000 [email protected]

实际使用

  1. 执行命令:
    在终端中运行上述命令。

    ssh -Nf -L 19000:12.1.1.1:9000 [email protected]
  2. 验证连接:
    你现在可以在本地访问 localhost:19000,实际流量会通过 SSH 隧道转发到 12.1.1.1:9000

例子

假设远程服务器 remote-server.com 上有一个服务在 IP 12.1.1.1 和端口 9000 上运行。你想在本地通过 localhost:19000 访问该服务,可以使用:

ssh -Nf -L 19000:12.1.1.1:9000 [email protected]

这会在本地创建一个监听端口 19000,所有发送到这个端口的数据会通过 SSH 隧道转发到远程服务器上的 12.1.1.1:9000

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant