Назад | Перейти на главную страницу

Пункт назначения недоступен (хост запрещен административно)

Я использую сеть только для хоста в виртуальном боксе.

Хост (Windows): 192.168.56.1/24

Гость (CentOS): 192.168.56.101/24

Есть простой http-сервер, который слушает 0.0.0.0:8080, запущенный в гостевой системе. "завиток http://192.168.56.101:8080/"на гостевой машине все в порядке. Но на хосте он не работает (посещается браузером, поскольку curl не установлен в моей Windows).

Пинг 192.168.56.101 с хоста в порядке. Я пытаюсь получить некоторые подсказки, перехватывая пакеты на адаптере VirualBox-Host-Only-Network с помощью wirehark. И я вижу несколько пакетов 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 не относятся к делу и здесь не перечислены.

С помощью firewall-cmd, открыть порт 8080/tcp, один раз в активных правилах (запускает только перестроение iptables правил с изменением) и один раз в сохраненной конфигурации (только сохранение изменения в конфигурации в /etc/firewalld/).

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

ОБНОВЛЕНИЕ: разрешить весь интерфейс, как указано в комментарии.

firewalld есть понятие зон. По умолчанию действия выполняются на public zone., но есть много предопределенных зон, например 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).