目的地不可达(主机管理禁止)

目的地不可达(主机管理禁止)

我在 VirtualBox 中使用仅主机网络。

主机(Windows):192.168.56.1/24

客户机(CentOS):192.168.56.101/24

有一个简单的 http 服务器在客户机中运行,它监听 0.0.0.0:8080。“curlhttp://192.168.56.101:8080/“在客户机上可以正常工作。但它在主机上不起作用(通过浏览器访问,因为我的 Windows 上没有安装 curl)。

但是从主机 ping 192.168.56.101 没问题。我尝试使用 wireshark 捕获 VirualBox-Host-Only-Network 适配器上的数据包以获得一些提示。我看到一些 ICMP 数据包从 192.168.56.101 发送到 192.168.56.1,它们告诉我“目标不可访问(主机管理禁止)”。

我可以参观http://192.168.56.101:8080/仅当我关闭来宾的防火墙时才会发生这种情况(systemctl stop firewalld)。但我不想这么做。我想参观http://192.168.56.101:8080/在客户机的防火墙处于打开状态时从主机接收。


我搜索了一段时间,但仍然不知道具体怎么做。也许与 iptables 有关,但我不熟悉它,感觉有点难以理解。有人能解释一下以下规则如何拒绝我的访问以及如何正确修改它(例如在上述情况下)吗?

谢谢。


iptables -nvL --line-numbers (when the firewall is off)

Chain INPUT (policy ACCEPT 72 packets, 6371 bytes)
num   pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 51 packets, 9866 bytes)
num   pkts bytes target     prot opt in     out     source               destination         

iptables -nvL --line-numbers (when the firewall is on)

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 ACCEPT     udp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            udp dpt:53
2        0     0 ACCEPT     tcp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:53
3        0     0 ACCEPT     udp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            udp dpt:67
4        0     0 ACCEPT     tcp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:67
5        1    76 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
6        0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
7       11  1096 INPUT_direct  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
8       11  1096 INPUT_ZONES_SOURCE  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
9       11  1096 INPUT_ZONES  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
10       0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate INVALID
11      11  1096 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 ACCEPT     all  --  *      virbr0  0.0.0.0/0            192.168.122.0/24     ctstate RELATED,ESTABLISHED
2        0     0 ACCEPT     all  --  virbr0 *       192.168.122.0/24     0.0.0.0/0           
3        0     0 ACCEPT     all  --  virbr0 virbr0  0.0.0.0/0            0.0.0.0/0           
4        0     0 REJECT     all  --  *      virbr0  0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
5        0     0 REJECT     all  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
6        0     0 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
7        0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
8        0     0 FORWARD_direct  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
9        0     0 FORWARD_IN_ZONES_SOURCE  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
10       0     0 FORWARD_IN_ZONES  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
11       0     0 FORWARD_OUT_ZONES_SOURCE  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
12       0     0 FORWARD_OUT_ZONES  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
13       0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate INVALID
14       0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT 12 packets, 1204 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 ACCEPT     udp  --  *      virbr0  0.0.0.0/0            0.0.0.0/0            udp dpt:68
2       12  1204 OUTPUT_direct  all  --  *      *       0.0.0.0/0            0.0.0.0/0           

Chain FORWARD_IN_ZONES (1 references)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 FWDI_public  all  --  enp0s8 *       0.0.0.0/0            0.0.0.0/0           [goto] 
2        0     0 FWDI_public  all  --  enp0s3 *       0.0.0.0/0            0.0.0.0/0           [goto] 
3        0     0 FWDI_public  all  --  +      *       0.0.0.0/0            0.0.0.0/0           [goto] 

Chain FORWARD_IN_ZONES_SOURCE (1 references)
num   pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD_OUT_ZONES (1 references)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 FWDO_public  all  --  *      enp0s8  0.0.0.0/0            0.0.0.0/0           [goto] 
2        0     0 FWDO_public  all  --  *      enp0s3  0.0.0.0/0            0.0.0.0/0           [goto] 
3        0     0 FWDO_public  all  --  *      +       0.0.0.0/0            0.0.0.0/0           [goto] 

Chain FORWARD_OUT_ZONES_SOURCE (1 references)
num   pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD_direct (1 references)
num   pkts bytes target     prot opt in     out     source               destination         

Chain FWDI_public (3 references)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 FWDI_public_log  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
2        0     0 FWDI_public_deny  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
3        0     0 FWDI_public_allow  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
4        0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           

