iptablesを問い合わせてRXとTXバイトを取得するには?

iptablesを問い合わせてRXとTXバイトを取得するには?

私の目的は、WANからの入出力トラフィックを監視することです。これを達成するために、iptablesカウンタをデータソースとして使用して、1秒あたりの送受信バイト数を計算したいと思います。残念ながら、入力と出力を知っていますが、転送チェーンの処理方法を理解できません。私はイーサネットパケットとバイトを必要としないので、IPV4パケットとバイトだけを表示するので、iptablesに焦点を当てました。私の設定方法はモデム - > OpenWrtです。ルーター

これは私の/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'

可能であれば、OpenWrtベースのアクセスポイント(ルーターだけでなく)でも機能する答えを提供してください。ありがとうございます!

答え1

私はopenwrtルータに完全なiptablesコマンドがあると思います。その場合、問題はiptablesトラフィックカウンタを解析するのと同じくらい簡単になります。

たとえば、次のようにiptablesルールなしで通常のサーバーでGoogleDNSサーバー8.8.8.8へのトラフィックを測定したいとします。

  ❯❯❯ 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

ご覧のとおり、グローバルチェーンあたりのパケットカウンタがあります(たとえば、出力には2132バイトの21パケットが表示されます)

次に、関心のあるトラフィックのルールを挿入します。この例では、8.8.8.8に移動するすべてのトラフィックを監視するようにiptablesに要求します。

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

パケット計算カウンタが報告する内容を見てみましょう。 (8.8.8.8の新しい規則がリストされています。)

  ❯❯❯ 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

5つの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

iptables カウンターを見ると、パケット数とバイト数が記録されるのがわかります。発信パケット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

バイト数は(64バイト/ICMP要求+ 20バイト/IP要求)* 5個要求です。 :)

このサーバーからの着信トラフィックを監視するには、そのサーバーのINPUTルールを追加するだけです(ヒント:出力=>入力に変更するだけです)。

これで基本がわかったので、トラフィックを次のように分散できます。

  • プロトコル(udp、tcp、icmp)
  • サブネット(ネットワーク内部帯域幅(データセンター内)を外部トラフィックと区別するために使用)

    ...

関連情報