如何配置远程端口转发(openssh和防火墙)

时间:2020-01-09 10:40:37  来源:igfitidea点击:

我们指定在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.

并且看起来我们的端口转发正在按预期方式工作。