Encaminhamento de porta com firewall-cmd

1

Tenho várias VMs em execução no topo de um servidor (Virtual Machine Manager, VMM). Gostaria de encaminhar a porta 80 no servidor para a porta 80 de uma das minhas VMs. O host executa o CentOS7, então o firewalld está no comando. Aparentemente, o firewalld também é usado pelo VMM para manipular as conexões virtuais, portanto, não posso simplesmente jogá-lo fora da janela.

Eu basicamente reproduzi todos os comandos em este thread sem sucesso, o que ferve até:

firewall-cmd --permanent --zone=public --add-forward-port=port=80:proto=tcp:toport=80:toaddr=192.168.122.224

ou

firewall-cmd --permanent --zone=public --add-rich-rule 'rule family=ipv4 forward-port port=80 protocol=tcp to-port=80 to-addr=192.168.122.224'

O status atual do firewalld é o seguinte:

[root@my-machine ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp8s0
  sources: 
  services: ssh dhcpv6-client samba smtp http
  ports: 25/tcp
  protocols: 
  masquerade: yes
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
  rule family="ipv4" forward-port port="80" protocol="tcp" to-port="80" to-addr="192.168.xxx.xxx"

Esta é a saída de

iptables -L -n -v

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination         
13917 8976K ACCEPT     all  --  *      virbr0  0.0.0.0/0               192.168.122.0/24     ctstate RELATED,ESTABLISHED
13539 2093K ACCEPT     all  --  virbr0 *       192.168.122.0/24     0.0.0.0/0           
0     0 ACCEPT     all  --  virbr0 virbr0  0.0.0.0/0            0.0.0.0/0           
4   240 REJECT     all  --  *      virbr0  0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable <-----
1   133 REJECT     all  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
0     0 ACCEPT     all  --  virbr1 virbr1  0.0.0.0/0            0.0.0.0/0           
0     0 REJECT     all  --  *      virbr1  0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
0     0 REJECT     all  --  virbr1 *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
0     0 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
0     0 FORWARD_direct  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
0     0 FORWARD_IN_ZONES_SOURCE  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
0     0 FORWARD_IN_ZONES  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
0     0 FORWARD_OUT_ZONES_SOURCE  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
0     0 FORWARD_OUT_ZONES  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            ctstate INVALID
0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

o problema é a segunda regra, que parece rejeitar meus pacotes (eu posso ver o número aumentando ao tentar se conectar). De fato, se eu removê-lo com:

iptables -D FORWARD -o virbr0 -j REJECT --reject-with icmp-port-unreachable

meu encaminhamento de porta funciona. o que estou perdendo?

    
por Matteo Giani 01.10.2018 / 15:07

1 resposta

2

Misturar o firewalld com a libvirt pode levar você a esse tipo de situação.

Por padrão, com uma rede "NAT", a rede da libvirt configurará regras de mascaramento para que as VMs possam acessar a Internet IPv4 herdada. Mas o libvirt bloqueia todas as conexões de entrada para redes "NAT".

A solução é mudar a rede para uma rede roteada normal e, em seguida, deixar o firewall lidar com qualquer mascaramento que você possa exigir.

Por exemplo, você editaria o XML da rede e mudaria

  <forward mode='nat'/>

para

  <forward mode='route'/>

Eu recomendo que você mude todas redes NAT libvirt para rotear, neste cenário, não apenas aquele para o qual você deseja encaminhar as portas, se você quiser permitir que as redes se comuniquem umas com as outras. / p>

Depois, você define o mascaramento na zona do firewalld correspondente à interface conectada ao restante da Internet. Por exemplo:

firewall-cmd [--permanent] --zone=public --add-masquerade

(Com o firewalld 0.4.4.6 ou posterior, você não deve usar isso, mas criar uma regra rica para o mascaramento do IPv4. Essas versões têm um erro de processamento que faz com que uma regra de mascaramento IPv6 também seja adicionada ao usar --add-masquerade , vai quebrar a conectividade IPv6.)

firewall-cmd [--permanent] --zone=public --add-rich-rule='rule family=ipv4 masquerade'
    
por 01.10.2018 / 16:11