Chain FWDI_public_allow (1 references)
num   pkts bytes target     prot opt in     out     source               destination         

Chain FWDI_public_deny (1 references)
num   pkts bytes target     prot opt in     out     source               destination         

Chain FWDI_public_log (1 references)
num   pkts bytes target     prot opt in     out     source               destination         

Chain FWDO_public (3 references)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 FWDO_public_log  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
2        0     0 FWDO_public_deny  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
3        0     0 FWDO_public_allow  all  --  *      *       0.0.0.0/0            0.0.0.0/0           

Chain FWDO_public_allow (1 references)
num   pkts bytes target     prot opt in     out     source               destination         

Chain FWDO_public_deny (1 references)
num   pkts bytes target     prot opt in     out     source               destination         

Chain FWDO_public_log (1 references)
num   pkts bytes target     prot opt in     out     source               destination         

Chain INPUT_ZONES (1 references)
num   pkts bytes target     prot opt in     out     source               destination         
1       11  1096 IN_public  all  --  enp0s8 *       0.0.0.0/0            0.0.0.0/0           [goto] 
2        0     0 IN_public  all  --  enp0s3 *       0.0.0.0/0            0.0.0.0/0           [goto] 
3        0     0 IN_public  all  --  +      *       0.0.0.0/0            0.0.0.0/0           [goto] 

Chain INPUT_ZONES_SOURCE (1 references)
num   pkts bytes target     prot opt in     out     source               destination         

Chain INPUT_direct (1 references)
num   pkts bytes target     prot opt in     out     source               destination         

Chain IN_public (3 references)
num   pkts bytes target     prot opt in     out     source               destination         
1       11  1096 IN_public_log  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
2       11  1096 IN_public_deny  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
3       11  1096 IN_public_allow  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
4        0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           

Chain IN_public_allow (1 references)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22 ctstate NEW

Chain IN_public_deny (1 references)
num   pkts bytes target     prot opt in     out     source               destination         

Chain IN_public_log (1 references)
num   pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT_direct (1 references)
num   pkts bytes target     prot opt in     out     source               destination         

ip addr

enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
    inet 10.0.2.15  netmask 255.255.255.0  broadcast 10.0.2.255

enp0s8: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
    inet 192.168.56.101  netmask 255.255.255.0  broadcast 192.168.56.255

接口 enp0s3 将使用 NAT,而 enp0s8 则连接到仅主机网络。lo 和 virbr0 均不相关,因此未在此列出。

答案1

使用firewall-cmd打开端口 8080/tcp,一次在活动规则中(仅触发重建iptables具有更改的规则),一次在已保存的配置中(仅保存配置中的更改/etc/firewalld/)。

# firewall-cmd --add-port=8080/tcp
success
# firewall-cmd --permanent --add-port=8080/tcp
success

更新:允许整个界面,正如评论中所要求的那样。

firewalld有区域的概念。默认情况下,操作是在public区域上完成的。但有许多预定义区域,例如dmz,,work... 和trusted隐式信任所有内容的区域。允许接口的最简单方法是将此接口添加到区域trusted。像往常一样,两个命令是,一个用于配置(带有--permanent),一个用于活动集(没有--permanent.--reload也可以工作)。

# firewall-cmd --zone=trusted --add-interface=enp0s8
# firewall-cmd --permanent --zone=trusted --add-interface=enp0s8

iptables 规则将相应地改变规则,其中包括那些关键规则,在输出中可见iptables-save(我这里只写了一些,还有更多):

-A FORWARD_IN_ZONES -i enp0s8 -j FWDI_trusted
-A FWDI_trusted -j ACCEPT
-A INPUT_ZONES -i enp0s8 -j IN_trusted
-A IN_trusted -j ACCEPT

现在例如到此接口上的随机端口(在地址上)的远程传入 tcp 连接可能会从“无到主机的路由”或其他“目标不可达”错误切换到“连接被拒绝”错误,除非确实有一个进程正在监听它。

存在一些问题,可能与发行版有关,因此它无法始终正常工作,包括重启后,即使它在启动时看起来没问题。例如:

Firewalld 将接口添加到区域问题

确实,一旦超出了打开几个端口的任务,使用firewalld而不是直接制定自己的规则iptables就会变得复杂,并且需要投资于其语法知识,而这些知识本来可以花在下层的知识上(今天iptables,明天nft......),并且需要反正今天用 来验证结果iptables-save(明天可能会变成nft list ruleset -a)。

相关内容