Como obter bytes RX e TX consultando o iptables?

1

Minha intenção é monitorar o tráfego de / para wan. Para conseguir isso, eu quero calcular bytes de entrada e de saída / segundo, com contadores iptables como fonte de dados. Infelizmente, não consigo entender o que fazer com a cadeia FORWARD, embora esteja ciente de INPUT e OUTPUT. Estou me concentrando no iptables porque ele realmente mostra apenas pacotes e bytes IPV4, já que eu não preciso de Ethernet. Meu esquema de configuração é: modem - > OpenWrt router

E aqui está o meu arquivo / etc / config / firewall:

config defaults
        option syn_flood '1'
        option input 'ACCEPT'
        option output 'ACCEPT'
        option forward 'REJECT'

config zone
        option name 'lan'
        option input 'ACCEPT'
        option output 'ACCEPT'
        option forward 'ACCEPT'
        option network 'lan'

config zone
        option name 'wan'
        option input 'REJECT'
        option output 'ACCEPT'
        option forward 'REJECT'
        option masq '1'
        option mtu_fix '1'
        option network 'wan'

config rule
        option name 'Allow-DHCP-Renew'
        option src 'wan'
        option proto 'udp'
        option dest_port '68'
        option target 'ACCEPT'
        option family 'ipv4'

config rule
        option name 'Allow-Ping'
        option src 'wan'
        option proto 'icmp'
        option icmp_type 'echo-request'
        option family 'ipv4'
        option target 'ACCEPT'

config rule
        option name 'Allow-DHCPv6'
        option src 'wan'
        option proto 'udp'
        option src_ip 'fe80::/10'
        option src_port '547'
        option dest_ip 'fe80::/10'
        option dest_port '546'
        option family 'ipv6'
        option target 'ACCEPT'

config rule
        option name 'Allow-ICMPv6-Input'
        option src 'wan'
        option proto 'icmp'
        list icmp_type 'echo-request'
        list icmp_type 'echo-reply'
        list icmp_type 'destination-unreachable'
        list icmp_type 'packet-too-big'
        list icmp_type 'time-exceeded'
        list icmp_type 'bad-header'
        list icmp_type 'unknown-header-type'
        list icmp_type 'router-solicitation'
        list icmp_type 'neighbour-solicitation'
        list icmp_type 'router-advertisement'
        list icmp_type 'neighbour-advertisement'
        option limit '1000/sec'
        option family 'ipv6'
        option target 'ACCEPT'

config rule
        option name 'Allow-ICMPv6-Forward'
        option src 'wan'
        option dest '*'
        option proto 'icmp'
        list icmp_type 'echo-request'
        list icmp_type 'echo-reply'
        list icmp_type 'destination-unreachable'
        list icmp_type 'packet-too-big'
        list icmp_type 'time-exceeded'
        list icmp_type 'bad-header'
        list icmp_type 'unknown-header-type'
        option limit '1000/sec'
        option family 'ipv6'
        option target 'ACCEPT'

config include
        option path '/etc/firewall.user'

config include 'miniupnpd'
        option type 'script'
        option path '/usr/share/miniupnpd/firewall.include'
        option family 'any'
        option reload '1'

config forwarding
        option dest 'wan'
        option src 'lan'

Se possível , forneça-me uma resposta que funcione também com pontos de acesso baseados no OpenWrt, não apenas roteadores. Obrigada!

    
por LivingSilver94 21.06.2015 / 22:44

1 resposta

1

Eu acho que os roteadores openwrt têm um comando iptables completo. Se assim for, então a questão torna-se tão fácil quanto analisar os contadores de tráfego do iptables.

Como exemplo, vamos supor que estou interessado em medir o tráfego para o servidor do GoogleDNS 8.8.8.8 em um servidor baunilha que não tem regras de iptables, como visto abaixo

  ❯❯❯ sudo iptables -n -L -xv 
Chain INPUT (policy ACCEPT 27 packets, 1660 bytes)
    pkts      bytes target     prot opt in     out     source               destination

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

Chain OUTPUT (policy ACCEPT 21 packets, 2132 bytes)
    pkts      bytes target     prot opt in     out     source               destination

Como você pode ver, temos contadores globais de pacotes por cadeia (Exemplo: a saída viu 21 pacotes de 2132 bytes)

Na próxima etapa, injetamos uma regra para o tráfego em que estamos interessados. Neste exemplo, solicitaremos que o iptables atente a todo o tráfego para 8.8.8.8

❯❯❯ sudo iptables -I OUTPUT 1 -o eth0 -d 8.8.8.8

Vamos ver o que os contadores de contabilidade de pacotes relatam (note que a nova regra para 8.8.8.8 está agora listada)

  ❯❯❯ sudo iptables -n -L -xv
Chain INPUT (policy ACCEPT 12 packets, 752 bytes)
    pkts      bytes target     prot opt in     out     source               destination

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

Chain OUTPUT (policy ACCEPT 8 packets, 784 bytes)
    pkts      bytes target     prot opt in     out     source               destination
       0        0            all  --  *      eth0    0.0.0.0/0            8.8.8.8

Vamos gerar 5 pacotes de solicitações ICMP.

  ❯❯❯ ping -c 5 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_req=1 ttl=128 time=159 ms
64 bytes from 8.8.8.8: icmp_req=2 ttl=128 time=159 ms
64 bytes from 8.8.8.8: icmp_req=3 ttl=128 time=156 ms
64 bytes from 8.8.8.8: icmp_req=4 ttl=128 time=161 ms
64 bytes from 8.8.8.8: icmp_req=5 ttl=128 time=155 ms

--- 8.8.8.8 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4010ms
rtt min/avg/max/mdev = 155.294/158.503/161.081/2.092 ms

Observando os contadores do iptables, veremos que registramos a contagem de pacotes e bytes para os pacotes de saída para 8.8.8.8

  ❯❯❯ sudo iptables -n -L -xv 
Chain INPUT (policy ACCEPT 105 packets, 6900 bytes)
    pkts      bytes target     prot opt in     out     source               destination

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

Chain OUTPUT (policy ACCEPT 67 packets, 6956 bytes)
    pkts      bytes target     prot opt in     out     source               destination
       5      420            all  --  *      eth0    0.0.0.0/0            8.8.8.8

Observe que os bytes foram (solicitação de 64 bytes / ICMP + solicitação de 20 bytes / IP) * 5 solicitações:)

Se você quiser monitorar o tráfego de entrada do servidor, basta adicionar uma regra INPUT para ele (Dica: basta alterar a saída = > entrada).

Agora que você sabe o básico, pode enlouquecer e dividir seu tráfego em

  • Protocolo (udp vs tcp vs icmp)
  • Sub-redes (você pode usar isso para diferenciar a largura de banda intra-rede (dentro do datacenter) do tráfego externo)

    ...

por 21.06.2015 / 23:03