iptables를 쿼리하여 RX 및 TX 바이트를 얻는 방법은 무엇입니까?

iptables를 쿼리하여 RX 및 TX 바이트를 얻는 방법은 무엇입니까?

내 목적은 WAN에서 들어오고 나가는 트래픽을 모니터링하는 것입니다. 이를 달성하기 위해 iptables 카운터를 데이터 소스로 사용하여 초당 보내고 받는 바이트 수를 계산하고 싶습니다. 안타깝게도 입력과 출력을 알고 있지만 전달 체인을 처리하는 방법을 이해할 수 없습니다. 나는 이더넷 패킷과 바이트가 필요하지 않기 때문에 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)
  • 서브넷(네트워크 내부 대역폭(데이터 센터 내)을 외부 트래픽과 구별하는 데 사용)

    ...

관련 정보