使用 firewall-cmd 进行 ssh 端口转发

Noa*_*nos 7 linux port-forwarding ssh-tunnel firewalld

我正在尝试通过 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
Run Code Online (Sandbox Code Playgroud)

但是,主机重启时不会保存 iptables,因为 firewalld 服务正在运行(firewalld 是 RHEL 7 中的默认设置)。

所以我正在尝试使用 firewall-cmd进行相同的端口转发

在主机上使用 firewall-cmd - 它不起作用:

# 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
Run Code Online (Sandbox Code Playgroud)

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

ssh -l stack my-host -p 222
ssh: connect to host my-host port 222: Connection refused
Run Code Online (Sandbox Code Playgroud)

知道我错过了什么吗?

mwf*_*ley 5

你可以试试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
Run Code Online (Sandbox Code Playgroud)

一般语法(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]
Run Code Online (Sandbox Code Playgroud)

  • 我确实尝试过,它已经包含在我上面的步骤中 - 它不起作用(尝试通过 ssh 连接到端口 222 时连接被拒绝)。 (2认同)

小智 0

我个人也遇到过类似的问题,这个解决方案拯救了我。请尝试一下,让我知道是否有帮助。

访问 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 
Run Code Online (Sandbox Code Playgroud)

从给定的代码中,我了解到这就是您想要实现的目标。因此,请务必检查端口。就我而言,我对端口 80 进行了相同的尝试。

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

  • 谢谢@james,这是一个“iptables”命令,而不是“firewall-cmd”。我可以使用 iptables 实现 ssh 隧道,但不能使用firewalld。 (2认同)