SSH 隧道端口转发
SSH tunnel Port forwarding
我有以下机器网络配置:我正在使用机器 A,可以通过 ssh 访问机器 B。机器 B 可以通过 ssh 访问更多内部机器。我也想达到那些。我可以将端口转发到我的机器吗?
我的目标是像往常一样在我的机器上的端口 22 上使用 ssh 访问所有机器,并在端口 22 上访问所有连接到 B 的内部机器。
我如何在 Linux 中做到这一点?
基本上有两种方法:
- 当您能够利用环回保留端口号时
接口和多个 IP 地址
- 当你使用一些直观的(对你来说)重新映射这些端口时
方案。
例如,远程网络上有 5 个节点在该网络之外是不可见的。
因此,您可以将所有这些 ssh 端口映射到您的节点,如 22001、22002、22003、22004 和 22004。
这样您就可以轻松映射远程网络中所有 255 台设备的 ssh 端口,例如 192.168.0.0
当您尝试以这种方式为每个设备映射 3-4 个端口时,尤其是当端口号高于 65 时,这样的编号会变得很乱:-)
例如,您可以按照以下方式映射 5 个神话节点的端口 22 和 80:
ssh me@server \
-L 22001:node1:22 -L 8001:node1:80 \
-L 22002:node2:22 -L 8002:node2:80 \
-L 22003:node3:22 -L 8003:node3:80 \
-L 22004:node4:22 -L 8004:node4:80 \
-L 22005:node5:22 -L 8005:node5:80
这样您就可以通过以下方式从您的节点连接到 node1:
ssh me2@localhost -p 22001
并通过URLhttp://localhost:8001/
访问node1的http端口
您还可以通过更改 /etc/hosts 和 ~/.ssh/config 文件来补充此类隧道让生活更轻松:
#/etc/hosts
127.0.0.1 node1 node2 node3 node4 node5
#~/.ssh/config
Host node1
Port 22001
Host node2
Port 22002
Host node3
Port 22003
Host node4
Port 22004
然后你可以通过这种方式 ssh 进入 node1:
ssh me2@node1
这种方法在远程节点和要映射的端口很少的情况下是可行的,但是当您拥有更大的设备群时,这种方法就会变得噩梦般。
我认为更好的方法是将远程节点的端口映射到相同的端口号,但映射到本地 ip 地址与您的节点相关联。
因此,您正在为环回接口分配 5 个新地址:
sudo ip addr add 127.77.77.1/8 dev lo label lo:1
sudo ip addr add 127.77.77.2/8 dev lo label lo:2
sudo ip addr add 127.77.77.3/8 dev lo label lo:3
sudo ip addr add 127.77.77.4/8 dev lo label lo:4
sudo ip addr add 127.77.77.5/8 dev lo label lo:5
使用 dns 覆盖补充此类配置
# /etc/hosts
127.77.77.1 l-node1
127.77.77.2 l-node2
127.77.77.3 l-node3
127.77.77.4 l-node4
127.77.77.5 l-node5
然后创建 ssh 隧道以将远程端口映射到相同的端口号。
# here r-node# names are IP addresses of remote nodes as server sees them
ssh me@server \
-L l-node1:22:r-node1:22 -L l-node1:80:r-node1:80 \
-L l-node1:22:r-node2:22 -L l-node2:80:r-node2:80 \
-L l-node1:22:r-node3:22 -L l-node3:80:r-node3:80 \
-L l-node1:22:r-node4:22 -L l-node4:80:r-node4:80 \
-L l-node1:22:r-node5:22 -L l-node5:80:r-node5:80
一旦建立了这样的隧道,您就可以通过 ssh 访问 node3:
ssh me2@l-node3
#or
ssh me2@127.77.77.3
并在浏览器中使用 URLs,例如 http://l-node3/ or http://127.77.77.3
我有以下机器网络配置:我正在使用机器 A,可以通过 ssh 访问机器 B。机器 B 可以通过 ssh 访问更多内部机器。我也想达到那些。我可以将端口转发到我的机器吗?
我的目标是像往常一样在我的机器上的端口 22 上使用 ssh 访问所有机器,并在端口 22 上访问所有连接到 B 的内部机器。
我如何在 Linux 中做到这一点?
基本上有两种方法:
- 当您能够利用环回保留端口号时 接口和多个 IP 地址
- 当你使用一些直观的(对你来说)重新映射这些端口时 方案。
例如,远程网络上有 5 个节点在该网络之外是不可见的。 因此,您可以将所有这些 ssh 端口映射到您的节点,如 22001、22002、22003、22004 和 22004。
这样您就可以轻松映射远程网络中所有 255 台设备的 ssh 端口,例如 192.168.0.0
当您尝试以这种方式为每个设备映射 3-4 个端口时,尤其是当端口号高于 65 时,这样的编号会变得很乱:-)
例如,您可以按照以下方式映射 5 个神话节点的端口 22 和 80:
ssh me@server \
-L 22001:node1:22 -L 8001:node1:80 \
-L 22002:node2:22 -L 8002:node2:80 \
-L 22003:node3:22 -L 8003:node3:80 \
-L 22004:node4:22 -L 8004:node4:80 \
-L 22005:node5:22 -L 8005:node5:80
这样您就可以通过以下方式从您的节点连接到 node1:
ssh me2@localhost -p 22001
并通过URLhttp://localhost:8001/
访问node1的http端口您还可以通过更改 /etc/hosts 和 ~/.ssh/config 文件来补充此类隧道让生活更轻松:
#/etc/hosts
127.0.0.1 node1 node2 node3 node4 node5
#~/.ssh/config
Host node1
Port 22001
Host node2
Port 22002
Host node3
Port 22003
Host node4
Port 22004
然后你可以通过这种方式 ssh 进入 node1:
ssh me2@node1
这种方法在远程节点和要映射的端口很少的情况下是可行的,但是当您拥有更大的设备群时,这种方法就会变得噩梦般。
我认为更好的方法是将远程节点的端口映射到相同的端口号,但映射到本地 ip 地址与您的节点相关联。 因此,您正在为环回接口分配 5 个新地址:
sudo ip addr add 127.77.77.1/8 dev lo label lo:1
sudo ip addr add 127.77.77.2/8 dev lo label lo:2
sudo ip addr add 127.77.77.3/8 dev lo label lo:3
sudo ip addr add 127.77.77.4/8 dev lo label lo:4
sudo ip addr add 127.77.77.5/8 dev lo label lo:5
使用 dns 覆盖补充此类配置
# /etc/hosts
127.77.77.1 l-node1
127.77.77.2 l-node2
127.77.77.3 l-node3
127.77.77.4 l-node4
127.77.77.5 l-node5
然后创建 ssh 隧道以将远程端口映射到相同的端口号。
# here r-node# names are IP addresses of remote nodes as server sees them
ssh me@server \
-L l-node1:22:r-node1:22 -L l-node1:80:r-node1:80 \
-L l-node1:22:r-node2:22 -L l-node2:80:r-node2:80 \
-L l-node1:22:r-node3:22 -L l-node3:80:r-node3:80 \
-L l-node1:22:r-node4:22 -L l-node4:80:r-node4:80 \
-L l-node1:22:r-node5:22 -L l-node5:80:r-node5:80
一旦建立了这样的隧道,您就可以通过 ssh 访问 node3:
ssh me2@l-node3
#or
ssh me2@127.77.77.3
并在浏览器中使用 URLs,例如 http://l-node3/ or http://127.77.77.3