使用防火墙命令进行 ssh 端口转发

使用防火墙命令进行 ssh 端口转发

我正在尝试建立一个 SSH 隧道到 NAT 后面的服务器:

从笔记本电脑进行 ssh --> 在防火墙中通过端口转发托管 --> 直接进入客户机(172.16.0.2,位于主机 NAT 后面)。

在主机上使用 iptables-它将起作用:

# iptables -I OUTPUT  -d 0.0.0.0/0 -j ACCEPT
# iptables -I FORWARD  -d 0.0.0.0/0 -j ACCEPT
# iptables -I INPUT  -d 0.0.0.0/0 -j ACCEPT
# iptables -t nat -I PREROUTING -d 0.0.0.0/0 -p tcp --dport 222 -j DNAT --to-destination 172.16.0.2:22

然而,由于firewalld 服务正在运行(firewalld 是 RHEL 7 中的默认服务),因此主机重启时 iptables 不会保存。

所以我也想这么做使用防火墙命令进行端口转发

在主机上使用防火墙命令-它将不起作用:

# firewall-cmd --permanent --zone=public --add-forward-port=port=222:proto=tcp:toport=22:toaddr=172.16.0.2'
# firewall-cmd --permanent --zone=public --add-masquerade
# firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD 0 -d 0.0.0.0/0 -j ACCEPT
# firewall-cmd --permanent --direct --add-rule ipv4 filter OUTPUT 0 -d 0.0.0.0/0 -j ACCEPT
# firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -d 0.0.0.0/0 -j ACCEPT

# firewall-cmd --permanent --direct --add-rule ipv4 nat PREROUTING 0 -d 0.0.0.0/0 -p tcp --dport 222 -j DNAT --to-destination 172.16.0.2:22

# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="0.0.0.0/0" forward-port port="222" protocol="tcp" to-port="22" to-addr='"172.16.0.2"

# firewall-cmd --reload

# firewall-cmd --list-all

public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp4s0f0
  sources: 
  services: ssh dhcpv6-client
  ports: 8139/tcp
  protocols: 
  masquerade: yes
  forward-ports: port=222:proto=tcp:toport=22:toaddr=172.16.0.2
  source-ports: 
  icmp-blocks: 
  rich rules: 
     rule family="ipv4" destination address="0.0.0.0/0" forward-port port="222" protocol="tcp" to-port="22" to-addr="172.16.0.2" 

# firewall-cmd --direct --get-all-rules

ipv4 filter INPUT 0 -d 0.0.0.0/0 -j ACCEPT
ipv4 filter OUTPUT 0 -d 0.0.0.0/0 -j ACCEPT
ipv4 filter FORWARD 0 -d 0.0.0.0/0 -j ACCEPT
ipv4 nat PREROUTING 0 -d 0.0.0.0/0 -p tcp --dport 222 -j DNAT --to-destination 172.16.0.2:22

现在,当尝试从我的笔记本电脑通过主机端口 222 连接到客户机时,ssh 连接被拒绝:

ssh -l stack my-host -p 222
ssh: connect to host my-host port 222: Connection refused

知道我错过了什么吗?

答案1

您可以尝试firewall-cmd --add-forward-port

firewall-cmd --permanent --add-forward-port=port=222:proto=tcp:toaddr=172.x.x.x:toport=22
firewall-cmd --reload

一般语法 (https://firewalld.org/documentation/man-pages/firewall-cmd.html):

firewall-cmd [--permanent] [--zone=zone] \
 --add-forward-port=port=portid[-portid]:proto=protocol[:toport=portid[-portid]][:toaddr=address[/mask]] \
 [--timeout=timeval]

编辑:这个快速指南可能就是您所需要的,但正如评论指出的那样,这并不能解决 OP 的问题。如果您使用的是 libvirt,请查看 Eduardo 的评论以了解可能的解决方案。

答案2

我个人也遇到过类似的问题,这个解决方案帮了我大忙。请尝试一下,如果有用的话请告诉我。

访问 NAT 后面的服务器的方法有几种:端口转发,您可以配置路由器/防火墙将传入流量转发到内部服务器。通常,您需要指定协议(UDP/TCP)、外部服务端口和内部服务端口。

对于使用firewall-cmd进行ssh端口转发,请尝试以下命令:

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 222 -j DNAT \--to 172.x.x.x.:22 

从给出的代码中,我大概知道这就是你想要实现的。所以,请务必检查端口。就我而言,我尝试使用端口 80 执行相同的操作。

此规则指定 NAT 表使用内置的 PREROUTING 链将传入的 HTTP 请求专门转发到列出的目标 IP 地址

答案3

听起来你的问题不是你的firewall-cmd 命令的问题,而是与 OpenStack 有关的问题?

作为参考,我将发布最终的回应(可能是 James Slagle 的这个)在Bugzilla 报告你做了-以防万一它能帮助别人:

根据 Eric 的建议,该问题与 OSP 部署有关,因此将错误所有者更改为 TripleO。

请注意,它会影响 OSP 14 及以下版本。

不,根据我对错误的解释,这不正确。您正尝试在托管名为 undercloud-0 的虚拟机的主机 (titan08) 上添加防火墙规则。

undercloud-0 是 OpenStack 的安装位置。但是物理主机(titan08)本身上没有 OpenStack rpm 或配置。

在这种情况下,这似乎完全与物理主机的防火墙配置有关,而不是 OpenStack vm。

正如 Eric 指出的那样,您尝试使用 firewalld 添加的规则并没有保存在物理主机(titan08)上。

我的理解正确吗?

当您在虚拟机上安装 OpenStack 时,它不会对物理主机本身进行任何更改。

答案4

您提供的“症状”和数据与我们在“默认网络”中使用 KVM (libvirt) 时遇到的情况非常相似。因此,我们认为下面的答案非常中肯...

使用 KVM (libvirt) 和“默认网络”(virbr0) 进行端口转发的“唯一”方法是使用 @Antony Nguyen 告知的 hack/workaround。或者更简单地说,你可以使用libvirt-hook-qemu

这个线程完整地解释了如何使用 libvirt-hook-qemu 解决 CentOS 7(当然还有其他发行版)的这个问题:https://superuser.com/a/1475915/195840

相关内容