我正在尝试建立一个 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。