我需要从互联网上通过 ssh 访问我的一台虚拟机。
我在防火墙表中添加了 NAT 规则,但它不起作用。
firewall-cmd --add-rich-rule 'rule family="ipv4" destination address=$mypublicip forward-port port="4444" protocol="tcp" to-port="22" to-addr="$myprivateip"'
经过更多调查后,我发现我可以使用 iptables 添加以下两个规则的组合,并且效果很好。
iptables -t nat -I PREROUTING -p tcp --dport 4444 -j DNAT --to $myprivateip:22
iptables -I FORWARD -o virbr0 -d $myprivateip -j ACCEPT
因为我喜欢firewall-cmd命令行,所以我尝试使用firewall-cmd命令行添加相同的iptables规则,并使用以下命令来完成。
firewall-cmd --direct --permanent --add-rule ipv4 nat PREROUTING 0 -d $myip -p tcp --dport 4444 -j DNAT --to $myprivateip:22
firewall-cmd --direct --permanent --add-rule ipv4 filter FORWARD 0 -o virbr0 -d $myprivateip -j ACCEPT
检查我的防火墙表后,我意识到 PREROUTING_direct 和 FORWARD_direct 表中存在最后 2 条规则,它们无法正常工作,并且不提供我的 SSH 访问权限。
PREROUTING 和 PREROUTING_direct 或 FORWARD 和 FORWARD_direct 表之间有什么区别?如果它们是仅用于 --direct 规则的相同表,为什么它们不能像 PREROUTING 和 FORWARD 表一样工作?