Introdução
Firewalld é uma solução de gerenciamento de firewall disponíveis para várias distribuições Linux, que atua como um frontend para o sistema de filtragem de pacotes iptables fornecidas pelo kernel do Linux. Neste guia, vamos cobrir como configurar um firewall para o seu servidor e mostrar-lhe os princípios básicos de gestão do firewall com a ferramenta administrativa firewall-cmd
(se preferir usar iptables
com CentOS, siga este guia).
Nota: Há uma chance de que você possa estar trabalhando com uma versão mais recente do firewalld do que estava disponível no momento desta escrita, ou que o seu servidor foi configurado ligeiramente diferente do servidor de exemplo usado ao longo deste guia. Assim, o comportamento de alguns dos comandos explicados neste guia pode variar dependendo de sua configuração específica.
Conceitos Básicos de Firewalld
Antes de começar a falar sobre como, na verdade, usam o firewall-cmd
utilitário para gerenciar a configuração de firewall, devemos nos familiarizar com alguns conceitos básicos que a ferramenta apresenta.
zonas
o firewalld
daemon gere grupos de regras usando entidades chamadas “zonas”. As zonas são basicamente conjuntos de regras que ditam o que o tráfego deve ser permitido, dependendo do nível de confiança que você tem nas redes a que o seu computador está conectado. Interfaces de rede são atribuídas uma zona para ditar o comportamento que o firewall deve permitir.
para computadores que possam mover-se entre redes frequentemente (como laptops), este tipo de flexibilidade fornece um bom método de mudar as suas regras dependendo do seu ambiente. Você pode ter regras estritas em vigor proibindo a maioria do tráfego ao operar em uma rede pública de Wi-Fi, ao mesmo tempo que permite restrições mais relaxadas quando conectado à sua rede doméstica. Para um servidor, essas zonas não são tão imediatamente importantes porque o ambiente de rede raramente, se alguma vez, muda.
independentemente de quão dinâmico o seu ambiente de rede possa ser, ainda é útil estar familiarizado com a ideia geral por trás de cada uma das zonas predefinidas para firewalld
. De modo a que desde as zonas menos confiáveis até às mais confiáveis, as zonas predefinidas dentro de firewalld
são:
- largar: O mais baixo nível de confiança. Todas as conexões de entrada são descartadas sem resposta e apenas as conexões de saída são possíveis.
- bloco: semelhante ao acima, mas em vez de simplesmente abandonar conexões, pedidos recebidos são rejeitados com uma mensagem
icmp-host-prohibited
ouicmp6-adm-prohibited
. - público: representa redes públicas não confiáveis. Você não confia em outros computadores, mas pode permitir conexões de entrada selecionadas caso a caso.
- external: External networks in the event that you are using the firewall as your gateway. Está configurado para o NAT mascarado para que a sua rede interna permaneça privada, mas acessível.
- interno: o outro lado da zona externa, utilizado para a parte interna de um portal. Os computadores são bastante confiáveis e alguns serviços adicionais estão disponíveis.
- dmz: usado para computadores localizados numa DMZ (computadores isolados que não terão acesso ao resto da sua rede). Apenas certas ligações recebidas são permitidas.
- trabalho: utilizado em máquinas de trabalho. Confie na maioria dos computadores da rede. Mais alguns serviços podem ser permitidos.
- home: um ambiente doméstico. Isso geralmente implica que você confia na maioria dos outros computadores e que mais alguns serviços serão aceitos.
- confiável: confiar em todas as máquinas na rede. O mais aberto das opções disponíveis e deve ser usado com moderação.
para usar o firewall, podemos criar regras e alterar as propriedades das nossas zonas e, em seguida, atribuir as nossas interfaces de rede para as zonas mais apropriadas.
permanência da regra
no firewalld, as regras podem ser designadas como permanentes ou imediatas. Se uma regra é adicionada ou modificada, por padrão, o comportamento do firewall corre atualmente é modificado. Na próxima bota, as regras antigas serão revertidas.
a maioria das operações firewall-cmd
pode tomar a bandeira --permanent
para indicar que a firewall não-efémera deve ser alvo. Isto irá afectar o conjunto de regras que é recarregado no arranque. Esta separação significa que você pode testar as regras em sua instância de firewall ativa e, em seguida, recarregar se houver problemas. Você também pode usar a bandeira --permanent
para construir um conjunto inteiro de regras ao longo do tempo que serão aplicadas de uma só vez quando o comando reload for emitido.
instale e active a sua Firewall para iniciar no arranque
firewalld
está instalada por omissão em algumas distribuições Linux, incluindo muitas imagens de CentOS 7. No entanto, pode ser necessário instalar o firewalld você mesmo:
- sudo yum install firewalld
depois de instalar firewalld
, poderá activar o serviço e reiniciar o seu servidor. Tenha em mente que ativar firewalld fará com que o serviço comece no arranque. É a melhor prática criar suas regras de firewall e aproveitar a oportunidade para testá-las antes de configurar este comportamento, a fim de evitar problemas potenciais.
- sudo systemctl enable firewalld
- sudo reboot
quando o servidor reiniciar, a sua ‘firewall’ deverá ser criada, as suas interfaces de rede deverão ser colocadas nas zonas que configurou (ou voltar para a zona predefinida configurada), e quaisquer regras associadas à(s) zona (s) serão aplicadas às interfaces associadas.
podemos verificar que o serviço está funcionando e acessível por digitação:
- sudo firewall-cmd --state
outputrunning
isto indica que o nosso firewall está a funcionar com a configuração predefinida.Antes de começarmos a fazer modificações, devemos nos familiarizar com o ambiente padrão e regras fornecidas pelo daemon.
explorando os valores por omissão
podemos ver qual a zona actualmente seleccionada por omissão, escrevendo:
- firewall-cmd --get-default-zone
outputpublic
uma vez que não demos firewalld
quaisquer comandos para se desviar da zona padrão, e nenhuma das nossas interfaces está configurada para se ligar a outra zona, essa zona também será a única zona “activa” (a zona que está a controlar o tráfego para as nossas interfaces). Podemos verificar isso digitando:
- firewall-cmd --get-active-zones
outputpublic interfaces: eth0 eth1
Aqui, podemos ver que nosso servidor exemplo tem duas interfaces de rede sendo controladas pelo firewall (eth0
e eth1
). Ambos estão actualmente a ser geridos de acordo com as regras definidas para a zona pública.Como sabemos que regras estão associadas à zona pública? Podemos imprimir a configuração da zona predefinida escrevendo:
- sudo firewall-cmd --list-all
outputpublic (default, active) target: default icmp-block-inversion: no interfaces: eth0 eth1 sources: services: ssh dhcpv6-client ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
podemos dizer a partir da saída que esta zona é tanto o padrão e ativo e que as interfaces eth0
e eth1
estão associadas com esta zona (já sabíamos tudo isso a partir de nossas investigações anteriores). No entanto, também podemos ver que esta zona permite as operações normais associadas a um cliente DHCP (para atribuição de endereço IP) e SSH (para administração remota).
Exploring Alternative Zones
Now we have a good idea about the configuration for the default and active zone. Podemos encontrar informações sobre outras zonas também.
Para obter uma lista das disponíveis, horários, tipo de:
- firewall-cmd --get-zones
outputblock dmz drop external home internal public trusted work
podemos ver a configuração específica associada a uma zona, incluindo o --zone=
parâmetro no nosso --list-all
comando:
- sudo firewall-cmd --zone=home --list-all
outputhome interfaces: sources: services: dhcpv6-client ipp-client mdns samba-client ssh ports: masquerade: no forward-ports: icmp-blocks: rich rules:
Você pode exportar todas as definições de zona usando o --list-all-zones
opção. Provavelmente irá querer canalizar o resultado para um pager para uma visualização mais fácil:
- sudo firewall-cmd --list-all-zones | less
seleccionando Zonas para as suas Interfaces
a menos que tenha configurado as suas interfaces de rede de outra forma, cada interface será colocada na zona predefinida quando a firewall for activada.
mudar a zona de uma Interface
pode fazer a transição de uma interface entre zonas durante uma sessão utilizando o parâmetro --zone=
em combinação com o parâmetro --change-interface=
. Tal como acontece com todos os comandos que modificam a firewall, terá de usar sudo
.Por exemplo, podemos transitar a nossa interface eth0
para a zona “home” escrevendo isto:
- sudo firewall-cmd --zone=home --change-interface=eth0
outputsuccess
sempre que você estiver transicionando uma interface para uma nova zona, esteja ciente de que você está provavelmente modificando os serviços que estarão operacionais. Por exemplo, aqui estamos nos movendo para a zona “home”, que tem SSH disponível. Isto significa que a nossa ligação não deve cair. Algumas outras zonas não têm o SSH activo por omissão e se a sua ligação for largada ao usar uma destas zonas, poderá ver-se incapaz de voltar a entrar.
podemos verificar que isso foi bem sucedido, pedindo as zonas ativas novamente:
- firewall-cmd --get-active-zones
outputhome interfaces: eth0public interfaces: eth1
ajustando a zona predefinida
se todas as suas interfaces puderem ser melhor tratadas por uma única zona, é provavelmente mais fácil apenas seleccionar a melhor zona predefinida e, em seguida, usá-la para a sua configuração.
pode alterar a zona predefinida com o parâmetro --set-default-zone=
. Isto irá alterar imediatamente qualquer interface que tenha caído de volta no padrão para a nova zona:
- sudo firewall-cmd --set-default-zone=home
outputsuccess
definir as regras para as suas aplicações
a forma básica de definir as excepções de firewall para os serviços que deseja disponibilizar é fácil. Vamos analisar a ideia básica.
adicionando um serviço às suas zonas
o método mais fácil é adicionar os Serviços ou portos de que necessita às zonas que está a utilizar. Novamente, você pode obter uma lista dos serviços disponíveis com o --get-services
opção:
- firewall-cmd --get-services
outputRH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client dns docker-registry dropbox-lansync elasticsearch freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master high-availability http https imap imaps ipp ipp-client ipsec iscsi-target kadmin kerberos kibana klogin kpasswd kshell ldap ldaps libvirt libvirt-tls managesieve mdns mosh mountd ms-wbt mssql mysql nfs nrpe ntp openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster quassel radius rpc-bind rsh rsyncd samba samba-client sane sip sips smtp smtp-submission smtps snmp snmptrap spideroak-lansync squid ssh synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client vdsm vnc-server wbem-https xmpp-bosh xmpp-client xmpp-local xmpp-server
Você pode obter mais detalhes sobre cada um destes serviços, observando seus associados .xml
arquivo dentro de /usr/lib/firewalld/services
diretório. Por exemplo, o serviço SSH é definido assim:
<?xml version="1.0" encoding="utf-8"?><service> <short>SSH</short> <description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description> <port protocol="tcp" port="22"/></service>
você pode ativar um serviço para uma zona usando o parâmetro --add-service=
. A operação visará a zona predefinida ou qualquer que seja a zona especificada pelo parâmetro --zone=
. Por omissão, isto só irá ajustar a sessão de ‘firewall’ actual. Você pode ajustar a configuração permanente da firewall, incluindo a bandeira --permanent
.
por exemplo, se estamos executando um servidor web servindo tráfego HTTP convencional, podemos permitir este tráfego para interfaces em nossa zona “pública” para esta sessão, digitando:
- sudo firewall-cmd --zone=public --add-service=http
pode deixar de fora o --zone=
se desejar modificar a zona predefinida. Podemos verificar que a operação foi bem sucedida usando as operações --list-all
ou --list-services
:
- sudo firewall-cmd --zone=public --list-services
outputdhcpv6-client http ssh
uma vez que você tenha testado que tudo está funcionando como deveria, você provavelmente vai querer modificar as regras permanentes firewall de modo que o seu serviço ainda estará disponível após um reboot. Podemos tornar a nossa mudança de zona” pública ” permanente digitando:
- sudo firewall-cmd --zone=public --permanent --add-service=http
outputsuccess
você pode verificar que isso foi bem sucedido, adicionando a bandeira --permanent
para a operação --list-services
. Você precisa usar sudo
para qualquer operação --permanent
:
- sudo firewall-cmd --zone=public --permanent --list-services
outputdhcpv6-client http ssh
a sua zona “pública” irá agora permitir o tráfego web HTTP na porta 80. Se o seu servidor web estiver configurado para usar SSL/TLS, você também irá querer adicionar o serviço https
. Podemos adicionar isso à sessão atual e ao conjunto de regras permanentes, digitando:
- sudo firewall-cmd --zone=public --add-service=https
- sudo firewall-cmd --zone=public --permanent --add-service=https
e se não estiver disponível Nenhum serviço adequado?
os Serviços de firewall que estão incluídos com a instalação firewalld representam muitos dos requisitos mais comuns para aplicações às quais você pode desejar permitir o acesso. No entanto, haverá provavelmente cenários em que estes serviços não se encaixam nas suas necessidades.
nesta situação, você tem duas opções.
abrir um porto para as suas zonas
a maneira mais fácil de adicionar suporte para a sua aplicação específica é abrir os portos que ela usa na(s) zona (s) apropriada (s). Isto é tão fácil como especificar o alcance do porto ou porto, e o protocolo associado para os portos que você precisa abrir.
por exemplo, se a nossa aplicação correr na porta 5000 e usar TCP, podemos adicionar isto à zona “pública” para esta sessão usando o parâmetro --add-port=
. Protocolos podem ser tcp
ou udp
:
- sudo firewall-cmd --zone=public --add-port=5000/tcp
outputsuccess
podemos verificar que este foi bem-sucedida usando o --list-ports
operação:
- sudo firewall-cmd --zone=public --list-ports
output5000/tcp
também é possível especificar um intervalo de portas sequencial, separando-o início e o término da porta da gama, com um traço. Por exemplo, se o nosso aplicativo usa portas UDP 4990 a 4999, nós poderíamos abri-los em “público”, digitando:
- sudo firewall-cmd --zone=public --add-port=4990-4999/udp
depois dos testes, é provável que queiramos adicioná-los à firewall permanente. Você pode fazer isso escrevendo:
- sudo firewall-cmd --zone=public --permanent --add-port=5000/tcp
- sudo firewall-cmd --zone=public --permanent --add-port=4990-4999/udp
- sudo firewall-cmd --zone=public --permanent --list-ports
outputsuccesssuccess5000/tcp 4990-4999/udp
definir um serviço
abrir portas para as suas zonas é fácil, mas pode ser difícil acompanhar o que cada um Serve. Se você alguma vez desativar um serviço em seu servidor, você pode ter dificuldade em lembrar quais as portas que foram abertas ainda são necessárias. Para evitar esta situação, é possível definir um serviço.
os Serviços são simplesmente colecções de portos com um nome e uma descrição associados. O uso de serviços é mais fácil de administrar do que os portos, mas requer um pouco de trabalho inicial. A maneira mais fácil de começar é copiar um script existente (encontrado em /usr/lib/firewalld/services
) para o diretório /etc/firewalld/services
onde o firewall procura definições não-padrão.
por exemplo, poderíamos copiar a definição de serviço SSH para usar para a nossa definição de serviço “exemplo” como esta. O nome do arquivo, menos o .xml
sufixo vai ditar o nome do serviço dentro do firewall lista de serviços:
- sudo cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/example.xml
Agora, você pode ajustar a definição encontrada no arquivo que você copiou:
sudo vi /etc/firewalld/services/example.xml
Para começar, o arquivo irá conter o SSH definição que você copiou:
<?xml version="1.0" encoding="utf-8"?><service> <short>SSH</short> <description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description> <port protocol="tcp" port="22"/></service>
a maioria desta definição é de facto metadados. Você vai querer mudar o nome curto para o serviço dentro das tags <short>
. Este é um nome legível para o seu serviço. Você também deve adicionar uma descrição para que você tenha mais informações se você precisar auditar o serviço. A única configuração que você precisa fazer que realmente afeta a funcionalidade do serviço provavelmente será a definição do porto onde você identifica o número de porto e o protocolo que você deseja abrir. Isto pode ser especificado várias vezes.
para o nosso serviço de “exemplo”, imagine que precisamos abrir o porto 7777 para TCP e 8888 para UDP. Ao entrar no modo de inserção pressionando i
, podemos modificar a definição existente com algo como isto:
<?xml version="1.0" encoding="utf-8"?><service> <short>Example Service</short> <description>This is just an example service. It probably shouldn't be used on a real system.</description> <port protocol="tcp" port="7777"/> <port protocol="udp" port="8888"/></service>
Pressione ESC
, em seguida, digite :x
para salvar e fechar o arquivo.
Recarregar seu firewall para obter acesso ao seu novo serviço:
- sudo firewall-cmd --reload
Você pode ver que ele agora está entre a lista de serviços disponíveis:
- firewall-cmd --get-services
outputRH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client dns docker-registry dropbox-lansync elasticsearch example freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master high-availability http https imap imaps ipp ipp-client ipsec iscsi-target kadmin kerberos kibana klogin kpasswd kshell ldap ldaps libvirt libvirt-tls managesieve mdns mosh mountd ms-wbt mssql mysql nfs nrpe ntp openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster quassel radius rpc-bind rsh rsyncd samba samba-client sane sip sips smtp smtp-submission smtps snmp snmptrap spideroak-lansync squid ssh synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client vdsm vnc-server wbem-https xmpp-bosh xmpp-client xmpp-local xmpp-server
agora Você pode usar este serviço em suas zonas, como faria normalmente.
criar as suas próprias zonas
embora as zonas predefinidas sejam provavelmente mais do que suficientes para a maioria dos utilizadores, pode ser útil definir as suas próprias zonas que são mais descritivas da sua função.
por exemplo, você pode querer criar uma zona para o seu servidor web, chamado “publicweb”. No entanto, você pode querer ter outra zona configurada para o serviço DNS que você fornece em sua rede privada. Talvez queiras uma zona chamada “privateDNS” para isso.
ao adicionar uma zona, deve adicioná-la à configuração permanente da firewall. Você pode então recarregar para trazer a configuração para a sua sessão em execução. Por exemplo, poderíamos criar duas zonas que discutimos acima, escrevendo:
- sudo firewall-cmd --permanent --new-zone=publicweb
- sudo firewall-cmd --permanent --new-zone=privateDNS
Você pode verificar que estão presentes em seu permanente de configuração digitando:
- sudo firewall-cmd --permanent --get-zones
outputblock dmz drop external home internal privateDNS public publicweb trusted work
Como afirmado anteriormente, estes não estarão disponíveis na instância atual do firewall ainda:
- firewall-cmd --get-zones
outputblock dmz drop external home internal public trusted work
Recarregar o firewall para trazer essas novas zonas para a configuração activa:
- sudo firewall-cmd --reload
- firewall-cmd --get-zones
outputblock dmz drop external home internal privateDNS public publicweb trusted work
Agora, você pode começar a atribuir a serviços apropriados e as portas para as zonas. Geralmente é uma boa idéia ajustar a instância ativa e, em seguida, transferir essas mudanças para a configuração permanente após o teste. Por exemplo, para o “publicweb de zona”, você pode querer adicionar o SSH, HTTP e HTTPS serviços:
- sudo firewall-cmd --zone=publicweb --add-service=ssh
- sudo firewall-cmd --zone=publicweb --add-service=http
- sudo firewall-cmd --zone=publicweb --add-service=https
- sudo firewall-cmd --zone=publicweb --list-all
outputpublicweb target: default icmp-block-inversion: no interfaces: sources: services: ssh http https ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
da Mesma forma, podemos adicionar o serviço de DNS para o nosso “privateDNS” zona de:
- sudo firewall-cmd --zone=privateDNS --add-service=dns
- sudo firewall-cmd --zone=privateDNS --list-all
outputprivateDNS interfaces: sources: services: dns ports: masquerade: no forward-ports: icmp-blocks: rich rules:
poderíamos, então, mudar a nossa interfaces para estas novas zonas para testar:
- sudo firewall-cmd --zone=publicweb --change-interface=eth0
- sudo firewall-cmd --zone=privateDNS --change-interface=eth1
neste ponto, você tem a oportunidade de testar a sua configuração. Se esses valores funcionarem para você, você vai querer adicionar as mesmas regras para a configuração permanente. Você pode fazer isso através do re-aplicar as regras com a --permanent
bandeira:
- sudo firewall-cmd --zone=publicweb --permanent --add-service=ssh
- sudo firewall-cmd --zone=publicweb --permanent --add-service=http
- sudo firewall-cmd --zone=publicweb --permanent --add-service=https
- sudo firewall-cmd --zone=privateDNS --permanent --add-service=dns
Após permanentemente aplicar estas regras, você pode reiniciar a sua rede e recarregar o seu serviço de firewall:
- sudo systemctl restart network
- sudo systemctl reload firewalld
Validar que o correto zonas foram designadas:
- firewall-cmd --get-active-zones
outputprivateDNS interfaces: eth1publicweb interfaces: eth0
E validar que os serviços estão disponíveis tanto para as zonas:
- sudo firewall-cmd --zone=publicweb --list-services
outputhttp https ssh
- sudo firewall-cmd --zone=privateDNS --list-services
outputdns
Você configurou com êxito o seu próprio zonas! Se você quer fazer uma dessas zonas o padrão para outras interfaces, lembre-se de configurar esse comportamento com o --set-default-zone=
parâmetro:
sudo firewall-cmd --set-default-zone=publicweb
Conclusão
agora Você deve ter uma boa compreensão de como administrar o firewalld serviço no seu sistema CentOS para o dia-a-dia.
o serviço firewalld permite-lhe configurar regras e conjuntos de regras que têm em consideração o seu ambiente de rede. Ele permite a transição perfeita entre diferentes políticas de firewall através do uso de zonas e dá aos administradores a capacidade de abstrair a gestão de portos em Definições de serviço mais amigáveis. Adquirir um conhecimento funcional deste sistema lhe permitirá tirar partido da flexibilidade e poder que esta ferramenta proporciona.