如何配置远程端口转发(openssh和防火墙)
我们指定在SSH中的" -L"可以进行本地端口转发。
在本节中,我们将讨论OpenSSH中的-R
远程端口转发功能。
让我们回顾一下,"-L"本地端口转发是客户端上的侦听端口,由客户端启动,以等待将连接隧穿到服务器。
" -R"远程端口转发正好相反-隧道是从服务器主机启动回客户端的,侦听端口位于转发到服务器的客户端上。
远程端口转发不太常见,可用于连接无法从Internet访问的本地端口,连接到Internet上可用的服务器上的端口,
通过带有OpenSSH远程端口转发隧道的防火墙
在OpenSSH中," – R [bind_address:] port:host:hostport]"命令指定将远程(服务器)主机上的给定端口转发到本地的给定主机和端口。
例如:命令ssh –R 4444:localhost:23 username @ host将所有进入端口4444的服务器流量转发到客户端上的端口23.
假设安全部门不允许我们从家庭(" node2")连接到位置(" node1"),因为它将被防火墙阻止。
SSH端口转发抢救!只要允许我们从服务器SSH到家庭服务器,我们就可以从家庭建立隧道并连接回node1
!
重要的提示:
我们应该始终遵循安全策略,并确保我们没有违反任何规则。
如果不确定,请务必与安全部门联系。
仅仅因为我们可以绕过安全性的防火墙并不意味着它被允许。
我们的第一步是启动从节点1到节点2的SSH连接,并选择正确的选项以通过SSH从节点2隧道回到节点1.
在此命令中,我们使用从-node1发起的-R远程转发命令:ssh -R 7777:node1:22 root @ node2
,这将在我们的node2
上打开一个'7777'TCP端口并转发所有将其连接回端口22(ssh)上的我们的" node1"。
[root@node1 ~]# ssh -v -fN -R 7777:node1:22 root@node2 debug1: Remote connections from LOCALHOST:7777 forwarded to local address node1:22
说明:
我们可以在详细调试模式下添加–v
选项。
SSH版本2引入了" -N"选项,该选项可防止在远程主机上执行命令。
如果我们只想转发端口而不在创建SSH隧道后在远程主机上执行任何命令,则此选项很有用。
现在,我们在" node1"和" node2"之间创建了一个SSH隧道,剩下要做的就是回到" node2"并连接回" node1",这通常会被阻止。
防火墙。
让我们进入我们的node2
并进行验证。
使用netstat
命令来验证端口7777是否仍在运行,并侦听仅来自我们本地环回IP地址的连接。
大多数防火墙会关闭闲置时间过长的会话,以防安全措施。
如果我们下班回家需要很长时间,那么" node1"和" node2"之间的会话可能会空闲并关闭。
要绕过此步骤并使会话保持活动状态,只需在隧道的另一端ping一下即可。
[root@node2 ~]# netstat -ntlp | grep 7777 tcp 0 0 0.0.0.0:7777 0.0.0.0:* LISTEN 4972/sshd: root tcp6 0 0 :::7777 :::* LISTEN 4972/sshd: root
[root@node1 ~]# ps aux | grep ssh root 4360 0.0 0.1 154548 5520 ? Ss 11:08 0:00 sshd: root@pts/0 root 4944 0.0 0.1 154548 5516 ? Ss 11:57 0:00 sshd: root@pts/1 root 5497 0.0 0.1 112756 4316 ? Ss 12:20 0:00 /usr/sbin/sshd -D root 5516 0.0 0.0 178544 1464 ? Ss 12:20 0:00 ssh -v -fN -R 7777:node1:22 root@node2 root 5517 2.0 0.1 154548 5536 ? Ss 12:21 0:00 sshd: root@pts/2 root 5556 0.0 0.0 112708 976 pts/0 R+ 12:21 0:00 grep --color=auto ssh
下面的命令向我们展示了我们的node2
在端口'7777'上发起了回到node1
的连接。
我们进来了!我们已经成功地从家里通过SSH返回到我们的工作机器。
[root@node2 ~]# ssh -p 7777 root@localhost root@localhost's password: Last login: Tue Apr 9 12:19:43 2019 from 10.0.2.30 [root@node1 ~]#
在与使用端口转发建立的连接有关的" node1"上打印了一条详细消息。
说明:
仅当使用详细(-v
)选项执行ssh端口转发时,此选项才可见。
[root@node1 ~]# debug1: client_input_channel_open: ctype forwarded-tcpip rchan 2 win 2097152 max 32768 debug1: client_request_forwarded_tcpip: listen localhost port 7777, originator ::1 port 41226 debug1: connect_next: host node1 ([10.0.2.30]:22) in progress, fd=4 debug1: channel 0: new [::1] debug1: confirm forwarded-tcpip debug1: channel 0: connected to node1 port 22
使用Firewalld的SSH端口转发
我们也可以使用防火墙规则进行端口转发,但这与我们上面实现的功能并不完全相同,但是如果想法是使用备用端口连接到节点,则也可以使用"防火墙"。
如我们所见,当前在我的"防火墙"区域中没有任何活动规则。
[root@node2 ~]# firewall-cmd --list-all public (active) target: default icmp-block-inversion: no interfaces: eth0 sources: services: ssh dhcpv6-client ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
让我添加一个端口转发规则,其中端口2233上的任何连接都将路由到node2传入连接上的端口22.
[root@node2 ~]# firewall-cmd --add-forward-port=port=2233:proto=tcp:toport=22 success
现在验证新规则
[root@node2 ~]# firewall-cmd --list-all public (active) target: default icmp-block-inversion: no interfaces: eth0 sources: services: ssh dhcpv6-client ports: protocols: masquerade: no forward-ports: port=2233:proto=tcp:toport=22:toaddr= source-ports: icmp-blocks: rich rules:
让我们尝试使用我们为端口转发配置的新端口,从任何其他节点连接到" node2"。
[root@node1 ~]# ssh -p 2233 root@node2 root@node2's password: Last login: Tue Apr 9 12:26:39 2019 from 10.0.2.30 [root@node2 ~]# logout Connection to node2 closed.
并且看起来我们的端口转发正在按预期方式工作。