diff --git a/CHANGELOG.md b/CHANGELOG.md index 786b96b..d584a12 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,21 @@ The release notes on GitHub are taken from this file: the section whose heading is the version number. +## 1.2.4 + +Interfaces +- The interfaces a device samples are told from the ones only seen as the + other end of its flows: by the sFlow data source, by flowDirection + (IPFIX 61) in NetFlow v9 and IPFIX, or else, without that field, as the + interface on at least 90% of the device's traffic. +- Interface check lists those other interfaces last, in smaller grey type, + under "Peer interfaces": their numbers hold only the traffic through the + sampled interface. Their charts say so. +- **Interface** above the pages lists only sampled interfaces, grouped by + device. +- Settings shows for each device the interfaces it samples, and whether its + NetFlow/IPFIX templates carry flowDirection. + ## 1.2.3 Interfaces diff --git a/README.md b/README.md index 61c4e2d..2511f7d 100644 --- a/README.md +++ b/README.md @@ -528,6 +528,21 @@ makes it the default interface (**★**); there is one default. The pages then open on it (see the **Interface** choice under [Using the web UI](#9-using-the-web-ui)), and the overview shows its bandwidth. Both are saved at once to the `iface` line in Names. +Flow records name two interfaces: the one a packet came in on and the one +it left by. A device that samples only some interfaces therefore shows +the other ends of their flows too. Those **peer interfaces** are listed +last, in smaller grey type, under their own heading: their numbers hold +only the traffic that went through a sampled interface, not all of their +traffic. They are not offered under **Interface** above the pages. +traffic66 knows which interface sampled a flow from the sFlow data source, +or from the flowDirection field (IPFIX 61) of NetFlow v9 and IPFIX (ingress: +the input interface, egress: the output interface). Without that field, an +interface on at least 90% of a device's traffic is taken as the sampled +one; when there is none, no interface is marked. **Settings** shows, for +each device, the sampled interfaces and whether its templates carry +flowDirection. To see all of a device's traffic, sample every interface +inbound (see [Send flows from your devices](#4-send-flows-from-your-devices)). + ![Interface check: traffic of every interface, and the flow estimate next to the device counter](docs/images/interfaces.png) To get counters to compare with: @@ -688,7 +703,7 @@ Pages: | Findings | What needs attention: scans, password guessing, lateral movement, unusual uploads, floods and threat list traffic ([more](#findings)) | | Threat intel | Hosts that talked to addresses on your threat lists, and how much they sent | | Geo & networks | A world map of traffic by country, with lines from your networks; the networks (AS) traffic came from and went to, over time in bits/s and packets/s; traffic by country and by network | -| Settings | Devices, sampling, loss, collectors, SNMP, the countries and networks database, the logo, and **Names** | +| Settings | Devices, sampling, the interfaces each device samples and whether it sends flowDirection, loss, collectors, SNMP, the countries and networks database, the logo, and **Names** | | Interface check | Traffic of every interface over time in bits/s and, below, packets/s, ingress (green) and egress (blue), with the device counters as dashed lines; how far the flow numbers are from the counters, worst first, with reasons; a name, a tag and the default for each interface | | Flow records | How many flow records there were and when (a bar per interval), and the records themselves, newest first, page by page, with selectable columns. Opens on the last 15 minutes, updated every 5 seconds; opened from a value on another page (**Show its flow records**) it keeps that page's time range, and **Back to live** returns | | Data cleanup | Deletes data older than 120, 90, 60, 30 or 7 days, or all of it, with how much each frees ([more](#13-data-backup-upgrade-uninstall)) | @@ -703,8 +718,9 @@ server's date and time. Above the traffic pages (Overview, Top 66, Traffic details, Flow paths, Geo & networks, Flow records and the detail of a value) is **Interface**: **All interfaces**, or one interface, so that these pages show only the -traffic through it (in or out). It starts on the default interface (★, -set on **Interface check**) and the choice is part of the link. Findings, +traffic through it (in or out). It lists the sampled interfaces, grouped +by device, and starts on the default interface (★, set on **Interface +check**) and the choice is part of the link. Findings, Threat intel, Interface check and Settings always cover all traffic. For one interface over 7 or 30 days the pages read the flow records rather than the hourly and daily summaries, so they take longer and reach back diff --git a/docs/README.ar.md b/docs/README.ar.md index 869d102..cc94ad3 100644 --- a/docs/README.ar.md +++ b/docs/README.ar.md @@ -549,6 +549,19 @@ packets/s، فيهما الدخول (بالأخضر) والخروج (بالأز [استخدام واجهة الويب](#9-using-the-web-ui))، وتعرض النظرة العامة عرض نطاقها الترددي. ويُحفظ كلاهما فورًا في سطر `iface` في **الأسماء**. +تذكر سجلات التدفق واجهتين: التي دخلت منها الحزمة والتي خرجت منها. لذلك يعرض +الجهاز الذي يأخذ العينات من بعض واجهاته فقط الأطرافَ الأخرى لتدفقاتها أيضًا. +تُدرَج **واجهات الطرف الآخر** هذه في الآخر، بخط أصغر رمادي، تحت عنوان خاص بها: +فأرقامها لا تحوي إلا الحركة التي مرّت عبر واجهة مأخوذ منها العينات، لا كل +حركتها. ولا تُعرض ضمن **الواجهة** فوق الصفحات. يعرف traffic66 الواجهة التي أُخذت +منها عينة التدفق من مصدر بيانات sFlow، أو من الحقل flowDirection (IPFIX 61) في +NetFlow v9 وIPFIX (ingress: واجهة الدخول، egress: واجهة الخروج). وبدون هذا +الحقل، تُعدّ الواجهة الموجودة في 90% على الأقل من حركة الجهاز هي المأخوذ منها +العينات؛ وإن لم توجد فلا تُعلَّم أي واجهة. وتعرض **الإعدادات** لكل جهاز الواجهات +المأخوذ منها العينات (**العينات من**)، وهل تحمل قوالبه flowDirection (**مع +flowDirection (61)**). ولرؤية كل حركة الجهاز، خذ العينات من كل واجهة في اتجاه +الدخول (انظر [إرسال التدفقات من أجهزتك](#4-send-flows-from-your-devices)). + ![مطابقة الواجهات: حركة كل واجهة، وتقدير التدفقات بجوار عدّاد الجهاز](images/interfaces.png) للحصول على عدّادات للمقارنة: @@ -690,7 +703,7 @@ curl -L https://www.spamhaus.org/drop/drop.txt -o /threats/spamh | الاكتشافات | ما يستدعي الانتباه: عمليات المسح، وتخمين كلمات المرور، والتحرك الجانبي، وعمليات الرفع غير المعتادة، والإغراق، وحركة قوائم التهديدات ([المزيد](#findings)) | | معلومات التهديدات | المضيفات التي تواصلت مع عناوين في قوائم تهديداتك، وكم أرسلت | | الجغرافيا والشبكات | خريطة العالم للحركة حسب الدولة، مع خطوط من شبكاتك؛ الشبكات (AS) التي جاءت منها الحركة وذهبت إليها، عبر الزمن بوحدة bits/s وpackets/s؛ والحركة حسب الدولة وحسب الشبكة | -| الإعدادات | الأجهزة، وأخذ العينات، والفقد، والمستقبِلات، وSNMP، وقاعدة بيانات الدول والشبكات، والشعار، و**الأسماء** | +| الإعدادات | الأجهزة، وأخذ العينات، والواجهات التي يأخذ منها كل جهاز العينات وهل يرسل flowDirection، والفقد، والمستقبِلات، وSNMP، وقاعدة بيانات الدول والشبكات، والشعار، و**الأسماء** | | مطابقة الواجهات | حركة كل واجهة عبر الزمن بوحدة bits/s، وتحتها packets/s، الدخول (بالأخضر) والخروج (بالأزرق)، مع عدّادات الجهاز خطوطًا متقطعة؛ ومدى ابتعاد أرقام التدفقات عن العدّادات، الأسوأ أولًا، مع الأسباب؛ واسم ووسم لكل واجهة، والواجهة الافتراضية | | سجلات التدفق | كم سجل تدفق كان هناك ومتى (شريط لكل فترة)، والسجلات نفسها، الأحدث أولًا، صفحةً صفحة، مع أعمدة قابلة للاختيار. تُفتح على آخر 15 دقيقة، وتُحدَّث كل 5 ثوانٍ؛ وإذا فُتحت من قيمة في صفحة أخرى (**اعرض سجلات تدفقه**) فإنها تحتفظ بالنطاق الزمني لتلك الصفحة، ويعيدك **العودة إلى البث المباشر** | | تنظيف البيانات | يحذف البيانات الأقدم من 120 أو 90 أو 60 أو 30 أو 7 أيام، أو كلها، مع مقدار ما يحرّره كل خيار ([المزيد](#13-data-backup-upgrade-uninstall)) | @@ -705,7 +718,8 @@ curl -L https://www.spamhaus.org/drop/drop.txt -o /threats/spamh فوق صفحات الحركة (نظرة عامة، أعلى 66، تفاصيل الحركة، مسارات الحركة، الجغرافيا والشبكات، سجلات التدفق، وتفاصيل أي قيمة) يوجد **الواجهة**: **كل الواجهات**، أو واجهة واحدة، فلا تعرض هذه الصفحات إلا الحركة المارّة عبرها (دخولًا أو خروجًا). -ويبدأ على الواجهة الافتراضية (★، تُضبط في **مطابقة الواجهات**)، والاختيار جزء من +ويسرد الواجهات المأخوذ منها العينات مجمّعةً حسب الجهاز، ويبدأ على +الواجهة الافتراضية (★، تُضبط في **مطابقة الواجهات**)، والاختيار جزء من الرابط. أما الاكتشافات ومعلومات التهديدات ومطابقة الواجهات والإعدادات فتغطي دائمًا كل الحركة. ولواجهة واحدة على مدى 7 أو 30 يومًا تقرأ الصفحات سجلات التدفق بدل الملخصات الساعية واليومية، فتستغرق وقتًا أطول ولا تعود إلى الوراء إلا بقدر diff --git a/docs/README.bn.md b/docs/README.bn.md index cf68a67..589445e 100644 --- a/docs/README.bn.md +++ b/docs/README.bn.md @@ -556,6 +556,21 @@ egress (নীল) থাকে; ডিভাইসের নিজের counte ([web UI ব্যবহার](#9-using-the-web-ui)-এ **ইন্টারফেস** বাছাই দেখুন), এবং সারসংক্ষেপ এর bandwidth দেখায়। দুটোই সঙ্গে সঙ্গে **নাম**-এর `iface` লাইনে সংরক্ষিত হয়। +Flow record-এ দুটি interface থাকে: যেটি দিয়ে packet এসেছে এবং যেটি দিয়ে +বেরিয়েছে। তাই যে ডিভাইস শুধু কিছু interface স্যাম্পল করে, সেটি তাদের flow-এর +অন্য প্রান্তগুলোও দেখায়। এই **বিপরীত ইন্টারফেস** তালিকার শেষে, ছোট ধূসর লেখায়, +নিজস্ব শিরোনামের নিচে দেখানো হয়: তাদের সংখ্যায় শুধু সেই ট্রাফিক থাকে যা কোনো +স্যাম্পল করা interface দিয়ে গেছে, তাদের সব ট্রাফিক নয়। পেজগুলোর ওপরের +**ইন্টারফেস**-এ এগুলো দেওয়া হয় না। কোন interface একটি flow স্যাম্পল করেছে, +traffic66 তা জানে sFlow-এর data source থেকে, অথবা NetFlow v9 ও IPFIX-এর +flowDirection field (IPFIX 61) থেকে (ingress: input interface, egress: output +interface)। এই field না থাকলে, যে interface ডিভাইসের অন্তত 90% ট্রাফিকে আছে +সেটিকে স্যাম্পল করা ধরা হয়; এমন কোনোটি না থাকলে কোনো interface চিহ্নিত হয় না। +**সেটিংস** প্রতিটি ডিভাইসের **স্যাম্পল ইন্টারফেস** দেখায়, এবং তার template +**flowDirection (61) সহ** কি না। ডিভাইসের সব ট্রাফিক দেখতে প্রতিটি interface +inbound স্যাম্পল করুন ([আপনার ডিভাইস থেকে flow +পাঠান](#4-send-flows-from-your-devices) দেখুন)। + ![ইন্টারফেস মিলানো: প্রতিটি interface-এর ট্রাফিক, আর ডিভাইসের counter-এর পাশে flow-এর অনুমান](images/interfaces.png) তুলনার জন্য counter পেতে: @@ -702,7 +717,7 @@ application, দেশ, ডিভাইস — ক্লিক করা যা | সন্দেহজনক কার্যকলাপ | কীসে নজর দিতে হবে: scan, পাসওয়ার্ড অনুমান, lateral movement, অস্বাভাবিক upload, flood আর threat list-এর ট্রাফিক ([আরও](#findings)) | | হুমকির তথ্য | যেসব host আপনার threat list-এর address-এর সাথে কথা বলেছে, এবং কতটা পাঠিয়েছে | | ভূগোল ও নেটওয়ার্ক | দেশ অনুযায়ী ট্রাফিকের বিশ্ব মানচিত্র, আপনার নেটওয়ার্ক থেকে রেখা সহ; যেসব নেটওয়ার্ক (AS) থেকে ট্রাফিক এসেছে ও যেখানে গেছে, সময়ের সাথে bits/s ও packets/s-এ; দেশ ও নেটওয়ার্ক অনুযায়ী ট্রাফিক | -| সেটিংস | ডিভাইস, sampling, loss, collector, SNMP, দেশ ও নেটওয়ার্ক ডেটাবেস, লোগো, এবং **নাম** | +| সেটিংস | ডিভাইস, sampling, প্রতিটি ডিভাইস কোন interface স্যাম্পল করে ও flowDirection পাঠায় কি না, loss, collector, SNMP, দেশ ও নেটওয়ার্ক ডেটাবেস, লোগো, এবং **নাম** | | ইন্টারফেস মিলানো | সময়ের সাথে প্রতিটি interface-এর ট্রাফিক bits/s-এ এবং, নিচে, packets/s-এ, ingress (সবুজ) ও egress (নীল), ডিভাইসের counter ড্যাশ রেখা হিসেবে; flow-এর সংখ্যা counter থেকে কতটা দূরে, সবচেয়ে খারাপগুলো আগে, কারণসহ; প্রতিটি interface-এর জন্য একটি নাম, একটি ট্যাগ ও ডিফল্ট | | ফ্লো রেকর্ড | কতগুলো flow record ছিল এবং কখন (প্রতি interval-এ একটি bar), আর record-গুলো নিজেই, নতুনগুলো আগে, পেজ ধরে ধরে, বেছে নেওয়া যায় এমন column সহ। শেষ 15 মিনিট দিয়ে খোলে, প্রতি 5 সেকেন্ডে আপডেট হয়; অন্য পেজের কোনো value থেকে (**এর ফ্লো রেকর্ড দেখুন**) খুললে সেই পেজের সময়সীমা রাখে, আর **লাইভে ফিরুন** আবার লাইভে নিয়ে যায় | | ডেটা পরিষ্কার | 120, 90, 60, 30 বা 7 দিনের চেয়ে পুরোনো ডেটা, বা সব ডেটা মুছে দেয়, প্রতিটিতে কতটা জায়গা খালি হয় তা সহ ([আরও](#13-data-backup-upgrade-uninstall)) | @@ -717,7 +732,8 @@ application, দেশ, ডিভাইস — ক্লিক করা যা ট্রাফিক পেজগুলোর (সারসংক্ষেপ, শীর্ষ 66, ট্রাফিকের বিস্তারিত, ট্রাফিকের পথ, ভূগোল ও নেটওয়ার্ক, ফ্লো রেকর্ড এবং কোনো value-এর বিস্তারিত) ওপরে **ইন্টারফেস** আছে: **সব ইন্টারফেস**, অথবা একটি interface, যাতে এই পেজগুলো শুধু সেটির মধ্য দিয়ে -যাওয়া ট্রাফিক (আগত বা বহির্গামী) দেখায়। এটি ডিফল্ট interface (★, **ইন্টারফেস +যাওয়া ট্রাফিক (আগত বা বহির্গামী) দেখায়। এতে স্যাম্পল ইন্টারফেসগুলো ডিভাইস অনুযায়ী +দলে দেখানো হয়, এবং এটি ডিফল্ট interface (★, **ইন্টারফেস মিলানো**-তে ঠিক করা) দিয়ে শুরু হয় এবং বাছাইটি লিংকের অংশ। সন্দেহজনক কার্যকলাপ, হুমকির তথ্য, ইন্টারফেস মিলানো ও সেটিংস সবসময় সব ট্রাফিক দেখায়। 7 বা 30 দিনের জন্য একটি interface বাছলে পেজগুলো ঘণ্টা ও দিনের summary-র বদলে flow record diff --git a/docs/README.es.md b/docs/README.es.md index 78fe7a0..4dea3ef 100644 --- a/docs/README.es.md +++ b/docs/README.es.md @@ -568,6 +568,23 @@ una. Las páginas se abren entonces en ella (vea la opción **Interfaz** en [Uso de la interfaz web](#9-using-the-web-ui)), y el resumen muestra su ancho de banda. Ambos se guardan al momento en la línea `iface` de Nombres. +Los registros de flujo nombran dos interfaces: aquella por la que entró un +paquete y aquella por la que salió. Por eso, un equipo que muestrea solo +algunas interfaces muestra también los otros extremos de sus flujos. Esas +**Interfaces del otro extremo** aparecen al final, en letra gris más +pequeña, bajo su propio encabezado: sus cifras contienen solo el tráfico +que pasó por una interfaz muestreada, no todo su tráfico. No se ofrecen en +**Interfaz** encima de las páginas. traffic66 sabe qué interfaz muestreó un +flujo por la fuente de datos de sFlow, o por el campo flowDirection (IPFIX +61) de NetFlow v9 e IPFIX (ingress: la interfaz de entrada, egress: la +interfaz de salida). Sin ese campo, una interfaz presente en al menos el +90 % del tráfico de un equipo se toma como la muestreada; si no hay +ninguna, no se marca ninguna interfaz. **Configuración** muestra, para cada +equipo, las interfaces muestreadas (**Muestreo en:**) y si sus plantillas +llevan flowDirection (**con flowDirection (61)**). Para ver todo el tráfico +de un equipo, muestree cada interfaz en entrada (vea [Enviar flujos desde +los equipos](#4-send-flows-from-your-devices)). + ![Verificación de interfaces: tráfico de cada interfaz, y la estimación de flujos junto al contador del equipo](images/interfaces.png) Para disponer de contadores con los que comparar: @@ -722,7 +739,7 @@ Páginas: | Hallazgos | Qué requiere atención: escaneos, adivinación de contraseñas, movimiento lateral, subidas inusuales, inundaciones y tráfico de listas de amenazas ([más](#findings)) | | Inteligencia de amenazas | Hosts que hablaron con direcciones de sus listas de amenazas y cuánto enviaron | | Geografía y redes | Un mapa del mundo del tráfico por país, con líneas desde sus redes; las redes (AS) de las que vino y a las que fue el tráfico, en el tiempo en bits/s y paquetes/s; tráfico por país y por red | -| Configuración | Equipos, muestreo, pérdidas, colectores, SNMP, la base de datos de países y redes, el logotipo y **Nombres** | +| Configuración | Equipos, muestreo, las interfaces que muestrea cada equipo y si envía flowDirection, pérdidas, colectores, SNMP, la base de datos de países y redes, el logotipo y **Nombres** | | Verificación de interfaces | Tráfico de cada interfaz en el tiempo en bits/s y, debajo, paquetes/s, entrada (verde) y salida (azul), con los contadores del equipo como líneas discontinuas; cuánto se alejan las cifras de flujo de los contadores, de peor a mejor, con motivos; un nombre, una etiqueta y la predeterminada para cada interfaz | | Registros de flujo | Cuántos registros de flujo hubo y cuándo (una barra por intervalo), y los registros mismos, del más reciente al más antiguo, página a página, con columnas seleccionables. Se abre en los últimos 15 minutos, actualizados cada 5 segundos; abierta desde un valor de otra página (**Ver sus registros de flujo**) conserva el rango de tiempo de esa página, y **Volver a tiempo real** regresa | | Limpieza de datos | Borra los datos de más de 120, 90, 60, 30 o 7 días, o todos, indicando cuánto libera cada opción ([más](#13-data-backup-upgrade-uninstall)) | @@ -739,8 +756,9 @@ Encima de las páginas de tráfico (Resumen, Top 66, Detalles del tráfico, Rutas de tráfico, Geografía y redes, Registros de flujo y el detalle de un valor) está **Interfaz**: **Todas las interfaces**, o una interfaz, para que estas páginas muestren solo el tráfico que pasa por ella (de entrada o de -salida). Empieza en la interfaz predeterminada (★, fijada en -**Verificación de interfaces**) y la elección forma parte del enlace. +salida). Lista las interfaces muestreadas, agrupadas por equipo, y empieza +en la interfaz predeterminada (★, fijada en **Verificación de +interfaces**) y la elección forma parte del enlace. Hallazgos, Inteligencia de amenazas, Verificación de interfaces y Configuración siempre abarcan todo el tráfico. Para una interfaz en 7 o 30 días las páginas leen los registros de flujo en lugar de los resúmenes por diff --git a/docs/README.fr.md b/docs/README.fr.md index d56c646..0b25d65 100644 --- a/docs/README.fr.md +++ b/docs/README.fr.md @@ -584,6 +584,25 @@ dans [Utiliser l'interface web](#9-using-the-web-ui)), et la vue d'ensemble affiche sa bande passante. Les deux sont enregistrés aussitôt dans la ligne `iface` de Noms. +Les enregistrements de flux nomment deux interfaces : celle par laquelle un +paquet est entré et celle par laquelle il est sorti. Un équipement qui +n'échantillonne que certaines interfaces montre donc aussi l'autre bout de +leurs flux. Ces **Interfaces d’en face** sont listées en dernier, en plus +petit et en gris, sous leur propre titre : leurs chiffres ne contiennent +que le trafic passé par une interface échantillonnée, pas tout leur +trafic. Elles ne sont pas proposées dans **Interface** au-dessus des +pages. traffic66 sait quelle interface a échantillonné un flux grâce à la +source de données sFlow, ou au champ flowDirection (IPFIX 61) de NetFlow v9 +et IPFIX (ingress : l'interface d'entrée, egress : l'interface de sortie). +Sans ce champ, une interface présente sur au moins 90 % du trafic d'un +équipement est considérée comme l'interface échantillonnée ; s'il n'y en a +aucune, aucune interface n'est marquée. **Paramètres** montre, pour chaque +équipement, les interfaces échantillonnées (**Échantillonné sur :**) et si +ses modèles portent flowDirection (**avec flowDirection (61)**). Pour voir +tout le trafic d'un équipement, échantillonnez chaque interface en entrée +(voir [Envoyer les flux depuis vos +équipements](#4-send-flows-from-your-devices)). + ![Contrôle des interfaces : trafic de chaque interface, et l'estimation des flux à côté du compteur de l'équipement](images/interfaces.png) Pour disposer de compteurs de comparaison : @@ -742,7 +761,7 @@ Pages : | Détections | Ce qui demande votre attention : scans, essais de mots de passe, mouvements latéraux, envois inhabituels, inondations et trafic des listes de menaces ([plus](#findings)) | | Menaces | Hôtes ayant communiqué avec des adresses de vos listes de menaces, et volume envoyé | | Géographie et réseaux | Une carte du monde du trafic par pays, avec des lignes depuis vos réseaux ; les réseaux (AS) d'où venait et où allait le trafic, dans le temps en bits/s et paquets/s ; trafic par pays et par réseau | -| Paramètres | Équipements, échantillonnage, pertes, collecteurs, SNMP, la base de données pays et réseaux, le logo et **Noms** | +| Paramètres | Équipements, échantillonnage, les interfaces que chaque équipement échantillonne et s'il envoie flowDirection, pertes, collecteurs, SNMP, la base de données pays et réseaux, le logo et **Noms** | | Contrôle des interfaces | Trafic de chaque interface dans le temps en bits/s et, en dessous, en paquets/s, entrée (vert) et sortie (bleu), avec les compteurs de l'équipement en pointillés ; l'écart entre les chiffres de flux et les compteurs, les pires en premier, avec les causes ; un nom, une étiquette et l'interface par défaut pour chaque interface | | Enregistrements de flux | Combien d'enregistrements de flux il y a eu et quand (une barre par intervalle), et les enregistrements eux-mêmes, du plus récent au plus ancien, page par page, avec colonnes au choix. S'ouvre sur les 15 dernières minutes, mises à jour toutes les 5 secondes ; ouverte depuis une valeur d'une autre page (**Voir ses enregistrements de flux**), elle garde la plage de temps de cette page, et **Revenir au temps réel** y revient | | Nettoyage des données | Supprime les données de plus de 120, 90, 60, 30 ou 7 jours, ou toutes, en indiquant ce que chaque choix libère ([plus](#13-data-backup-upgrade-uninstall)) | @@ -759,7 +778,8 @@ Au-dessus des pages de trafic (Vue d'ensemble, Top 66, Détails du trafic, Chemins du trafic, Géographie et réseaux, Enregistrements de flux et le détail d'une valeur) se trouve **Interface** : **Toutes les interfaces**, ou une seule interface, pour que ces pages ne montrent que le trafic qui -la traverse (en entrée ou en sortie). Il démarre sur l'interface par +la traverse (en entrée ou en sortie). Il liste les interfaces +échantillonnées, regroupées par équipement, et démarre sur l'interface par défaut (★, définie dans **Contrôle des interfaces**) et le choix fait partie du lien. Détections, Menaces, Contrôle des interfaces et Paramètres couvrent toujours tout le trafic. Pour une interface sur 7 ou 30 jours, diff --git a/docs/README.hi.md b/docs/README.hi.md index e8513a8..a5bfd1b 100644 --- a/docs/README.hi.md +++ b/docs/README.hi.md @@ -555,6 +555,21 @@ traffic66 इन्हें डिवाइस के अपने interface co खुलते हैं ([web UI का इस्तेमाल](#9-using-the-web-ui) में **इंटरफ़ेस** का चुनाव देखें), और सारांश उसकी bandwidth दिखाता है। दोनों तुरंत **नाम** में `iface` line में सहेजे जाते हैं। +Flow records में दो interfaces होते हैं: जिस पर packet आया और जिससे वह बाहर गया। +इसलिए जो डिवाइस केवल कुछ interfaces को सैंपल करता है, वह उनके flows के दूसरे +सिरे भी दिखाता है। ये **सामने वाले इंटरफ़ेस** सबसे आख़िर में, छोटे धूसर अक्षरों +में, अपने अलग शीर्षक के नीचे दिखते हैं: उनके आँकड़ों में केवल वह ट्रैफ़िक है जो +किसी सैंपल किए गए interface से होकर गुज़रा, उनका पूरा ट्रैफ़िक नहीं। पेजों के +ऊपर **इंटरफ़ेस** में ये नहीं दिखते। traffic66 जानता है कि किस interface ने flow +सैंपल किया: sFlow के data source से, या NetFlow v9 और IPFIX के flowDirection +field (IPFIX 61) से (ingress: input interface, egress: output interface)। यह +field न हो तो जो interface डिवाइस के कम से कम 90% ट्रैफ़िक में है, उसे सैंपल +किया गया माना जाता है; ऐसा कोई न हो तो कोई interface चिह्नित नहीं होता। +**सेटिंग्स** हर डिवाइस के लिए **सैंपल इंटरफ़ेस** दिखाता है, और यह कि उसके +templates **flowDirection (61) सहित** हैं या नहीं। डिवाइस का पूरा ट्रैफ़िक देखने +के लिए हर interface को inbound सैंपल करें ([अपने डिवाइसों से flows +भेजें](#4-send-flows-from-your-devices) देखें)। + ![इंटरफ़ेस मिलान: हर interface का ट्रैफ़िक, और डिवाइस के counter के बगल में flow का अनुमान](images/interfaces.png) तुलना के लिए counters पाने के लिए: @@ -702,7 +717,7 @@ application, देश, डिवाइस — पर क्लिक किय | संदिग्ध गतिविधि | किस पर ध्यान देना है: scans, पासवर्ड का अनुमान, lateral movement, असामान्य uploads, floods और threat list वाला ट्रैफ़िक ([और जानें](#findings)) | | ख़तरे की जानकारी | वे hosts जिन्होंने आपकी threat lists के addresses से बात की, और उन्होंने कितना भेजा | | भूगोल और नेटवर्क | देश के अनुसार ट्रैफ़िक का विश्व मानचित्र, आपके नेटवर्कों से लाइनों के साथ; वे नेटवर्क (AS) जहाँ से ट्रैफ़िक आया और जहाँ गया, समय के साथ bits/s और packets/s में; देश के हिसाब से और नेटवर्क के हिसाब से ट्रैफ़िक | -| सेटिंग्स | डिवाइस, sampling, loss, collectors, SNMP, देश और नेटवर्क डेटाबेस, लोगो, और **नाम** | +| सेटिंग्स | डिवाइस, sampling, हर डिवाइस के सैंपल इंटरफ़ेस और क्या वह flowDirection भेजता है, loss, collectors, SNMP, देश और नेटवर्क डेटाबेस, लोगो, और **नाम** | | इंटरफ़ेस मिलान | समय के साथ हर interface का ट्रैफ़िक bits/s में और, नीचे, packets/s में, ingress (हरा) और egress (नीला), डिवाइस counters dashed lines के रूप में; flow के आँकड़े counters से कितने दूर हैं, सबसे ख़राब पहले, कारणों के साथ; हर interface के लिए एक नाम, एक टैग और डिफ़ॉल्ट | | फ़्लो रिकॉर्ड | कितने flow records थे और कब (हर interval के लिए एक bar), और ख़ुद records, सबसे नए पहले, पेज-दर-पेज, चुने जा सकने वाले columns के साथ। पिछले 15 मिनट पर खुलता है और हर 5 सेकंड में अपडेट होता है; किसी दूसरे पेज की value से (**इसके फ़्लो रिकॉर्ड देखें**) खोलने पर उस पेज की समय-सीमा बनी रहती है, और **लाइव पर लौटें** वापस ले आता है | | डेटा सफ़ाई | 120, 90, 60, 30 या 7 दिन से पुराना डेटा, या पूरा डेटा, हटाता है, और बताता है कि हर विकल्प से कितनी जगह खाली होगी ([और](#13-data-backup-upgrade-uninstall)) | @@ -716,7 +731,8 @@ application, देश, डिवाइस — पर क्लिक किय ट्रैफ़िक पेजों (सारांश, शीर्ष 66, ट्रैफ़िक विवरण, ट्रैफ़िक के रास्ते, भूगोल और नेटवर्क, फ़्लो रिकॉर्ड और किसी value का विवरण) के ऊपर **इंटरफ़ेस** है: **सभी इंटरफ़ेस**, या एक interface, ताकि ये पेज सिर्फ़ उससे होकर गुज़रने वाला ट्रैफ़िक -(अंदर या बाहर) दिखाएँ। यह डिफ़ॉल्ट interface (★, **इंटरफ़ेस मिलान** पर सेट) से +(अंदर या बाहर) दिखाएँ। इसमें सैंपल इंटरफ़ेस, डिवाइस के अनुसार समूहों में, दिखते हैं, +और यह डिफ़ॉल्ट interface (★, **इंटरफ़ेस मिलान** पर सेट) से शुरू होता है और यह चुनाव link का हिस्सा है। संदिग्ध गतिविधि, ख़तरे की जानकारी, इंटरफ़ेस मिलान और सेटिंग्स हमेशा पूरा ट्रैफ़िक दिखाते हैं। 7 या 30 दिन के लिए एक interface चुनने पर पेज घंटेवार और दैनिक summaries की जगह flow records पढ़ते diff --git a/docs/README.id.md b/docs/README.id.md index 0cad292..2df7a99 100644 --- a/docs/README.id.md +++ b/docs/README.id.md @@ -568,6 +568,24 @@ bawaan. Halaman lalu dibuka pada interface itu (lihat pilihan **Antarmuka** di [Memakai antarmuka web](#9-using-the-web-ui)), dan Ringkasan menampilkan bandwidth-nya. Keduanya langsung disimpan ke baris `iface` di Nama. +Catatan flow menyebut dua interface: interface tempat paket masuk dan +interface tempat paket keluar. Karena itu, perangkat yang hanya menyampel +sebagian interface juga menampilkan ujung lain dari flow-nya. **Antarmuka +lawan** itu dicantumkan paling akhir, dengan huruf abu-abu yang lebih +kecil, di bawah judulnya sendiri: angkanya hanya berisi trafik yang lewat +interface yang disampel, bukan seluruh trafiknya. Interface ini tidak +ditawarkan di **Antarmuka** di atas halaman. traffic66 mengetahui +interface mana yang menyampel sebuah flow dari sumber data sFlow, atau dari +field flowDirection (IPFIX 61) pada NetFlow v9 dan IPFIX (ingress: +interface masuk, egress: interface keluar). Tanpa field itu, interface yang +ada pada sedikitnya 90% trafik sebuah perangkat dianggap sebagai yang +disampel; jika tidak ada, tidak ada interface yang ditandai. +**Pengaturan** menampilkan, untuk setiap perangkat, interface yang disampel +(**Disampel di:**) dan apakah template-nya membawa flowDirection +(**dengan flowDirection (61)**). Untuk melihat seluruh trafik sebuah +perangkat, sampel setiap interface pada arah masuk (lihat [Kirim flow dari +perangkat Anda](#4-send-flows-from-your-devices)). + ![Pencocokan antarmuka: trafik setiap interface, dan estimasi flow di samping counter perangkat](images/interfaces.png) Agar ada counter untuk dibandingkan: @@ -719,7 +737,7 @@ Halaman: | Temuan | Apa yang perlu diperhatikan: pemindaian, tebakan kata sandi, pergerakan lateral, unggahan tidak biasa, flood, dan trafik daftar ancaman ([selengkapnya](#findings)) | | Intel ancaman | Host yang berkomunikasi dengan alamat di daftar ancaman Anda, dan berapa banyak yang mereka kirim | | Geografi & jaringan | Peta dunia trafik per negara, dengan garis dari jaringan Anda; jaringan (AS) asal dan tujuan trafik, dari waktu ke waktu dalam bit/s dan paket/s; trafik per negara dan per jaringan | -| Pengaturan | Perangkat, sampling, loss, collector, SNMP, basis data negara dan jaringan, logo, dan **Nama** | +| Pengaturan | Perangkat, sampling, interface yang disampel setiap perangkat dan apakah perangkat mengirim flowDirection, loss, collector, SNMP, basis data negara dan jaringan, logo, dan **Nama** | | Pencocokan antarmuka | Trafik setiap interface dari waktu ke waktu dalam bit/s dan, di bawahnya, paket/s, ingress (hijau) dan egress (biru), dengan counter perangkat sebagai garis putus-putus; seberapa jauh angka flow dari counter, yang paling buruk di atas, beserta alasannya; nama, label, dan bawaan untuk setiap interface | | Catatan flow | Berapa banyak catatan flow dan kapan (satu batang per interval), dan catatannya sendiri, terbaru di atas, per halaman, dengan kolom yang bisa dipilih. Terbuka pada 15 menit terakhir, diperbarui setiap 5 detik; bila dibuka dari sebuah nilai di halaman lain (**Lihat catatan flow-nya**), rentang waktu halaman itu dipertahankan, dan **Kembali ke waktu nyata** mengembalikannya | | Pembersihan data | Menghapus data yang lebih lama dari 120, 90, 60, 30, atau 7 hari, atau semuanya, beserta berapa banyak ruang yang dibebaskan masing-masing ([selengkapnya](#13-data-backup-upgrade-uninstall)) | @@ -734,7 +752,8 @@ tanggal dan jam server. Di atas halaman trafik (Ringkasan, Top 66, Detail trafik, Jalur trafik, Geografi & jaringan, Catatan flow, dan detail sebuah nilai) ada **Antarmuka**: **Semua antarmuka**, atau satu interface, sehingga halaman -ini hanya menampilkan trafik yang melewatinya (masuk atau keluar). Awalnya +ini hanya menampilkan trafik yang melewatinya (masuk atau keluar). Isinya +interface yang disampel, dikelompokkan per perangkat, dan awalnya berada di interface bawaan (★, diatur di **Pencocokan antarmuka**) dan pilihannya ikut tersimpan di tautan. Temuan, Intel ancaman, Pencocokan antarmuka, dan Pengaturan selalu mencakup semua trafik. Untuk satu diff --git a/docs/README.ja.md b/docs/README.ja.md index 567cf6a..85c40c8 100644 --- a/docs/README.ja.md +++ b/docs/README.ja.md @@ -464,6 +464,8 @@ softflowd -i eth0 -n 192.0.2.50:2055 -v 9 -t maxlife=60 一覧の各行にはボタンが 2 つあります。**✎** はインターフェースに名前と短いタグ(*uplink* など)を付けます。タグはどこでも名前の横に表示されます。**☆** はそれをデフォルトのインターフェース(**★**)にします。デフォルトは 1 つだけです。以後、各ページはそのインターフェースで開き([Web UI の使い方](#9-using-the-web-ui) の **インターフェース** の選択を参照)、概要にはその帯域幅が表示されます。どちらもすぐに **名前** の `iface` 行に保存されます。 +フローレコードには 2 つのインターフェースが記録されます。パケットが入ってきたインターフェースと出ていったインターフェースです。そのため、一部のインターフェースだけでサンプリングしている機器では、それらのフローの反対側のインターフェースも表示されます。これらの **対向インターフェース** は一覧の最後に、小さい灰色の文字で専用の見出しの下に並びます。その数値はサンプリング対象のインターフェースを通ったトラフィックだけで、そのインターフェースの全トラフィックではありません。ページ上部の **インターフェース** には表示されません。traffic66 は、どのインターフェースがフローをサンプリングしたかを、sFlow のデータソース、または NetFlow v9 と IPFIX の flowDirection フィールド(IPFIX 61)(ingress:入力インターフェース、egress:出力インターフェース)から判断します。このフィールドがない場合は、機器のトラフィックの 90% 以上が通るインターフェースをサンプリング対象とみなします。該当するものがなければ、どのインターフェースにも印を付けません。**設定** には機器ごとに、サンプリング対象のインターフェースと、テンプレートに方向フィールド(61)があるかどうかが表示されます。機器の全トラフィックを見るには、すべてのインターフェースで受信方向をサンプリングしてください([機器からフローを送る](#4-send-flows-from-your-devices) を参照)。 + ![インターフェース照合:全インターフェースのトラフィックと、フローの推定値と機器のカウンターの並列表示](images/interfaces.png) 比較用のカウンターを取得するには: @@ -572,7 +574,7 @@ curl -L https://www.spamhaus.org/drop/drop.txt -o /threats/spamh | 検知 | 対応が必要なもの:スキャン、パスワード総当たり、横展開、不審なアップロード、フラッド、脅威リストとの通信([詳しく](#findings)) | | 脅威インテル | 脅威リスト上のアドレスと通信したホストと、その送信量 | | 地域とネットワーク | 国別トラフィックの世界地図(自社ネットワークからの線付き)、トラフィックの送信元・送信先のネットワーク(AS)の推移(bits/s と packets/s)、国別・ネットワーク別のトラフィック | -| 設定 | 機器、サンプリング、ロス、コレクター、SNMP、国・ネットワークデータベース、ロゴ、**名前** | +| 設定 | 機器、サンプリング、各機器のサンプリング対象のインターフェースと flowDirection を送っているかどうか、ロス、コレクター、SNMP、国・ネットワークデータベース、ロゴ、**名前** | | インターフェース照合 | 全インターフェースのトラフィックの推移(bits/s とその下に packets/s、受信(緑)と送信(青)、機器のカウンターは破線)と、フローの数値とカウンターの差(差の大きい順、理由付き)、各インターフェースの名前、タグ、デフォルトの指定 | | フローレコード | フローレコードの数とその時期(間隔ごとの棒グラフ)と、レコードそのもの(新しい順、ページ送り、表示列は選択可能)。開くと直近 15 分を表示し、5 秒ごとに更新。他のページの値から開いた場合(**フローレコードを見る**)はそのページの時間範囲を引き継ぎ、**リアルタイムに戻る** で戻る | | データ削除 | 120、90、60、30、7 日より古いデータ、またはすべてのデータを削除。それぞれで空く容量も表示([詳しく](#13-data-backup-upgrade-uninstall)) | @@ -580,7 +582,7 @@ curl -L https://www.spamhaus.org/drop/drop.txt -o /threats/spamh サイドメニューはページを 4 つのグループに分けて並べます:トラフィック(概要、上位 66、トラフィック詳細、フローの流れ、インターフェース照合)、セキュリティ(検知、脅威インテル、地域とネットワーク)、設定とデータ(設定、フローレコード、データ削除)、そしてオフライン pcap 分析。ロゴの下にはバージョンとサーバーの日時が表示されます。 -トラフィック系のページ(概要、上位 66、トラフィック詳細、フローの流れ、地域とネットワーク、フローレコード、値の詳細ページ)の上部には **インターフェース** があります。**すべてのインターフェース** か 1 つのインターフェースを選ぶと、これらのページにはそのインターフェースを通る(受信または送信の)トラフィックだけが表示されます。初期値はデフォルトのインターフェース(★、**インターフェース照合** で設定)で、選択はリンクにも含まれます。検知、脅威インテル、インターフェース照合、設定は常にすべてのトラフィックを対象とします。1 つのインターフェースで 7 日または 30 日を表示する場合、ページは 1 時間ごと・1 日ごとの集計ではなくフロー明細を読むため、時間がかかり、遡れるのはフロー明細の保存期間(デフォルト 30 日)までです。 +トラフィック系のページ(概要、上位 66、トラフィック詳細、フローの流れ、地域とネットワーク、フローレコード、値の詳細ページ)の上部には **インターフェース** があります。**すべてのインターフェース** か 1 つのインターフェースを選ぶと、これらのページにはそのインターフェースを通る(受信または送信の)トラフィックだけが表示されます。サンプリング対象のインターフェースが機器ごとにまとめて並び、初期値はデフォルトのインターフェース(★、**インターフェース照合** で設定)で、選択はリンクにも含まれます。検知、脅威インテル、インターフェース照合、設定は常にすべてのトラフィックを対象とします。1 つのインターフェースで 7 日または 30 日を表示する場合、ページは 1 時間ごと・1 日ごとの集計ではなくフロー明細を読むため、時間がかかり、遡れるのはフロー明細の保存期間(デフォルト 30 日)までです。 ページの上部には、時間範囲(15 分〜30 日、または **期間指定…** で任意の開始・終了。30 日より前も指定可能)、30 秒ごとの自動更新、そして **リンクをコピー** があります。**リンクをコピー** は、現在の表示(ページ、時間範囲、フィルター)そのものへのリンクをコピーするので、同僚に送るのに便利です。**上位 66** と **トラフィック詳細** では、**機器**、**クライアント**、**サーバー**、**サービス** に、時間範囲内で通信量の多い値が並びます。値を選ぶか入力すると絞り込まれ、そのフィルターはボックスを空にするまで全ページに適用されます。言語はブラウザーの設定に従い、メニューの一番下、**ログアウト** の上で変更できます。設定、フローレコード(リアルタイム表示中)、データ削除、オフライン pcap 分析には時間範囲がありません。 diff --git a/docs/README.ko.md b/docs/README.ko.md index 2aff56b..01b37bc 100644 --- a/docs/README.ko.md +++ b/docs/README.ko.md @@ -536,6 +536,19 @@ softflowd -i eth0 -n 192.0.2.50:2055 -v 9 -t maxlife=60 ([웹 UI 사용법](#9-using-the-web-ui)의 **인터페이스** 선택 참조), 개요에 그 대역폭이 표시됩니다. 둘 다 **이름**의 `iface` 행에 바로 저장됩니다. +플로 레코드에는 인터페이스가 두 개 기록됩니다. 패킷이 들어온 인터페이스와 나간 +인터페이스입니다. 그래서 일부 인터페이스에서만 샘플링하는 장비는 그 플로의 반대쪽 +인터페이스도 보여 줍니다. 이 **상대 인터페이스**는 목록 맨 끝에 더 작은 회색 글씨로 별도 +제목 아래 나열됩니다. 그 수치는 샘플링 인터페이스를 거친 트래픽만 담으며, 그 인터페이스의 +전체 트래픽이 아닙니다. 페이지 위쪽의 **인터페이스**에는 나오지 않습니다. +traffic66은 어느 인터페이스가 플로를 샘플링했는지를 sFlow 데이터 소스로, 또는 NetFlow v9와 +IPFIX의 flowDirection 필드(IPFIX 61)로 압니다(ingress: 입력 인터페이스, egress: 출력 +인터페이스). 이 필드가 없으면 장비 트래픽의 90% 이상이 지나는 인터페이스를 샘플링 +인터페이스로 봅니다. 그런 인터페이스가 없으면 아무 인터페이스도 표시하지 않습니다. +**설정**은 장비마다 샘플링 인터페이스와 템플릿에 방향 필드(61)가 있는지를 보여 줍니다. +장비의 모든 트래픽을 보려면 모든 인터페이스에서 수신 방향을 샘플링하십시오 +([장비에서 플로 보내기](#4-send-flows-from-your-devices) 참조). + ![인터페이스 대조: 모든 인터페이스의 트래픽, 그리고 플로 추정값과 장비 카운터를 나란히 표시](images/interfaces.png) 비교할 카운터를 얻으려면: @@ -675,7 +688,7 @@ curl -L https://www.spamhaus.org/drop/drop.txt -o /threats/spamh | 탐지 | 살펴봐야 할 것: 스캔, 비밀번호 대입, 내부 확산, 비정상 업로드, 플러드, 위협 목록 트래픽([자세히](#findings)) | | 위협 정보 | 위협 목록에 있는 주소와 통신한 호스트와 그 전송량 | | 지역 및 네트워크 | 국가별 트래픽 세계 지도(자체 네트워크에서 뻗는 선 포함), 트래픽이 오간 네트워크(AS)의 시간에 따른 변화(bits/s와 packets/s), 국가별, 네트워크별 트래픽 | -| 설정 | 장비, 샘플링, 유실, 수집기, SNMP, 국가 및 네트워크 데이터베이스, 로고, **이름** | +| 설정 | 장비, 샘플링, 각 장비의 샘플링 인터페이스와 flowDirection 전송 여부, 유실, 수집기, SNMP, 국가 및 네트워크 데이터베이스, 로고, **이름** | | 인터페이스 대조 | 모든 인터페이스의 시간에 따른 트래픽(bits/s와 그 아래 packets/s, 수신(초록)과 송신(파랑), 장비 카운터는 점선), 그리고 플로 수치가 카운터와 얼마나 차이 나는지, 차이가 큰 순, 원인 포함, 각 인터페이스의 이름, 태그, 기본 인터페이스 지정 | | 플로 레코드 | 플로 레코드가 얼마나, 언제 있었는지(간격마다 막대 하나), 그리고 레코드 자체, 최신순, 페이지 단위, 표시할 열 선택 가능. 처음에는 최근 15분을 5초마다 갱신해 표시하며, 다른 페이지의 값에서 열면(**플로 레코드 보기**) 그 페이지의 시간 범위를 유지하고, **실시간으로 돌아가기**로 돌아옴 | | 데이터 정리 | 120, 90, 60, 30, 7일보다 오래된 데이터 또는 모든 데이터를 삭제하며, 각각 얼마나 공간이 확보되는지 표시([자세히](#13-data-backup-upgrade-uninstall)) | @@ -688,8 +701,8 @@ curl -L https://www.spamhaus.org/drop/drop.txt -o /threats/spamh 트래픽 페이지(개요, Top 66, 트래픽 상세, 트래픽 경로, 지역 및 네트워크, 플로 레코드, 값의 상세 페이지) 위쪽에는 **인터페이스**가 있습니다. **모든 인터페이스** 또는 인터페이스 하나를 고르면 -이 페이지들은 그 인터페이스를 지나는(수신 또는 송신) 트래픽만 보여 줍니다. 처음에는 기본 -인터페이스(★, **인터페이스 대조**에서 설정)로 시작하며, 선택은 링크에도 포함됩니다. 탐지, +이 페이지들은 그 인터페이스를 지나는(수신 또는 송신) 트래픽만 보여 줍니다. 샘플링 인터페이스가 장비별로 묶여 +나열되며, 처음에는 기본 인터페이스(★, **인터페이스 대조**에서 설정)로 시작하고, 선택은 링크에도 포함됩니다. 탐지, 위협 정보, 인터페이스 대조, 설정은 항상 모든 트래픽을 대상으로 합니다. 인터페이스 하나를 7일이나 30일로 볼 때는 시간별·일별 요약 대신 플로 레코드를 읽으므로 시간이 더 걸리고, 플로 레코드를 보관하는 기간(기본 30일)까지만 거슬러 올라갈 수 있습니다. diff --git a/docs/README.pt.md b/docs/README.pt.md index 3e6dbf2..eec8be5 100644 --- a/docs/README.pt.md +++ b/docs/README.pt.md @@ -566,6 +566,23 @@ abrem nela (veja a opção **Interface** em [Usando a interface web](#9-using-the-web-ui)), e a visão geral mostra a banda dela. Os dois são salvos na hora na linha `iface` de Nomes. +Os registros de fluxo nomeiam duas interfaces: aquela por onde um pacote +entrou e aquela por onde saiu. Por isso, um equipamento que amostra só +algumas interfaces mostra também as outras pontas dos fluxos delas. Essas +**Interfaces do outro lado** aparecem por último, em letra cinza menor, sob +um título próprio: os números delas contêm só o tráfego que passou por uma +interface amostrada, não todo o tráfego delas. Elas não são oferecidas em +**Interface** acima das páginas. O traffic66 sabe qual interface amostrou +um fluxo pela fonte de dados do sFlow, ou pelo campo flowDirection (IPFIX +61) do NetFlow v9 e do IPFIX (ingress: a interface de entrada, egress: a +interface de saída). Sem esse campo, uma interface presente em pelo menos +90% do tráfego de um equipamento é tomada como a amostrada; se não houver +nenhuma, nenhuma interface é marcada. **Configurações** mostra, para cada +equipamento, as interfaces amostradas (**Amostragem em:**) e se os modelos +dele trazem flowDirection (**com flowDirection (61)**). Para ver todo o +tráfego de um equipamento, amostre cada interface na entrada (veja [Enviar +fluxos dos seus equipamentos](#4-send-flows-from-your-devices)). + ![Conferência de interfaces: tráfego de cada interface, e a estimativa de fluxo ao lado do contador do equipamento](images/interfaces.png) Para ter contadores com que comparar: @@ -722,7 +739,7 @@ Páginas: | Detecções | O que precisa de atenção: varreduras, tentativas de senhas, movimento lateral, envios incomuns, inundações e tráfego de listas de ameaças ([mais](#findings)) | | Ameaças | Hosts que se comunicaram com endereços das suas listas de ameaças, e quanto enviaram | | Geografia e redes | Um mapa-múndi do tráfego por país, com linhas a partir das suas redes; as redes (AS) de onde o tráfego veio e para onde foi, ao longo do tempo em bits/s e pacotes/s; tráfego por país e por rede | -| Configurações | Equipamentos, amostragem, perdas, coletores, SNMP, o banco de dados de países e redes, o logotipo e **Nomes** | +| Configurações | Equipamentos, amostragem, as interfaces que cada equipamento amostra e se ele envia flowDirection, perdas, coletores, SNMP, o banco de dados de países e redes, o logotipo e **Nomes** | | Conferência de interfaces | Tráfego de cada interface ao longo do tempo em bits/s e, abaixo, pacotes/s, entrada (verde) e saída (azul), com os contadores do equipamento como linhas tracejadas; quanto os números de fluxo se afastam dos contadores, piores primeiro, com os motivos; um nome, um rótulo e a padrão para cada interface | | Registros de fluxo | Quantos registros de fluxo houve e quando (uma barra por intervalo), e os próprios registros, dos mais recentes para os mais antigos, página a página, com colunas selecionáveis. Abre nos últimos 15 minutos, atualizados a cada 5 segundos; aberta a partir de um valor em outra página (**Ver os registros de fluxo**), mantém o intervalo de tempo daquela página, e **Voltar ao tempo real** volta | | Limpeza de dados | Apaga dados com mais de 120, 90, 60, 30 ou 7 dias, ou todos, mostrando quanto cada opção libera ([mais](#13-data-backup-upgrade-uninstall)) | @@ -738,7 +755,8 @@ Acima das páginas de tráfego (Visão geral, Top 66, Detalhes do tráfego, Caminhos do tráfego, Geografia e redes, Registros de fluxo e o detalhe de um valor) fica **Interface**: **Todas as interfaces**, ou uma interface, para que essas páginas mostrem só o tráfego que passa por ela (entrando ou -saindo). Começa na interface padrão (★, definida em **Conferência de +saindo). Lista as interfaces amostradas, agrupadas por equipamento, e +começa na interface padrão (★, definida em **Conferência de interfaces**) e a escolha faz parte do link. Detecções, Ameaças, Conferência de interfaces e Configurações sempre cobrem todo o tráfego. Para uma interface em 7 ou 30 dias, as páginas leem os registros de fluxo diff --git a/docs/README.ru.md b/docs/README.ru.md index f2b4837..cf3386f 100644 --- a/docs/README.ru.md +++ b/docs/README.ru.md @@ -565,6 +565,21 @@ sFlow ограничен по скорости, поэтому сэмплиру полосу пропускания. И то и другое сразу сохраняется в строку `iface` в разделе **Названия**. +В записях потоков указаны два интерфейса: тот, через который пакет вошёл, и +тот, через который вышел. Поэтому устройство, которое делает выборку только на +части интерфейсов, показывает и другие концы их потоков. Эти **встречные +интерфейсы** перечислены последними, мелким серым шрифтом, под отдельным +заголовком: их числа содержат только трафик, прошедший через интерфейс с +выборкой, а не весь их трафик. В выборе **Интерфейс** над страницами их нет. +traffic66 узнаёт, какой интерфейс сделал выборку потока, по источнику данных +sFlow или по полю flowDirection (IPFIX 61) в NetFlow v9 и IPFIX (ingress: +входной интерфейс, egress: выходной). Без этого поля интерфейсом с выборкой +считается тот, через который идёт не менее 90% трафика устройства; если такого +нет, никакой интерфейс не отмечается. **Настройки** показывают для каждого +устройства интерфейсы с выборкой и то, есть ли в его шаблонах flowDirection (61). +Чтобы видеть весь трафик устройства, делайте выборку на входе каждого +интерфейса (см. [Отправка потоков с устройств](#4-send-flows-from-your-devices)). + ![Сверка интерфейсов: трафик каждого интерфейса и оценка по потокам рядом со счётчиком устройства](images/interfaces.png) Откуда взять счётчики для сравнения: @@ -715,7 +730,7 @@ curl -L https://www.spamhaus.org/drop/drop.txt -o /threats/spamh | Обнаружения | Что требует внимания: сканирования, подбор паролей, боковое перемещение, необычные выгрузки, флуд и трафик со списков угроз ([подробнее](#findings)) | | Угрозы | Хосты, обращавшиеся к адресам из ваших списков угроз, и сколько они отправили | | География и сети | Карта мира с трафиком по странам и линиями от ваших сетей; сети (AS), откуда трафик пришёл и куда ушёл, во времени в бит/с и пакетах/с; трафик по странам и по сетям | -| Настройки | Устройства, сэмплирование, потери, коллекторы, SNMP, база стран и сетей, логотип и **Названия** | +| Настройки | Устройства, сэмплирование, интерфейсы с выборкой на каждом устройстве и отправляет ли оно flowDirection, потери, коллекторы, SNMP, база стран и сетей, логотип и **Названия** | | Сверка интерфейсов | Трафик каждого интерфейса во времени в бит/с и ниже в пакетах/с, вход (зелёный) и выход (синий), со счётчиками устройства пунктиром; насколько цифры по потокам расходятся со счётчиками, худшие сверху, с причинами; имя, метка и выбор основного для каждого интерфейса | | Записи потоков | Сколько было записей потоков и когда (столбик на интервал), и сами записи, новые сверху, постранично, с выбором столбцов. Открывается на последних 15 минутах с обновлением каждые 5 секунд; если открыть её со значения на другой странице (**Показать записи потоков**), сохраняется период той страницы, а **Вернуться к реальному времени** возвращает обратно | | Очистка данных | Удаляет данные старше 120, 90, 60, 30 или 7 дней или все данные и показывает, сколько места освобождает каждый вариант ([подробнее](#13-data-backup-upgrade-uninstall)) | @@ -730,7 +745,8 @@ curl -L https://www.spamhaus.org/drop/drop.txt -o /threats/spamh Над страницами трафика (Обзор, Топ 66, Детали трафика, Пути трафика, География и сети, Записи потоков и страница значения) находится **Интерфейс**: **Все интерфейсы** или один интерфейс, чтобы эти страницы показывали только трафик -через него (вход или выход). Сначала выбран основной интерфейс (★, задаётся +через него (вход или выход). В нём перечислены интерфейсы с выборкой, +сгруппированные по устройствам; сначала выбран основной интерфейс (★, задаётся на странице **Сверка интерфейсов**), и выбор входит в ссылку. Обнаружения, Угрозы, Сверка интерфейсов и Настройки всегда охватывают весь трафик. Для одного интерфейса за 7 или 30 дней страницы читают записи потоков, а не diff --git a/docs/README.ur.md b/docs/README.ur.md index d2dc99f..7a03b91 100644 --- a/docs/README.ur.md +++ b/docs/README.ur.md @@ -556,6 +556,21 @@ interface (**★**) بناتا ہے؛ ڈیفالٹ ایک ہی ہوتا ہے۔ ([web UI کا استعمال](#9-using-the-web-ui) میں **انٹرفیس** کا انتخاب دیکھیں)، اور جائزہ اس کی bandwidth دکھاتا ہے۔ دونوں فوراً **نام** میں `iface` لائن میں محفوظ ہو جاتے ہیں۔ +Flow records میں دو interfaces ہوتے ہیں: جس پر packet آیا اور جس سے وہ باہر گیا۔ +اس لیے جو ڈیوائس صرف کچھ interfaces کو سیمپل کرتی ہے، وہ ان کے flows کے دوسرے +سرے بھی دکھاتی ہے۔ یہ **مخالف سرے کے انٹرفیس** آخر میں، چھوٹے سرمئی حروف میں، +اپنی الگ سرخی کے نیچے دکھائے جاتے ہیں: ان کے اعداد میں صرف وہ ٹریفک ہے جو کسی +سیمپل والے interface سے گزری، ان کی پوری ٹریفک نہیں۔ صفحات کے اوپر **انٹرفیس** +میں یہ پیش نہیں کیے جاتے۔ traffic66 جانتا ہے کہ کس interface نے flow سیمپل کیا: +sFlow کے data source سے، یا NetFlow v9 اور IPFIX کے flowDirection field (IPFIX +61) سے (ingress: input interface، egress: output interface)۔ یہ field نہ ہو تو +جو interface ڈیوائس کی کم از کم 90% ٹریفک میں ہو، اسے سیمپل والا مانا جاتا ہے؛ +ایسا کوئی نہ ہو تو کوئی interface نشان زد نہیں ہوتا۔ **ترتیبات** ہر ڈیوائس کے +**سیمپل انٹرفیس** دکھاتی ہیں، اور یہ کہ اس کے templates **flowDirection (61) کے +ساتھ** ہیں یا نہیں۔ ڈیوائس کی پوری ٹریفک دیکھنے کے لیے ہر interface کو inbound +سیمپل کریں ([اپنی ڈیوائسز سے flows بھیجیں](#4-send-flows-from-your-devices) +دیکھیں)۔ + ![انٹرفیس جانچ: ہر interface کی ٹریفک، اور ڈیوائس کے counter کے ساتھ flow کا اندازہ](images/interfaces.png) موازنے کے لیے counters حاصل کرنے کے لیے: @@ -703,7 +718,7 @@ application، ملک، ڈیوائس — پر کلک کیا جا سکتا ہے: | مشتبہ سرگرمی | کس چیز پر توجہ چاہیے: scans، پاس ورڈ کا اندازہ، lateral movement، غیر معمولی uploads، floods اور threat list والی ٹریفک ([مزید](#findings)) | | خطرے کی معلومات | وہ hosts جنہوں نے آپ کی threat lists کے addresses سے بات کی، اور کتنا بھیجا | | مقامات اور نیٹ ورک | ملک کے لحاظ سے ٹریفک کا دنیا کا نقشہ، آپ کے نیٹ ورکس سے لکیروں کے ساتھ؛ وہ نیٹ ورکس (AS) جہاں سے ٹریفک آئی اور جہاں گئی، وقت کے ساتھ bits/s اور packets/s میں؛ ملک کے حساب سے اور نیٹ ورک کے حساب سے ٹریفک | -| ترتیبات | ڈیوائسز، sampling، loss، collectors، SNMP، ممالک اور نیٹ ورکس کا ڈیٹابیس، لوگو، اور **نام** | +| ترتیبات | ڈیوائسز، sampling، ہر ڈیوائس کے سیمپل انٹرفیس اور آیا وہ flowDirection بھیجتی ہے، loss، collectors، SNMP، ممالک اور نیٹ ورکس کا ڈیٹابیس، لوگو، اور **نام** | | انٹرفیس جانچ | وقت کے ساتھ ہر interface کی ٹریفک bits/s میں اور، نیچے، packets/s میں، ingress (سبز) اور egress (نیلا)، ڈیوائس کے counters ڈیشڈ لکیروں کی صورت میں؛ flow کے اعداد counters سے کتنے دور ہیں، بدترین پہلے، وجوہات کے ساتھ؛ ہر interface کے لیے ایک نام، ایک ٹیگ اور ڈیفالٹ | | فلو ریکارڈ | کتنے flow records تھے اور کب (ہر interval کے لیے ایک bar)، اور خود records، نئے پہلے، صفحہ بہ صفحہ، منتخب کیے جا سکنے والے columns کے ساتھ۔ آخری 15 منٹ پر کھلتا ہے، ہر 5 سیکنڈ میں اپ ڈیٹ ہوتا ہے؛ کسی دوسرے صفحے کی value سے (**اس کے فلو ریکارڈ دکھائیں**) کھولا جائے تو اس صفحے کی وقت کی حد برقرار رکھتا ہے، اور **لائیو پر واپس** دوبارہ لائیو پر لے آتا ہے | | ڈیٹا کی صفائی | 120، 90، 60، 30 یا 7 دن سے پرانا ڈیٹا، یا سارا ڈیٹا حذف کرتا ہے، اور بتاتا ہے کہ ہر انتخاب کتنی جگہ خالی کرتا ہے ([مزید](#13-data-backup-upgrade-uninstall)) | @@ -716,8 +731,8 @@ application، ملک، ڈیوائس — پر کلک کیا جا سکتا ہے: ٹریفک کے صفحات (جائزہ، ٹاپ 66، ٹریفک کی تفصیل، ٹریفک کے راستے، مقامات اور نیٹ ورک، فلو ریکارڈ اور کسی value کی تفصیل) کے اوپر **انٹرفیس** ہے: **تمام انٹرفیس**، یا ایک -interface، تاکہ یہ صفحات صرف اس سے گزرنے والی ٹریفک (اندر یا باہر) دکھائیں۔ یہ -ڈیفالٹ interface (★، **انٹرفیس جانچ** پر مقرر) سے شروع ہوتا ہے اور یہ انتخاب link +interface، تاکہ یہ صفحات صرف اس سے گزرنے والی ٹریفک (اندر یا باہر) دکھائیں۔ اس میں +سیمپل انٹرفیس ڈیوائس کے لحاظ سے گروپ کر کے دکھائے جاتے ہیں، اور یہ ڈیفالٹ interface (★، **انٹرفیس جانچ** پر مقرر) سے شروع ہوتا ہے اور یہ انتخاب link کا حصہ ہے۔ مشتبہ سرگرمی، خطرے کی معلومات، انٹرفیس جانچ اور ترتیبات ہمیشہ پوری ٹریفک دکھاتے ہیں۔ 7 یا 30 دن کے لیے ایک interface چننے پر صفحات گھنٹہ وار اور روزانہ summaries کی بجائے flow records پڑھتے ہیں، اس لیے زیادہ وقت لیتے ہیں اور diff --git a/docs/README.zh.md b/docs/README.zh.md index 02ebab1..3e5add2 100644 --- a/docs/README.zh.md +++ b/docs/README.zh.md @@ -464,6 +464,8 @@ softflowd -i eth0 -n 192.0.2.50:2055 -v 9 -t maxlife=60 列表的每一行有两个按钮。**✎** 给接口起名字并加一个简短标识(如 *uplink*),在所有地方都显示在它的名称旁边。**☆** 把它设为默认接口(**★**);默认接口只有一个。之后各页面打开时就看它(见 [使用 Web 界面](#9-using-the-web-ui) 中的 **接口** 选项),概览也会显示它的带宽。两者都会立即保存到 **名称** 中的 `iface` 行。 +流记录会标出两个接口:报文进入的接口和离开的接口。因此,只在部分接口上采样的设备,也会显示这些流另一端的接口。这些 **对端接口** 列在最后,字号更小、呈灰色,并有单独的标题:它们的数值只包含经过采样接口的流量,而不是它们的全部流量。页面上方的 **接口** 中不提供它们。traffic66 通过 sFlow 的数据源,或 NetFlow v9 和 IPFIX 的 flowDirection 字段(IPFIX 61)(ingress:入接口,egress:出接口)得知流是由哪个接口采样的。没有该字段时,承载设备至少 90% 流量的接口被视为采样接口;没有这样的接口时,不标记任何接口。**设定** 中按设备显示采样接口,以及其模板是否带方向字段(61)。要看到设备的全部流量,请在每个接口上做入向采样(见 [在设备上配置流导出](#4-send-flows-from-your-devices))。 + ![接口对账:每个接口的流量,以及流量估算值与设备计数器并列对比](images/interfaces.png) 获取用于比对的计数器: @@ -572,7 +574,7 @@ curl -L https://www.spamhaus.org/drop/drop.txt -o /threats/spamh | 发现 | 哪些需要处理:扫描、暴力破解、横向移动、异常上传、泛洪和威胁情报流量([详见](#findings)) | | 威胁情报 | 与威胁情报列表中地址有通信的主机,以及它们发送了多少流量 | | 地理与运营商 | 世界地图上按国家显示的流量,并有从你的网段出发的连线;流量来自和去往哪些网络(AS),以 bits/s 和 packets/s 显示随时间的变化;按国家和按网络统计的流量 | -| 设定 | 设备、采样、丢包、采集器、SNMP、国家和运营商数据库、Logo,以及 **名称** | +| 设定 | 设备、采样、各设备的采样接口及其是否发送 flowDirection、丢包、采集器、SNMP、国家和运营商数据库、Logo,以及 **名称** | | 接口对账 | 每个接口的流量随时间变化,单位为 bits/s,下方为 packets/s,入向(绿色)和出向(蓝色),设备计数器以虚线显示;以及流统计与计数器相差多少,差异最大的在前,附原因;每个接口的名称、标识以及默认接口 | | 流记录 | 有多少条流记录、出现在什么时候(每个间隔一根柱),以及流记录本身,最新的在前,分页显示,可选择显示列。打开时显示最近 15 分钟,每 5 秒更新;从其他页面的某个值打开(**看它的流记录**)时沿用该页面的时间范围,**回到实时** 可返回 | | 数据清理 | 删除早于 120、90、60、30 或 7 天的数据,或全部数据,并显示每种选择能腾出多少空间([详见](#13-data-backup-upgrade-uninstall)) | @@ -580,7 +582,7 @@ curl -L https://www.spamhaus.org/drop/drop.txt -o /threats/spamh 侧边菜单把页面分为四组:流量(概览、Top 66、流量明细、流向、接口对账)、安全(发现、威胁情报、地理与运营商)、配置与数据(设定、流记录、数据清理)以及离线 pcap 分析。Logo 下方显示版本号以及服务器的日期和时间。 -流量类页面(概览、Top 66、流量明细、流向、地理与运营商、流记录以及某个值的详情页)上方有 **接口**:**全部接口**,或某一个接口,这样这些页面只显示经过该接口(进或出)的流量。初始为默认接口(★,在 **接口对账** 中设置),所选接口也包含在链接中。发现、威胁情报、接口对账和设定始终覆盖全部流量。单个接口选 7 天或 30 天时,页面读取的是流明细而不是小时和每日汇总,因此耗时更长,且最远只能回溯到流明细的保留期限(默认 30 天)。 +流量类页面(概览、Top 66、流量明细、流向、地理与运营商、流记录以及某个值的详情页)上方有 **接口**:**全部接口**,或某一个接口,这样这些页面只显示经过该接口(进或出)的流量。其中按设备分组列出采样接口,初始为默认接口(★,在 **接口对账** 中设置),所选接口也包含在链接中。发现、威胁情报、接口对账和设定始终覆盖全部流量。单个接口选 7 天或 30 天时,页面读取的是流明细而不是小时和每日汇总,因此耗时更长,且最远只能回溯到流明细的保留期限(默认 30 天)。 页面上方有:时间范围(15 分钟到 30 天,或 **自定义…** 任意指定开始和结束时间,也可以早于 30 天)、每 30 秒自动刷新,以及**复制链接**——复制一个精确指向当前视图(页面、时间范围和过滤条件)的链接,方便发给同事。在 **Top 66** 和 **流量明细** 中,**设备**、**客户端**、**服务端** 和 **服务** 列出该时间范围内流量最大的值:选择或输入一个值即可过滤;过滤条件随后对所有页面生效,直到清空输入框。界面语言跟随浏览器设置,可在菜单底部、**退出登录** 上方切换。设定、流记录(实时显示时)、数据清理和离线 pcap 分析没有时间范围。 diff --git a/internal/collector/collector.go b/internal/collector/collector.go index cbae113..4c9d6d1 100644 --- a/internal/collector/collector.go +++ b/internal/collector/collector.go @@ -311,6 +311,8 @@ type SourceInfo struct { // NetFlow/IPFIX: the templates received (id and field ids), shown when // the sampling rate is not declared TemplateInfo []string `json:"template_info,omitempty"` + // NetFlow/IPFIX: whether the templates carry flowDirection ("yes"/"no") + DirField string `json:"dir_field,omitempty"` } // Sources lists every exporter seen. @@ -340,7 +342,7 @@ func (c *Collector) Sources() []SourceInfo { Packets: s.Packets, Records: s.Records, LostPct: lost, LostRecords: s.LostRecords, TransitPct: lost, Sampling: samp, SamplingState: s.SamplingState, Pending: s.Pending, NoTemplate: s.NoTemplate, Templates: s.Templates, LastSeen: s.LastSeen, ClockSkew: s.ClockSkew, LossComp: s.LossComp, - TemplateInfo: s.TemplateInfo, + TemplateInfo: s.TemplateInfo, DirField: s.DirField, }) } c.mu.Lock() diff --git a/internal/decode/nf/decoder.go b/internal/decode/nf/decoder.go index 9b8f5c0..50f686c 100644 --- a/internal/decode/nf/decoder.go +++ b/internal/decode/nf/decoder.go @@ -32,6 +32,10 @@ type Stats struct { Rates []uint32 // every declared rate (exporter, sampler, interface) Templates int TemplateInfo []string // the templates seen and their field ids + // DirField: "yes" when the data templates carry flowDirection (61), so + // the interface each flow was sampled on is known; "no" when they do + // not; "" before any data template. + DirField string Manual bool // the rate was set by hand (sampling= in the names) // LossComp is the multiplier currently applied to make up for records // lost in transit (1 = no loss). @@ -94,6 +98,7 @@ type session struct { pending []pendingRec tmplDesc map[uint16]string // templates seen, for the sources page + tmplDir map[uint16]bool // data templates: whether they carry flowDirection initMs int64 @@ -206,6 +211,13 @@ func (d *Decoder) Stats() []Stats { st.TemplateInfo = append(st.TemplateInfo, v) } sort.Strings(st.TemplateInfo) + for _, d := range s.tmplDir { + if d { + st.DirField = "yes" + break + } + st.DirField = "no" + } if s.def == 0 && len(s.bySampler) == 0 && len(s.byIf) == 0 && d.Manual[s.stats.Exporter] > 0 { st.Manual = true st.Sampling = d.Manual[s.stats.Exporter] diff --git a/internal/decode/nf/fields.go b/internal/decode/nf/fields.go index caf8835..308732a 100644 --- a/internal/decode/nf/fields.go +++ b/internal/decode/nf/fields.go @@ -545,6 +545,14 @@ func (s *session) describe(id uint16, t *template) { } if s.tmplDesc == nil { s.tmplDesc = map[uint16]string{} + s.tmplDir = map[uint16]bool{} } s.tmplDesc[id] = b.String() + if !t.options { + dir := false + for _, f := range t.fields { + dir = dir || f.ent == 0 && f.id == ieDirection + } + s.tmplDir[id] = dir + } } diff --git a/internal/pipeline/pipeline.go b/internal/pipeline/pipeline.go index b128be5..58a69f6 100644 --- a/internal/pipeline/pipeline.go +++ b/internal/pipeline/pipeline.go @@ -320,6 +320,7 @@ func (p *Pipeline) process(r *flow.Record) { } key := dkey{src, dst, r.SrcPort, r.DstPort, r.Proto} org2 := origin{r.Exporter, r.Domain, r.Observation, r.InIf, r.OutIf, r.Direction} + obsIf := observedIf(r) slices := minuteSlices(r.Start, r.End) var bLeft, wLeft, pLeft = l3, wire, pkts @@ -339,6 +340,7 @@ func (p *Pipeline) process(r *flow.Record) { } row.Dup = p.isDup(sl.t, key, org2) p.batch = append(p.batch, row) + p.noteObs(&row, obsIf) if row.Dup { p.DupRows.Add(1) continue @@ -437,6 +439,38 @@ func (p *Pipeline) isDup(t time.Time, k dkey, o origin) bool { return prev != oh } +// observedIf is the interface a flow was sampled on: the sFlow data source +// when it is an interface, else the ingress or egress interface as the +// exporter's flowDirection says; 0 when it cannot be told. +func observedIf(r *flow.Record) uint32 { + switch { + case r.Observation != 0 && r.Observation>>24 == 0: + return r.Observation & 0xFFFFFF + case r.Direction == 0: + return r.InIf + case r.Direction == 1: + return r.OutIf + } + return 0 +} + +// noteObs counts each row, duplicates included, under the interface it was +// sampled on (dim obsif, "exporter/ifindex"), or under its exporter when that +// is unknown (dim obsunk). The interface list uses it to tell the sampled +// interfaces from the ones only seen as the other end of their flows. +func (p *Pipeline) noteObs(r *store.Row, obsIf uint32) { + c := store.Counters{Bytes: r.Bytes, Wire: r.Wire, Pkts: r.Pkts, Flows: uint64(r.Flows)} + k := store.DimKey{TS: r.TS.Truncate(time.Hour), Dim: "obsunk", Val: r.Exporter} + if obsIf != 0 { + k.Dim, k.Val = "obsif", r.Exporter+"/"+strconv.FormatUint(uint64(obsIf), 10) + } + if v := p.rDim[k]; v != nil { + v.Add(c) + } else { + p.rDim[k] = &c + } +} + func (p *Pipeline) rollup(r *store.Row, hasPeer bool) { c := store.Counters{Bytes: r.Bytes, Wire: r.Wire, Pkts: r.Pkts, Flows: uint64(r.Flows)} add := func(m map[store.DimKey]*store.Counters, k store.DimKey) { diff --git a/internal/sim/sim.go b/internal/sim/sim.go index 97e5562..51988ea 100644 --- a/internal/sim/sim.go +++ b/internal/sim/sim.go @@ -472,7 +472,7 @@ func v9Values(r flow.Record, now time.Time, uptime uint32) encode.Values { return encode.Values{encode.A(r.Src), encode.A(r.Dst), encode.U(uint64(r.SrcPort), 2), encode.U(uint64(r.DstPort), 2), encode.U(uint64(r.Proto), 1), encode.U(uint64(r.TCPFlags), 1), encode.U(r.Bytes, 4), encode.U(r.Packets, 4), encode.U(uint64(first), 4), encode.U(uint64(last), 4), encode.U(uint64(r.InIf), 2), encode.U(uint64(r.OutIf), 2), - encode.U(1, 1), encode.U(0, 1)} + encode.U(1, 1), encode.U(uint64(r.Direction), 1)} } var ipfixDataTmpl = encode.Template{ID: 400, Fields: []encode.Field{ diff --git a/internal/store/peer_test.go b/internal/store/peer_test.go new file mode 100644 index 0000000..2d0f9e5 --- /dev/null +++ b/internal/store/peer_test.go @@ -0,0 +1,56 @@ +package store + +import ( + "strconv" + "testing" + "time" +) + +// A device sampling one interface (in and out): the other interfaces of its +// flows are peers. A device saying which interface sampled each flow: only +// those are sampled. +func TestPeers(t *testing.T) { + s, err := Open(Options{Dir: t.TempDir(), Threads: 1}) + if err != nil { + t.Fatal(err) + } + defer s.Close() + ts := time.Now().UTC().Truncate(time.Hour).Add(-30 * time.Minute) + row := func(exp string, in, out uint32, w uint64) Row { + return Row{TS: ts, Exporter: exp, InIf: in, OutIf: out, Wire: w, Bytes: w, Pkts: 1, Flows: 1} + } + rows := []Row{ + row("10.0.0.5", 10, 34, 500), row("10.0.0.5", 10, 30, 300), row("10.0.0.5", 26, 10, 200), row("10.0.0.5", 22, 10, 100), + row("10.0.0.6", 1, 2, 400), row("10.0.0.6", 2, 3, 400), row("10.0.0.6", 3, 1, 400), + } + if err := s.AppendRows(rows); err != nil { + t.Fatal(err) + } + h := ts.Truncate(time.Hour) + dim := map[DimKey]*Counters{ + {TS: h, Dim: "obsunk", Val: "10.0.0.5"}: {Wire: 1100}, + {TS: h, Dim: "obsif", Val: "10.0.0.6/1"}: {Wire: 400}, + {TS: h, Dim: "obsif", Val: "10.0.0.6/2"}: {Wire: 400}, + } + if err := s.AppendRollups(nil, nil, dim); err != nil { + t.Fatal(err) + } + list, err := s.Interfaces(Query{From: ts.Add(-time.Hour), To: ts.Add(time.Hour)}) + if err != nil { + t.Fatal(err) + } + want := map[string]bool{"10.0.0.5/10": false, "10.0.0.5/34": true, "10.0.0.5/30": true, "10.0.0.5/26": true, "10.0.0.5/22": true, + "10.0.0.6/1": false, "10.0.0.6/2": false, "10.0.0.6/3": true} + if len(list) != len(want) { + t.Fatalf("%d interfaces, want %d", len(list), len(want)) + } + for _, f := range list { + k := f.Exporter + "/" + strconv.FormatUint(uint64(f.IfIndex), 10) + if f.Peer != want[k] { + t.Errorf("%s peer=%v", k, f.Peer) + } + } + if list[len(list)-1].Peer != true || list[0].Peer { + t.Error("peers not last") + } +} diff --git a/internal/store/recon.go b/internal/store/recon.go index dc227c6..a0754af 100644 --- a/internal/store/recon.go +++ b/internal/store/recon.go @@ -4,6 +4,8 @@ import ( "fmt" "math" "sort" + "strconv" + "strings" "time" ) @@ -15,6 +17,10 @@ type IfaceInfo struct { Counters bool `json:"counters"` InWire uint64 `json:"in_wire"` OutWire uint64 `json:"out_wire"` + // Peer: flows were not sampled on this interface; it is only the other + // end of flows sampled on another interface of the device, so its + // numbers hold only the traffic that went through that interface. + Peer bool `json:"peer,omitempty"` } // Interfaces lists interfaces seen in the range, busiest first. @@ -62,11 +68,17 @@ func (s *Store) Interfaces(q Query) ([]IfaceInfo, error) { } rows.Close() } + if err := s.markPeers(q, src, m); err != nil { + return nil, err + } out := make([]IfaceInfo, 0, len(m)) for _, f := range m { out = append(out, *f) } sort.Slice(out, func(i, j int) bool { + if out[i].Peer != out[j].Peer { + return !out[i].Peer + } if out[i].Counters != out[j].Counters { return out[i].Counters } @@ -236,3 +248,89 @@ func minT(a, b time.Time) time.Time { } return b } + +// markPeers marks the interfaces of each device that flows were not sampled +// on. Where the device says which interface sampled a flow (sFlow data +// source, NetFlow/IPFIX flowDirection), those interfaces are the sampled +// ones. For flows where it does not, an interface on at least 90% of the +// device's traffic is taken as the sampled one (a device sampling a single +// interface); when there is none, nothing is marked. +func (s *Store) markPeers(q Query, src string, m map[string]*IfaceInfo) error { + from, to := q.From.UTC().Truncate(time.Hour), q.To.UTC() + known := map[string]map[uint32]bool{} // exporter → sampled interfaces + unk := map[string]uint64{} // exporter → traffic with no sampled interface + var knownWire = map[string]uint64{} + rows, err := s.DB.Query(`SELECT dim, val, sum(wire) FROM r_dim WHERE ts >= ? AND ts < ? AND dim IN ('obsif', 'obsunk') GROUP BY 1,2`, from, to) + if err != nil { + return err + } + for rows.Next() { + var dim, val string + var w uint64 + if err := rows.Scan(&dim, &val, &w); err != nil { + rows.Close() + return err + } + if dim == "obsunk" { + unk[val] += w + continue + } + i := strings.LastIndexByte(val, '/') + idx, err := strconv.ParseUint(val[i+1:], 10, 32) + if i < 0 || err != nil || w == 0 { + continue + } + e := val[:i] + if known[e] == nil { + known[e] = map[uint32]bool{} + } + known[e][uint32(idx)] = true + knownWire[e] += w + } + rows.Close() + // device totals, for interfaces seen on nearly all of a device's traffic + tot := map[string]uint64{} + rows, err = s.DB.Query(fmt.Sprintf(`SELECT exporter, sum(wire) FROM %s WHERE ts >= ? AND ts < ? GROUP BY 1`, src), q.From.UTC(), q.To.UTC()) + if err != nil { + return err + } + for rows.Next() { + var e string + var w uint64 + if err := rows.Scan(&e, &w); err != nil { + rows.Close() + return err + } + tot[e] = w + } + rows.Close() + byExp := map[string][]*IfaceInfo{} + for _, f := range m { + if f.InWire+f.OutWire > 0 { + byExp[f.Exporter] = append(byExp[f.Exporter], f) + } + } + for e, fs := range byExp { + sampled := map[uint32]bool{} + for i := range known[e] { + sampled[i] = true + } + // traffic not attributed to an interface (older data, or no + // direction field): fall back to the 90% rule + if knownWire[e] == 0 || unk[e] > knownWire[e]/20 { + found := false + for _, f := range fs { + if t := tot[e]; t > 0 && float64(f.InWire+f.OutWire) >= 0.9*float64(t) { + sampled[f.IfIndex], found = true, true + } + } + if !found { + continue // cannot be told: mark nothing + } + } + for _, f := range fs { + f.Peer = !sampled[f.IfIndex] + } + } + return nil +} diff --git a/internal/web/static/app.css b/internal/web/static/app.css index 7f97196..ff3ae12 100644 --- a/internal/web/static/app.css +++ b/internal/web/static/app.css @@ -361,3 +361,7 @@ label.btn.disabled{opacity:.5;cursor:not-allowed!important} .ifform{display:grid;grid-template-columns:1fr 120px auto auto;gap:6px;padding:8px 10px;background:var(--surface-2);border-radius:8px;margin:2px 0 6px} .ifform input{border:1px solid var(--line-2);border-radius:6px;padding:5px 8px;background:var(--surface);color:var(--ink);min-width:0} .iflist .ifstar,.iflist .ifedit,.iflist .ifform button{width:auto;flex:none;justify-content:center} +.iflist .ifpeers{margin:10px 8px 4px;padding-top:8px;border-top:1px solid var(--line);font-size:11.5px;color:var(--ink-3)} +.iflist .ifrow.peer>button:first-child{font-size:12px;color:var(--ink-3)} +.iflist .ifrow.peer>button:first-child .muted{font-size:10.5px!important} +.iflist .ifrow.peer>button:first-child .st{font-size:11px;opacity:.75} diff --git a/internal/web/static/app.js b/internal/web/static/app.js index 68c3604..9cd1779 100644 --- a/internal/web/static/app.js +++ b/internal/web/static/app.js @@ -216,10 +216,15 @@ async function renderIfsel() { const d = await loadIfaces(), list = d.ifaces || []; if (state.ifv === undefined) state.ifv = d.default || 'all'; const key = f => f.exporter + '/' + f.ifindex; - const opts = [['all', t('if.all')], ...list.map(f => [key(f), (f.default ? '★ ' : '') + ifName(f) + (f.tag ? ' [' + f.tag + ']' : ''), (f.device || f.exporter) + ' · ' + f.ifindex])]; - if (state.ifv !== 'all' && !list.some(f => key(f) === state.ifv)) opts.push([state.ifv, state.ifv]); + const opt = (v, l, tt) => ``; + // sampled interfaces only, grouped by device; a peer only when it is the choice + const shown = list.filter(f => !f.peer || f.default || key(f) === state.ifv), groups = new Map(); + shown.forEach(f => { const g = f.device || f.exporter; if (!groups.has(g)) groups.set(g, []); groups.get(g).push(f); }); + let html = opt('all', t('if.all')); + groups.forEach((fs, g) => { html += `${fs.map(f => opt(key(f), (f.default ? '★ ' : '') + ifName(f) + (f.tag ? ' [' + f.tag + ']' : ''), (f.device || f.exporter) + ' · ' + f.ifindex)).join('')}`; }); + if (state.ifv !== 'all' && !list.some(f => key(f) === state.ifv)) html += opt(state.ifv, state.ifv); const sel = $('#ifsel'); - sel.innerHTML = opts.map(([v, l, tt]) => ``).join(''); + sel.innerHTML = html; sel.value = state.ifv; sel.classList.toggle('on', state.ifv !== 'all'); sel.title = sel.selectedOptions[0]?.title || ''; @@ -536,7 +541,7 @@ views.overview = async (el) => { const [d, ifs, fd] = await Promise.all([api('overview', {}, od ? [...state.f, {f: 'dir', v: od, neg: false}] : state.f), inSB() ? null : loadIfaces(), api('findings', {limit: 3}).catch(() => null)]); // the interface chart: the interface picked at the top, else the default, else the busiest const ifl = ifs?.ifaces || [], ikey = f => f.exporter + '/' + f.ifindex; - const ifk = state.ifv && state.ifv !== 'all' ? state.ifv : (ifs?.default || (ifl[0] ? ikey(ifl[0]) : '')); + const ifk = state.ifv && state.ifv !== 'all' ? state.ifv : (ifs?.default || ((ifl.find(f => !f.peer) || ifl[0]) ? ikey(ifl.find(f => !f.peer) || ifl[0]) : '')); const ifSel = ifl.find(f => ikey(f) === ifk); const [iIn, iOut] = ifk && !inSB() ? await Promise.all(['if_in', 'if_out'].map(by => api('series', {by, measure: 'wire', top: 20, dup: 1}, [...state.f, {f: 'iface', v: ifk, neg: false}]).catch(() => null))) : [null, null]; const tot = d.totals, base = d.base_totals, basis = d.basis; @@ -1287,9 +1292,9 @@ function ifVerdict(r, rc, dirIn) { views.ifaces = async (el) => { const d = await api('ifaces'); (d.ifaces || []).forEach(f => ifaceNames.set(f.exporter + '/' + f.ifindex, ifName(f) + ' · ' + (f.device || f.exporter))); - const list = (d.ifaces || []).slice().sort((a, b) => (!!b.has_counters - !!a.has_counters) || ((devKind(b) === 'warn') - (devKind(a) === 'warn'))); + const list = (d.ifaces || []).slice().sort((a, b) => (!!a.peer - !!b.peer) || (!!b.has_counters - !!a.has_counters) || ((devKind(b) === 'warn') - (devKind(a) === 'warn'))); if (!list.length) { el.innerHTML = `
${t('empty.nodata')}
`; return; } - if (!state.ifc || !list.some(f => f.exporter === state.ifc.exporter && f.ifindex === state.ifc.ifindex)) { const d = list.find(f => f.default) || list[0]; state.ifc = {exporter: d.exporter, ifindex: d.ifindex}; } + if (!state.ifc || !list.some(f => f.exporter === state.ifc.exporter && f.ifindex === state.ifc.ifindex)) { const d = list.find(f => f.default) || list.find(f => !f.peer) || list[0]; state.ifc = {exporter: d.exporter, ifindex: d.ifindex}; } const key = state.ifc.exporter + '/' + state.ifc.ifindex, sel = list.find(f => f.exporter === state.ifc.exporter && f.ifindex === state.ifc.ifindex); // one device's interface: count everything it saw, also traffic another device reported too const fil = [...state.f, {f: 'iface', v: key, neg: false}]; @@ -1300,13 +1305,14 @@ views.ifaces = async (el) => { const r = rc.recon || {}, ctr = !!r.has_counters; const leg = withCtr => `
${t('if.in')}${t('if.out')}${withCtr ? `${t('if.counter')}` : ''}
`; el.innerHTML = `
- ${panel('c12', `${esc(name)} · ${t('ch.bps')}`, '', `
${leg(ctr)}`)} + ${panel('c12', `${esc(name)} · ${t('ch.bps')}`, sel.peer ? esc(t('if.peer_note')) : '', `
${leg(ctr)}`)} ${panel('c12', `${esc(name)} · ${t('ch.pps')}`, '', `
${leg(false)}`)}
- ${panel('c4', t('if.title'), t('if.sub'), `
${list.map(f => { + ${panel('c4', t('if.title'), t('if.sub'), `
${list.map((f, i) => { const k = devKind(f), cur = f.exporter === state.ifc.exporter && f.ifindex === state.ifc.ifindex, id = esc(f.exporter + '/' + f.ifindex); - return `
-
+ const head = f.peer && !list[i - 1]?.peer ? `
${esc(t('if.peers'))}
` : ''; + return `${head}
+ ${f.peer && !f.default ? '' : ``}
`; }).join('')}
`)}
`; @@ -1357,10 +1363,13 @@ views.sources = async (el) => { ['IPtoASN', 'geo.f_iptoasn', 'PDDL 1.0', 'https://iptoasn.com']]; const freeRows = FREE.map(([n, k, lic, url]) => `${n}${esc(t(k))}${lic}`).join(''); const srcs = d.sources || []; + const ifd = await loadIfaces().catch(() => ({})), sampledIf = new Map(); + (ifd.ifaces || []).filter(f => !f.peer && (f.in_wire || f.out_wire)).forEach(f => { if (!sampledIf.has(f.exporter)) sampledIf.set(f.exporter, []); sampledIf.get(f.exporter).push(ifName(f)); }); + const obsLine = s => { const l = sampledIf.get(s.exporter), dir = s.dir_field ? t('src.dir_' + s.dir_field) : ''; return l || dir ? `
${l ? esc(t('src.sampled_if', {v: l.join(', ')})) : ''}${l && dir ? ' · ' : ''}${esc(dir)}` : ''; }; const issueText = (code, s) => t('issue.' + code, {a: s.exporter, n: nf(s.pending), p: nf(code === 'agent_drops' ? s.drop_pct : code === 'loss' ? (s.transit_pct ?? s.lost_pct) : s.lost_pct, 1) + '%', s: Math.round(Math.abs(s.clock_skew_ns) / 1e9) + ' s'}); const rows = srcs.map(s => { const kind = s.status; - return `${s.name ? esc(s.name) + ' ' : ''}${esc(s.exporter)}${s.domain ? ' / ' + s.domain : ''} + return `${s.name ? esc(s.name) + ' ' : ''}${esc(s.exporter)}${s.domain ? ' / ' + s.domain : ''}${obsLine(s)} ${esc(s.proto)}${nf(s.rec_per_sec, 1)} ${s.sampling ? esc(s.sampling) : (s.sampling_state === 'waiting' ? '?' : '1:1')}${s.sampling_state === 'manual' ? ` (${esc(t('src.manual'))})` : ''}${s.effective ? ` (${esc(t('src.effective', {v: '1:' + nf(s.effective)}))})` : ''} ${nf(s.lost_pct, 2)}%${s.last_seen ? ago(Date.parse(s.last_seen)) : ''} diff --git a/internal/web/static/i18n/ar.json b/internal/web/static/i18n/ar.json index 632be85..7317999 100644 --- a/internal/web/static/i18n/ar.json +++ b/internal/web/static/i18n/ar.json @@ -509,5 +509,10 @@ "if.name_ph": "اسم الواجهة", "if.tag_ph": "وسم، مثل uplink", "if.save": "حفظ", -"ov.if_sub": "الداخل والخارج عبر هذه الواجهة (اتجاه الواجهة)" +"ov.if_sub": "الداخل والخارج عبر هذه الواجهة (اتجاه الواجهة)", +"if.peers": "واجهات الطرف الآخر (بلا أخذ عينات؛ فقط الحركة عبر الواجهة المأخوذ منها العينات)", +"if.peer_note": "واجهة الطرف الآخر: بلا عينات، فقط الحركة عبر الواجهة المأخوذ منها العينات في هذا الجهاز", +"src.sampled_if": "العينات من: {v}", +"src.dir_yes": "مع flowDirection (61)", +"src.dir_no": "بدون flowDirection (61): الواجهة مستنتجة من الحركة" } diff --git a/internal/web/static/i18n/bn.json b/internal/web/static/i18n/bn.json index 3f18f42..a150a01 100644 --- a/internal/web/static/i18n/bn.json +++ b/internal/web/static/i18n/bn.json @@ -509,5 +509,10 @@ "if.name_ph": "ইন্টারফেসের নাম", "if.tag_ph": "ট্যাগ, যেমন uplink", "if.save": "সংরক্ষণ", -"ov.if_sub": "এই ইন্টারফেসে আসা / যাওয়া (ইন্টারফেসের দিক)" +"ov.if_sub": "এই ইন্টারফেসে আসা / যাওয়া (ইন্টারফেসের দিক)", +"if.peers": "বিপরীত ইন্টারফেস (স্যাম্পল নয়; শুধু স্যাম্পল করা ইন্টারফেস দিয়ে যাওয়া ট্রাফিক)", +"if.peer_note": "বিপরীত ইন্টারফেস: স্যাম্পল নয়, শুধু এই ডিভাইসের স্যাম্পল করা ইন্টারফেস দিয়ে যাওয়া ট্রাফিক", +"src.sampled_if": "স্যাম্পল ইন্টারফেস: {v}", +"src.dir_yes": "flowDirection (61) সহ", +"src.dir_no": "flowDirection (61) ছাড়া: স্যাম্পল ইন্টারফেস ট্রাফিক থেকে অনুমান" } diff --git a/internal/web/static/i18n/en.json b/internal/web/static/i18n/en.json index d9f072c..5886d61 100644 --- a/internal/web/static/i18n/en.json +++ b/internal/web/static/i18n/en.json @@ -509,5 +509,10 @@ "if.name_ph": "Interface name", "if.tag_ph": "Tag, e.g. uplink", "if.save": "Save", -"ov.if_sub": "In and out as the interface sees it" +"ov.if_sub": "In and out as the interface sees it", +"if.peers": "Peer interfaces (not sampled; only the traffic through the sampled interface)", +"if.peer_note": "Peer interface: not sampled, only the traffic through the sampled interface of this device", +"src.sampled_if": "Sampled on: {v}", +"src.dir_yes": "with flowDirection (61)", +"src.dir_no": "without flowDirection (61): sampled interface inferred from traffic" } diff --git a/internal/web/static/i18n/es.json b/internal/web/static/i18n/es.json index 1dafaf6..383ecec 100644 --- a/internal/web/static/i18n/es.json +++ b/internal/web/static/i18n/es.json @@ -509,5 +509,10 @@ "if.name_ph": "Nombre de la interfaz", "if.tag_ph": "Etiqueta, p. ej. uplink", "if.save": "Guardar", -"ov.if_sub": "Entrada y salida de esta interfaz (sentido de la interfaz)" +"ov.if_sub": "Entrada y salida de esta interfaz (sentido de la interfaz)", +"if.peers": "Interfaces del otro extremo (sin muestreo; solo el tráfico por la interfaz muestreada)", +"if.peer_note": "Interfaz del otro extremo: sin muestreo, solo el tráfico por la interfaz muestreada de este equipo", +"src.sampled_if": "Muestreo en: {v}", +"src.dir_yes": "con flowDirection (61)", +"src.dir_no": "sin flowDirection (61): interfaz muestreada deducida del tráfico" } diff --git a/internal/web/static/i18n/fr.json b/internal/web/static/i18n/fr.json index b937c75..153825e 100644 --- a/internal/web/static/i18n/fr.json +++ b/internal/web/static/i18n/fr.json @@ -509,5 +509,10 @@ "if.name_ph": "Nom de l’interface", "if.tag_ph": "Étiquette, ex. uplink", "if.save": "Enregistrer", -"ov.if_sub": "Entrant et sortant de cette interface (sens de l’interface)" +"ov.if_sub": "Entrant et sortant de cette interface (sens de l’interface)", +"if.peers": "Interfaces d’en face (non échantillonnées ; seulement le trafic de l’interface échantillonnée)", +"if.peer_note": "Interface d’en face : non échantillonnée, seulement le trafic passé par l’interface échantillonnée de cet équipement", +"src.sampled_if": "Échantillonné sur : {v}", +"src.dir_yes": "avec flowDirection (61)", +"src.dir_no": "sans flowDirection (61) : interface échantillonnée déduite du trafic" } diff --git a/internal/web/static/i18n/hi.json b/internal/web/static/i18n/hi.json index 2f52ef5..35c8467 100644 --- a/internal/web/static/i18n/hi.json +++ b/internal/web/static/i18n/hi.json @@ -509,5 +509,10 @@ "if.name_ph": "इंटरफ़ेस का नाम", "if.tag_ph": "टैग, जैसे uplink", "if.save": "सहेजें", -"ov.if_sub": "इस इंटरफ़ेस में आना / जाना (इंटरफ़ेस की दिशा)" +"ov.if_sub": "इस इंटरफ़ेस में आना / जाना (इंटरफ़ेस की दिशा)", +"if.peers": "सामने वाले इंटरफ़ेस (सैंपल नहीं; केवल सैंपल किए इंटरफ़ेस से गुज़रा ट्रैफ़िक)", +"if.peer_note": "सामने वाला इंटरफ़ेस: सैंपल नहीं, केवल इस डिवाइस के सैंपल किए इंटरफ़ेस से गुज़रा ट्रैफ़िक", +"src.sampled_if": "सैंपल इंटरफ़ेस: {v}", +"src.dir_yes": "flowDirection (61) सहित", +"src.dir_no": "flowDirection (61) के बिना: सैंपल इंटरफ़ेस ट्रैफ़िक से अनुमानित" } diff --git a/internal/web/static/i18n/id.json b/internal/web/static/i18n/id.json index 3133a84..da6a74c 100644 --- a/internal/web/static/i18n/id.json +++ b/internal/web/static/i18n/id.json @@ -509,5 +509,10 @@ "if.name_ph": "Nama antarmuka", "if.tag_ph": "Label, mis. uplink", "if.save": "Simpan", -"ov.if_sub": "Masuk dan keluar antarmuka ini (arah antarmuka)" +"ov.if_sub": "Masuk dan keluar antarmuka ini (arah antarmuka)", +"if.peers": "Antarmuka lawan (tidak disampel; hanya trafik lewat antarmuka yang disampel)", +"if.peer_note": "Antarmuka lawan: tidak disampel, hanya trafik lewat antarmuka yang disampel di perangkat ini", +"src.sampled_if": "Disampel di: {v}", +"src.dir_yes": "dengan flowDirection (61)", +"src.dir_no": "tanpa flowDirection (61): antarmuka yang disampel ditebak dari trafik" } diff --git a/internal/web/static/i18n/ja.json b/internal/web/static/i18n/ja.json index 3fed214..8485b91 100644 --- a/internal/web/static/i18n/ja.json +++ b/internal/web/static/i18n/ja.json @@ -509,5 +509,10 @@ "if.name_ph": "インターフェース名", "if.tag_ph": "タグ(例:上流)", "if.save": "保存", -"ov.if_sub": "インターフェースの向き:この口への入り / 出" +"ov.if_sub": "インターフェースの向き:この口への入り / 出", +"if.peers": "対向インターフェース(未サンプリング:サンプリング対象を通った分のみ)", +"if.peer_note": "対向インターフェース:未サンプリング。このデバイスのサンプリング対象を通った分のみ", +"src.sampled_if": "サンプリング対象:{v}", +"src.dir_yes": "方向フィールド(61)あり", +"src.dir_no": "方向フィールド(61)なし:サンプリング対象はトラフィックから推定" } diff --git a/internal/web/static/i18n/ko.json b/internal/web/static/i18n/ko.json index 1244d3f..90763f5 100644 --- a/internal/web/static/i18n/ko.json +++ b/internal/web/static/i18n/ko.json @@ -509,5 +509,10 @@ "if.name_ph": "인터페이스 이름", "if.tag_ph": "태그(예: 업링크)", "if.save": "저장", -"ov.if_sub": "인터페이스 방향: 이 포트로 들어옴 / 나감" +"ov.if_sub": "인터페이스 방향: 이 포트로 들어옴 / 나감", +"if.peers": "상대 인터페이스(샘플링 안 됨, 샘플링 인터페이스를 거친 트래픽만)", +"if.peer_note": "상대 인터페이스: 샘플링 안 됨, 이 장비의 샘플링 인터페이스를 거친 트래픽만", +"src.sampled_if": "샘플링 인터페이스: {v}", +"src.dir_yes": "방향 필드(61) 있음", +"src.dir_no": "방향 필드(61) 없음: 샘플링 인터페이스를 트래픽으로 추정" } diff --git a/internal/web/static/i18n/pt.json b/internal/web/static/i18n/pt.json index cc3f45f..81bfb89 100644 --- a/internal/web/static/i18n/pt.json +++ b/internal/web/static/i18n/pt.json @@ -509,5 +509,10 @@ "if.name_ph": "Nome da interface", "if.tag_ph": "Rótulo, ex. uplink", "if.save": "Salvar", -"ov.if_sub": "Entrada e saída desta interface (sentido da interface)" +"ov.if_sub": "Entrada e saída desta interface (sentido da interface)", +"if.peers": "Interfaces do outro lado (sem amostragem; só o tráfego pela interface amostrada)", +"if.peer_note": "Interface do outro lado: sem amostragem, só o tráfego pela interface amostrada deste equipamento", +"src.sampled_if": "Amostragem em: {v}", +"src.dir_yes": "com flowDirection (61)", +"src.dir_no": "sem flowDirection (61): interface amostrada deduzida do tráfego" } diff --git a/internal/web/static/i18n/ru.json b/internal/web/static/i18n/ru.json index 6f562ee..78cad1f 100644 --- a/internal/web/static/i18n/ru.json +++ b/internal/web/static/i18n/ru.json @@ -509,5 +509,10 @@ "if.name_ph": "Имя интерфейса", "if.tag_ph": "Метка, напр. аплинк", "if.save": "Сохранить", -"ov.if_sub": "Вход и выход через этот интерфейс (направления интерфейса)" +"ov.if_sub": "Вход и выход через этот интерфейс (направления интерфейса)", +"if.peers": "Встречные интерфейсы (без выборки; только трафик через интерфейс с выборкой)", +"if.peer_note": "Встречный интерфейс: без выборки, только трафик через интерфейс с выборкой этого устройства", +"src.sampled_if": "Выборка на: {v}", +"src.dir_yes": "с flowDirection (61)", +"src.dir_no": "без flowDirection (61): интерфейс с выборкой определён по трафику" } diff --git a/internal/web/static/i18n/ur.json b/internal/web/static/i18n/ur.json index 2b5ec02..530f1f0 100644 --- a/internal/web/static/i18n/ur.json +++ b/internal/web/static/i18n/ur.json @@ -509,5 +509,10 @@ "if.name_ph": "انٹرفیس کا نام", "if.tag_ph": "ٹیگ، مثلاً uplink", "if.save": "محفوظ کریں", -"ov.if_sub": "اس انٹرفیس میں آنا / جانا (انٹرفیس کی سمت)" +"ov.if_sub": "اس انٹرفیس میں آنا / جانا (انٹرفیس کی سمت)", +"if.peers": "مخالف سرے کے انٹرفیس (سیمپل نہیں؛ صرف سیمپل والے انٹرفیس سے گزری ٹریفک)", +"if.peer_note": "مخالف سرے کا انٹرفیس: سیمپل نہیں، صرف اس ڈیوائس کے سیمپل والے انٹرفیس سے گزری ٹریفک", +"src.sampled_if": "سیمپل انٹرفیس: {v}", +"src.dir_yes": "flowDirection (61) کے ساتھ", +"src.dir_no": "flowDirection (61) کے بغیر: سیمپل انٹرفیس ٹریفک سے اخذ" } diff --git a/internal/web/static/i18n/zh.json b/internal/web/static/i18n/zh.json index 4529e18..f9e0b8c 100644 --- a/internal/web/static/i18n/zh.json +++ b/internal/web/static/i18n/zh.json @@ -509,5 +509,10 @@ "if.name_ph": "接口名称", "if.tag_ph": "标识,如 上联", "if.save": "保存", -"ov.if_sub": "按接口方向:从这个口进 / 出" +"ov.if_sub": "按接口方向:从这个口进 / 出", +"if.peers": "对端接口(未采样,只含经过采样接口的流量)", +"if.peer_note": "对端接口:未采样,只含经过本设备采样接口的流量", +"src.sampled_if": "采样接口:{v}", +"src.dir_yes": "带方向字段(61)", +"src.dir_no": "不带方向字段(61),采样接口按流量推断" }