diff --git a/CHANGELOG.md b/CHANGELOG.md index 2479772..b69249a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,14 @@ Findings host's details page lists the findings about it, and the side menu shows how many high and medium findings are open. +Pages +- Flow paths start from each host by default (the 10 busiest, the rest as + Other); **By network** switches back to network segments. +- The overview shows the findings below the traffic chart. +- Top-N is called Top 66 and comes right after Overview in the menu. +- Your own logo: **Sources → Logo** takes a PNG, SVG, JPEG, WebP or GIF + (best at 272 × 92 pixels) for the sign-in page and the top of the menu. + Fixes - A host's details page counted only part of the internal hosts it talked to (the servers of internal conversations were missed). diff --git a/README.md b/README.md index e5120e9..5894355 100644 --- a/README.md +++ b/README.md @@ -558,8 +558,8 @@ snmp 192.0.2.9 s3cret 10.99.0.9:161 - `net`: private ranges (10/8, 172.16/12, 192.168/16, 100.64/10) are always yours. Add your public ranges so traffic to and from them counts - as yours too; the name shows up in **Top-N → Segments** and in the flow - paths. + as yours too; the name shows up in **Top 66** grouped by segment and in + the flow paths by network. - `snmp [[:port]]`: the device is the address flows come from. Add the management address when the device answers SNMP on another address. Interface descriptions read over @@ -628,14 +628,14 @@ Pages: | Page | What it answers | |---|---| | Overview | How much traffic now and compared with last week, by application; open findings; top clients and services | +| Top 66 | One table of the top 66: by default conversations (client, server, service, country). Every column heading sorts; number columns (traffic, packets, average packet size, flows) rank all traffic in the range, so the smallest average packet size finds scanners and floods. **Group by** switches to applications, networks, segments, devices, encapsulation and VLAN | | Findings | What needs attention: scans, password guessing, lateral movement, unusual uploads, floods and threat list traffic ([more](#findings)) | -| Top-N | One table of the top 66: by default conversations (client, server, service, country). Every column heading sorts; number columns (traffic, packets, average packet size, flows) rank all traffic in the range, so the smallest average packet size finds scanners and floods. **Group by** switches to applications, networks, segments, devices, encapsulation and VLAN | -| Flow paths | Which segment talks to which application in which country | +| Flow paths | Which host uses which application towards which country: the 10 busiest hosts, the rest as Other. **By network** shows networks instead of hosts | | Geo & networks | Traffic by country and by network (AS) | | Threat intel | Hosts that talked to addresses on your threat lists, and how much they sent | | Flow records | Individual flows, newest first, with selectable columns | | Interface check | Flow numbers next to the interface counters, worst first, with reasons | -| Sources | Devices, sampling, loss, collectors, SNMP, the countries and networks database, and **Names** | +| Sources | Devices, sampling, loss, collectors, SNMP, the countries and networks database, the logo, and **Names** | Above the pages: time range (15 minutes to 30 days), an optional search box, automatic refresh every 30 seconds, and **Copy link**, which copies a @@ -645,7 +645,7 @@ the menu. Ranges longer than 6 hours start on a whole hour, so every number on the page counts exactly the same time: "24 hours" covers the last 24 whole -hours plus the current one. Top-N over these ranges comes from hourly +hours plus the current one. Top 66 over these ranges comes from hourly summaries; filters are not available there, and the page says so. Choose a shorter range to filter. Conversations always read the flow detail, so over long ranges at high flow rates they can take a while; one hour is fastest. @@ -654,6 +654,11 @@ The side menu shows how much disk the data uses and how much is free; hover over the free space to see how much the kept days of detail need at the current rate (estimated once there is a day of data). +To show your own logo on the sign-in page and at the top of the menu, use +**Sources → Logo → Upload a logo…**: PNG, SVG, JPEG, WebP or GIF, up to +1 MB, best at 272 × 92 pixels (other sizes are scaled to fit). **Use the +built-in logo** goes back to traffic66's. + ### Findings **Findings** lists what traffic66 found in the flows, most serious first. It @@ -691,11 +696,11 @@ no findings except the internet scanner knocking on the website. ![Findings: every step of an attack, found through 1:4096 sFlow sampling](docs/images/findings.png) -![Top-N: the top 66 conversations of the last hour](docs/images/topn.png) +![Top 66: the top 66 conversations of the last hour](docs/images/topn.png) ![Details of one host: the findings about it, its traffic, who it talks to, services, countries and latest flows](docs/images/detail.png) -![Flow paths: which segment uses which application towards which country](docs/images/paths.png) +![Flow paths: which host uses which application towards which country](docs/images/paths.png) The same overview in Chinese; every page is available in 13 languages: @@ -721,7 +726,7 @@ view in a browser, q quit. ![Terminal UI: overview](docs/images/tui-overview.png) -![Terminal UI: Top-N conversations](docs/images/tui-topn.png) +![Terminal UI: Top 66 conversations](docs/images/tui-topn.png) ## 11. Local capture @@ -855,6 +860,7 @@ The data directory holds everything: | `traffic66.duckdb` | summaries, interface counters and the current hour | | `password` | login passwords (hashed) | | `inventory.txt` | names (**Sources → Names**) | +| `logo.png` (or `.svg`, `.jpg`, `.webp`, `.gif`) | your logo (**Sources → Logo**), if you uploaded one | | `country.mmdb`, `asn.mmdb`, `asn.tsv.gz`, `threats/` | countries and networks databases and threat lists you added | **How long data is kept**: flow detail 30 days, summaries (overview and long diff --git a/cmd/traffic66/main.go b/cmd/traffic66/main.go index e997719..f82e96a 100644 --- a/cmd/traffic66/main.go +++ b/cmd/traffic66/main.go @@ -370,7 +370,16 @@ func serve(args []string, demo bool) { startDemoAgents(ctx, s) log.Printf("demo: simulated exporters are running (core router, switch, firewall, branch router)") } - go poller.Run(ctx) + go func() { + if demo { // let the simulated devices count a few seconds first + select { + case <-ctx.Done(): + return + case <-time.After(10 * time.Second): + } + } + poller.Run(ctx) + }() checker := loginChecker(f.data, f.user, f.password) tok := randomHex(24) diff --git a/docs/README.ar.md b/docs/README.ar.md index 0fe9d60..03a684e 100644 --- a/docs/README.ar.md +++ b/docs/README.ar.md @@ -584,7 +584,8 @@ snmp 192.0.2.9 s3cret 10.99.0.9:161 - `net`: النطاقات الخاصة (10/8 و172.16/12 و192.168/16 و100.64/10) تُعدّ دائمًا نطاقاتك. أضف نطاقاتك العامة كي تُحتسب الحركة منها وإليها لك أيضًا؛ - ويظهر الاسم في **Top-N ← المقاطع** وفي مسارات الحركة. + ويظهر الاسم في **أعلى 66** عند التجميع حسب المقطع، وفي مسارات الحركة حسب + الشبكة. - `snmp [[:port]]`: الجهاز هو العنوان الذي تأتي منه التدفقات. أضف عنوان الإدارة إذا كان الجهاز يجيب على SNMP من عنوان آخر. تُستخدم أوصاف الواجهات المقروءة عبر SNMP أسماءً @@ -653,14 +654,14 @@ curl -L https://www.spamhaus.org/drop/drop.txt -o /threats/spamh | الصفحة | ما الذي تجيب عنه | |---|---| | نظرة عامة | حجم الحركة الآن ومقارنةً بالأسبوع الماضي حسب التطبيق؛ الاكتشافات المفتوحة؛ أبرز العملاء والخدمات | +| أعلى 66 | جدول واحد لأعلى 66: افتراضيًا المحادثات (العميل والخادم والخدمة والدولة). كل عنوان عمود يفرز؛ والأعمدة الرقمية (حركة المرور، الحزم، متوسط الحزمة، التدفقات) تعيد اختيار أعلى 66 من كل حركة المرور في الفترة، لذا يكشف أصغر متوسط حزمة عمليات المسح والإغراق. ويبدّل **التجميع حسب** إلى التطبيقات والشبكات والمقاطع والأجهزة وأنواع التغليف وشبكات VLAN | | الاكتشافات | ما يستدعي الانتباه: عمليات المسح، وتخمين كلمات المرور، والتحرك الجانبي، وعمليات الرفع غير المعتادة، والإغراق، وحركة قوائم التهديدات ([المزيد](#findings)) | -| Top-N | جدول واحد لأعلى 66: افتراضيًا المحادثات (العميل والخادم والخدمة والدولة). كل عنوان عمود يفرز؛ والأعمدة الرقمية (حركة المرور، الحزم، متوسط الحزمة، التدفقات) تعيد اختيار أعلى 66 من كل حركة المرور في الفترة، لذا يكشف أصغر متوسط حزمة عمليات المسح والإغراق. ويبدّل **التجميع حسب** إلى التطبيقات والشبكات والمقاطع والأجهزة وأنواع التغليف وشبكات VLAN | -| مسارات الحركة | أي مقطع يتواصل مع أي تطبيق في أي دولة | +| مسارات الحركة | أي مضيف يستخدم أي تطبيق نحو أي دولة: أكثر 10 مضيفات نشاطًا، والباقي ضمن «أخرى». ويعرض **حسب المقطع** الشبكات بدل المضيفات | | الجغرافيا والشبكات | الحركة حسب الدولة وحسب الشبكة (AS) | | معلومات التهديدات | المضيفات التي تواصلت مع عناوين في قوائم تهديداتك، وكم أرسلت | | سجلات التدفق | التدفقات الفردية، الأحدث أولًا، مع أعمدة قابلة للاختيار | | مطابقة الواجهات | أرقام التدفقات بجوار عدّادات الواجهات، الأسوأ أولًا، مع الأسباب | -| المصادر | الأجهزة، وأخذ العينات، والفقد، والمستقبِلات، وSNMP، وقاعدة بيانات الدول والشبكات، و**الأسماء** | +| المصادر | الأجهزة، وأخذ العينات، والفقد، والمستقبِلات، وSNMP، وقاعدة بيانات الدول والشبكات، والشعار، و**الأسماء** | فوق الصفحات: النطاق الزمني (من 15 دقيقة إلى 30 يومًا)، ومربع بحث اختياري، وتحديث تلقائي كل 30 ثانية، و**نسخ الرابط** الذي ينسخ رابطًا إلى العرض @@ -669,7 +670,7 @@ curl -L https://www.spamhaus.org/drop/drop.txt -o /threats/spamh تبدأ النطاقات الأطول من 6 ساعات عند ساعة كاملة، كي يحسب كل رقم في الصفحة الفترة الزمنية نفسها تمامًا: يغطي "24 ساعة" آخر 24 ساعة كاملة إضافةً إلى -الساعة الجارية. تُبنى Top-N لهذه النطاقات من ملخّصات ساعية؛ والمرشّحات غير +الساعة الجارية. تُبنى صفحة أعلى 66 لهذه النطاقات من ملخّصات ساعية؛ والمرشّحات غير متاحة فيها، وتنبّه الصفحة إلى ذلك. اختر نطاقًا أقصر لتتمكن من التصفية. تقرأ المحادثات تفاصيل التدفقات دائمًا، لذا قد تستغرق بعض الوقت في النطاقات الطويلة عند معدلات التدفق العالية؛ ونطاق الساعة الواحدة هو الأسرع. @@ -678,6 +679,11 @@ curl -L https://www.spamhaus.org/drop/drop.txt -o /threats/spamh مرّر المؤشر فوق المساحة الحرة لترى ما تحتاجه أيام التفاصيل المحفوظة بالمعدل الحالي (يُقدَّر ذلك بعد توفر بيانات يوم كامل). +لعرض شعارك في صفحة تسجيل الدخول وأعلى القائمة، استخدم +**المصادر ← الشعار ← رفع شعار…**: PNG أو SVG أو JPEG أو WebP أو GIF، حتى 1 MB، +وأفضل مقاس 272 × 92 بكسل (تُحجَّم المقاسات الأخرى لتلائم). ويعيد +**العودة إلى الشعار المدمج** شعار traffic66. + ### الاكتشافات @@ -717,11 +723,11 @@ curl -L https://www.spamhaus.org/drop/drop.txt -o /threats/spamh ![الاكتشافات: كل خطوة من هجوم، اكتُشفت عبر أخذ عينات sFlow بنسبة 1:4096](images/findings.png) -![Top-N: أعلى 66 محادثة في الساعة الأخيرة](images/topn.png) +![أعلى 66: أعلى 66 محادثة في الساعة الأخيرة](images/topn.png) ![تفاصيل مضيف واحد: الاكتشافات المتعلقة به، وحركته، ومن يتواصل معه، والخدمات، والدول، وأحدث التدفقات](images/detail.png) -![مسارات الحركة: أي مقطع يستخدم أي تطبيق نحو أي دولة](images/paths.png) +![مسارات الحركة: أي مضيف يستخدم أي تطبيق نحو أي دولة](images/paths.png) النظرة العامة نفسها باللغة الصينية؛ كل صفحة متاحة بـ 13 لغة: @@ -749,7 +755,7 @@ traffic66 -tui # collect and show the termina ![الواجهة الطرفية: نظرة عامة](images/tui-overview.png) -![الواجهة الطرفية: أعلى المحادثات في Top-N](images/tui-topn.png) +![الواجهة الطرفية: محادثات أعلى 66](images/tui-topn.png) @@ -898,6 +904,7 @@ traffic66 -data /var/lib/traffic66 -listen "sflow=:6343,netflow=:2055,ipfix=:473 | `traffic66.duckdb` | الملخّصات وعدّادات الواجهات والساعة الجارية | | `password` | كلمات مرور تسجيل الدخول (مُجزّأة) | | `inventory.txt` | الأسماء (**المصادر ← الأسماء**) | +| `logo.png` (أو `.svg`، `.jpg`، `.webp`، `.gif`) | شعارك (**المصادر ← الشعار**)، إن كنت قد رفعته | | `country.mmdb`، `asn.mmdb`، `asn.tsv.gz`، `threats/` | قواعد بيانات الدول والشبكات وقوائم التهديدات التي أضفتها | **مدة الاحتفاظ بالبيانات**: تفاصيل التدفقات 30 يومًا، والملخصات (النظرة العامة والفترات الطويلة) 400 يوم. diff --git a/docs/README.bn.md b/docs/README.bn.md index 79d4a58..a6f8160 100644 --- a/docs/README.bn.md +++ b/docs/README.bn.md @@ -589,7 +589,8 @@ snmp 192.0.2.9 s3cret 10.99.0.9:161 - `net`: private range (10/8, 172.16/12, 192.168/16, 100.64/10) সবসময় আপনার ধরা হয়। আপনার public range যোগ করুন যাতে সেগুলোতে আসা-যাওয়া ট্রাফিকও আপনার - হিসেবে গোনা হয়; নামটি **Top-N → সেগমেন্ট**-এ এবং flow-এর পথে দেখা যায়। + হিসেবে গোনা হয়; নামটি **শীর্ষ 66**-এ segment অনুযায়ী গ্রুপ করলে এবং network + অনুযায়ী flow-এর পথে দেখা যায়। - `snmp [[:port]]`: device হলো সেই address যেখান থেকে flow আসে। ডিভাইস অন্য address-এ SNMP-র উত্তর দিলে management address যোগ করুন। SNMP দিয়ে পড়া interface description নাম হিসেবে @@ -661,14 +662,14 @@ application, দেশ, ডিভাইস — ক্লিক করা যা | পেজ | কোন প্রশ্নের উত্তর দেয় | |---|---| | সারসংক্ষেপ | এখন কত ট্রাফিক আর গত সপ্তাহের তুলনায় কত, application অনুযায়ী; খোলা সন্দেহজনক কার্যকলাপ; শীর্ষ client ও service | +| শীর্ষ 66 | শীর্ষ 66-এর একটি table: ডিফল্টভাবে conversation (client, server, service, দেশ)। যেকোনো column heading-এ sort হয়; সংখ্যার column (ট্রাফিক, প্যাকেট, গড় প্যাকেট, flow) সময়সীমার সব ট্রাফিক থেকে শীর্ষ 66 আবার বাছে, তাই সবচেয়ে ছোট গড় প্যাকেট দিয়ে scan ও flood ধরা পড়ে। **গ্রুপের ভিত্তি**-তে application, নেটওয়ার্ক, segment, ডিভাইস, encapsulation ও VLAN-এ যাওয়া যায় | | সন্দেহজনক কার্যকলাপ | কীসে নজর দিতে হবে: scan, পাসওয়ার্ড অনুমান, lateral movement, অস্বাভাবিক upload, flood আর threat list-এর ট্রাফিক ([আরও](#findings)) | -| Top-N | শীর্ষ 66-এর একটি table: ডিফল্টভাবে conversation (client, server, service, দেশ)। যেকোনো column heading-এ sort হয়; সংখ্যার column (ট্রাফিক, প্যাকেট, গড় প্যাকেট, flow) সময়সীমার সব ট্রাফিক থেকে শীর্ষ 66 আবার বাছে, তাই সবচেয়ে ছোট গড় প্যাকেট দিয়ে scan ও flood ধরা পড়ে। **গ্রুপের ভিত্তি**-তে application, নেটওয়ার্ক, segment, ডিভাইস, encapsulation ও VLAN-এ যাওয়া যায় | -| ট্রাফিকের পথ | কোন segment কোন দেশের কোন application-এর সাথে কথা বলে | +| ট্রাফিকের পথ | কোন host কোন দেশের দিকে কোন application ব্যবহার করে: সবচেয়ে ব্যস্ত 10টি host, বাকিগুলো "অন্যান্য" হিসেবে। **সেগমেন্ট অনুযায়ী** host-এর বদলে নেটওয়ার্ক দেখায় | | ভূগোল ও নেটওয়ার্ক | দেশ ও নেটওয়ার্ক (AS) অনুযায়ী ট্রাফিক | | হুমকির তথ্য | যেসব host আপনার threat list-এর address-এর সাথে কথা বলেছে, এবং কতটা পাঠিয়েছে | | ফ্লো রেকর্ড | আলাদা আলাদা flow, নতুনগুলো আগে, বেছে নেওয়া যায় এমন column সহ | | ইন্টারফেস মিলানো | interface counter-এর পাশে flow-এর সংখ্যা, সবচেয়ে খারাপগুলো আগে, কারণসহ | -| উৎস | ডিভাইস, sampling, loss, collector, SNMP, দেশ ও নেটওয়ার্ক ডেটাবেস, এবং **নাম** | +| উৎস | ডিভাইস, sampling, loss, collector, SNMP, দেশ ও নেটওয়ার্ক ডেটাবেস, লোগো, এবং **নাম** | পেজগুলোর ওপরে: time range (15 মিনিট থেকে 30 দিন), একটি ঐচ্ছিক search box, প্রতি 30 সেকেন্ডে automatic refresh, এবং **লিংক কপি করুন**, যা ঠিক বর্তমান @@ -677,7 +678,7 @@ view-এর (পেজ, time range ও filter) link কপি করে, যা 6 ঘণ্টার চেয়ে লম্বা range পূর্ণ ঘণ্টা থেকে শুরু হয়, যাতে পেজের প্রতিটি সংখ্যা ঠিক একই সময় গোনে: "24 ঘণ্টা" মানে শেষ 24টি পূর্ণ ঘণ্টা আর চলতি -ঘণ্টা। এই range-গুলোতে Top-N আসে ঘণ্টাভিত্তিক summary থেকে; সেখানে filter +ঘণ্টা। এই range-গুলোতে শীর্ষ 66 আসে ঘণ্টাভিত্তিক summary থেকে; সেখানে filter পাওয়া যায় না, আর পেজেই তা বলা থাকে। filter করতে ছোট range বেছে নিন। কথোপকথন (conversation) সবসময় flow-এর বিস্তারিত তথ্য পড়ে, তাই উচ্চ flow rate-এ লম্বা range-এ কিছুটা সময় লাগতে পারে; এক ঘণ্টা সবচেয়ে দ্রুত। @@ -685,6 +686,11 @@ view-এর (পেজ, time range ও filter) link কপি করে, যা ওপর hover করলে দেখা যায় বর্তমান হারে রাখা দিনগুলোর বিস্তারিত তথ্যের জন্য কতটা জায়গা লাগবে (এক দিনের data জমা হলে হিসাব করা হয়)। +সাইন-ইন পেজে আর menu-র ওপরে নিজের লোগো দেখাতে +**উৎস → লোগো → লোগো আপলোড করুন…** ব্যবহার করুন: PNG, SVG, JPEG, WebP বা GIF, +1 MB পর্যন্ত, 272 × 92 pixel-এ সবচেয়ে ভালো (অন্য আকার মানিয়ে নিতে scale করা +হয়)। **বিল্ট-ইন লোগোতে ফিরুন** দিয়ে traffic66-এর লোগোতে ফেরা যায়। + ### সন্দেহজনক কার্যকলাপ @@ -726,11 +732,11 @@ packet পাঠায় যে দেখা যায় না। ডেম ![সন্দেহজনক কার্যকলাপ: একটি আক্রমণের প্রতিটি ধাপ, 1:4096 sFlow sampling-এর মধ্য দিয়েও ধরা পড়েছে](images/findings.png) -![Top-N: গত এক ঘণ্টার শীর্ষ 66 conversation](images/topn.png) +![শীর্ষ 66: গত এক ঘণ্টার শীর্ষ 66 conversation](images/topn.png) ![একটি host-এর বিস্তারিত: তার সম্পর্কে পাওয়া সন্দেহজনক কার্যকলাপ, তার ট্রাফিক, সে কার সাথে কথা বলে, service, দেশ ও সর্বশেষ flow](images/detail.png) -![ট্রাফিকের পথ: কোন segment কোন দেশের দিকে কোন application ব্যবহার করে](images/paths.png) +![ট্রাফিকের পথ: কোন host কোন দেশের দিকে কোন application ব্যবহার করে](images/paths.png) একই সারসংক্ষেপ চীনা ভাষায়; প্রতিটি পেজ 13টি ভাষায় পাওয়া যায়: @@ -758,7 +764,7 @@ q বেরিয়ে যান। ![Terminal UI: সারসংক্ষেপ](images/tui-overview.png) -![Terminal UI: Top-N conversation](images/tui-topn.png) +![Terminal UI: শীর্ষ 66 conversation](images/tui-topn.png) @@ -906,6 +912,7 @@ traffic66 -data /var/lib/traffic66 -listen "sflow=:6343,netflow=:2055,ipfix=:473 | `traffic66.duckdb` | summary, interface counter ও চলতি ঘণ্টা | | `password` | login পাসওয়ার্ড (hashed) | | `inventory.txt` | নাম (**উৎস → নাম**) | +| `logo.png` (বা `.svg`, `.jpg`, `.webp`, `.gif`) | আপনার লোগো (**উৎস → লোগো**), যদি আপলোড করে থাকেন | | `country.mmdb`, `asn.mmdb`, `asn.tsv.gz`, `threats/` | আপনার যোগ করা দেশ ও নেটওয়ার্ক database এবং threat list | **ডেটা কতদিন রাখা হয়**: flow detail 30 দিন, summary (overview ও দীর্ঘ সময়সীমা) 400 দিন। এর চেয়ে পুরোনো ডেটা diff --git a/docs/README.es.md b/docs/README.es.md index 33905dd..8fd6b44 100644 --- a/docs/README.es.md +++ b/docs/README.es.md @@ -602,7 +602,7 @@ snmp 192.0.2.9 s3cret 10.99.0.9:161 - `net`: los rangos privados (10/8, 172.16/12, 192.168/16, 100.64/10) se consideran siempre propios. Añada sus rangos públicos para que el tráfico hacia y desde ellos también cuente como propio; el nombre aparece en - **Top-N → Segmentos** y en las rutas de tráfico. + **Top 66** agrupado por segmento y en las rutas de tráfico por segmento. - `snmp [[:port]]`: el equipo es la dirección de la que vienen los flujos. Añada la dirección de gestión cuando el equipo responda a SNMP en otra dirección. Las descripciones de @@ -680,14 +680,14 @@ Páginas: | Página | Qué responde | |---|---| | Resumen | Cuánto tráfico hay ahora y frente a la semana pasada, por aplicación; hallazgos abiertos; principales clientes y servicios | +| Top 66 | Una sola tabla de los 66 primeros: por defecto, conversaciones (cliente, servidor, servicio, país). Cualquier encabezado ordena; las columnas numéricas (tráfico, paquetes, paquete medio, flujos) clasifican todo el tráfico del periodo, así el menor paquete medio revela escaneos e inundaciones. **Agrupar por** cambia a aplicaciones, redes, segmentos, equipos, encapsulación y VLAN | | 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)) | -| Top-N | Una sola tabla de los 66 primeros: por defecto, conversaciones (cliente, servidor, servicio, país). Cualquier encabezado ordena; las columnas numéricas (tráfico, paquetes, paquete medio, flujos) clasifican todo el tráfico del periodo, así el menor paquete medio revela escaneos e inundaciones. **Agrupar por** cambia a aplicaciones, redes, segmentos, equipos, encapsulación y VLAN | -| Rutas de tráfico | Qué segmento habla con qué aplicación en qué país | +| Rutas de tráfico | Qué host usa qué aplicación hacia qué país: los 10 hosts con más tráfico, el resto como Otros. **Por segmento** muestra segmentos en lugar de hosts | | Geografía y redes | Tráfico por país y por red (AS) | | Inteligencia de amenazas | Hosts que hablaron con direcciones de sus listas de amenazas y cuánto enviaron | | Registros de flujo | Flujos individuales, del más reciente al más antiguo, con columnas seleccionables | | Verificación de interfaces | Cifras de flujo junto a los contadores de interfaz, de peor a mejor, con motivos | -| Fuentes | Equipos, muestreo, pérdidas, colectores, SNMP, la base de datos de países y redes, y **Nombres** | +| Fuentes | Equipos, muestreo, pérdidas, colectores, SNMP, la base de datos de países y redes, el logotipo y **Nombres** | Encima de las páginas: rango de tiempo (de 15 minutos a 30 días), un cuadro de búsqueda opcional, refresco automático cada 30 segundos y **Copiar enlace**, que copia un enlace exactamente a la vista actual @@ -696,7 +696,7 @@ navegador; se cambia al final del menú. Los rangos de más de 6 horas empiezan en una hora en punto, de modo que todas las cifras de la página cuentan exactamente el mismo tiempo: "24 horas" -abarca las últimas 24 horas completas más la actual. En estos rangos, Top-N +abarca las últimas 24 horas completas más la actual. En estos rangos, Top 66 sale de resúmenes horarios; ahí no hay filtros, y la página lo indica. Elija un rango más corto para filtrar. Las conversaciones siempre leen el detalle de flujos, así que en rangos largos con muchos flujos pueden tardar; una hora es lo más rápido. @@ -706,6 +706,11 @@ pase el ratón por el espacio libre para ver cuánto necesitan, al ritmo actual, los días de detalle que se conservan (se estima en cuanto hay un día de datos). +Para mostrar su propio logotipo en la página de inicio de sesión y arriba +del menú, use **Fuentes → Logotipo → Subir un logotipo…**: PNG, SVG, JPEG, +WebP o GIF, hasta 1 MB, idealmente de 272 × 92 píxeles (otros tamaños se +ajustan). **Usar el logotipo integrado** vuelve al de traffic66. + ### Hallazgos @@ -747,11 +752,11 @@ hallazgo salvo el escáner de internet que llama a la puerta del sitio web. ![Hallazgos: cada paso de un ataque, encontrado a través de un muestreo sFlow 1:4096](images/findings.png) -![Top-N: las 66 primeras conversaciones de la última hora](images/topn.png) +![Top 66: las 66 primeras conversaciones de la última hora](images/topn.png) ![Detalles de un host: los hallazgos sobre él, su tráfico, con quién habla, servicios, países y últimos flujos](images/detail.png) -![Rutas de tráfico: qué segmento usa qué aplicación hacia qué país](images/paths.png) +![Rutas de tráfico: qué host usa qué aplicación hacia qué país](images/paths.png) El mismo resumen en chino; todas las páginas están disponibles en 13 idiomas: @@ -779,7 +784,7 @@ c quitar filtros, w abrir la misma vista en un navegador, q salir. ![Interfaz de terminal: resumen](images/tui-overview.png) -![Interfaz de terminal: Top-N de conversaciones](images/tui-topn.png) +![Interfaz de terminal: Top 66 de conversaciones](images/tui-topn.png) @@ -931,6 +936,7 @@ El directorio de datos lo contiene todo: | `traffic66.duckdb` | resúmenes, contadores de interfaz y la hora en curso | | `password` | contraseñas de acceso (con hash) | | `inventory.txt` | nombres (**Fuentes → Nombres**) | +| `logo.png` (o `.svg`, `.jpg`, `.webp`, `.gif`) | su logotipo (**Fuentes → Logotipo**), si subió uno | | `country.mmdb`, `asn.mmdb`, `asn.tsv.gz`, `threats/` | bases de datos de países y redes y listas de amenazas que haya añadido | **Cuánto tiempo se guardan los datos**: el detalle de flujos 30 días; los resúmenes (vista general y periodos largos) diff --git a/docs/README.fr.md b/docs/README.fr.md index f255ce5..096ab9a 100644 --- a/docs/README.fr.md +++ b/docs/README.fr.md @@ -617,7 +617,8 @@ snmp 192.0.2.9 s3cret 10.99.0.9:161 - `net` : les plages privées (10/8, 172.16/12, 192.168/16, 100.64/10) sont toujours considérées comme les vôtres. Ajoutez vos plages publiques pour que le trafic vers et depuis elles compte aussi comme le vôtre ; le nom - apparaît dans **Top-N → Segments** et dans les chemins du trafic. + apparaît dans **Top 66** regroupé par segment et dans les chemins du + trafic par segment. - `snmp [[:port]]` : l'équipement est l'adresse d'où proviennent les flux. Ajoutez l'adresse de gestion quand l'équipement répond en SNMP sur une autre adresse. Les descriptions @@ -698,14 +699,14 @@ Pages : | Page | À quoi elle répond | |---|---| | Vue d'ensemble | Combien de trafic maintenant et par rapport à la semaine dernière, par application ; détections ouvertes ; principaux clients et services | +| Top 66 | Un seul tableau du top 66 : par défaut les conversations (client, serveur, service, pays). Chaque en-tête trie ; les colonnes numériques (trafic, paquets, paquet moyen, flux) classent tout le trafic de la période, si bien que le plus petit paquet moyen révèle scans et inondations. **Regrouper par** passe aux applications, réseaux, segments, équipements, encapsulation et VLAN | | 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)) | -| Top-N | Un seul tableau du top 66 : par défaut les conversations (client, serveur, service, pays). Chaque en-tête trie ; les colonnes numériques (trafic, paquets, paquet moyen, flux) classent tout le trafic de la période, si bien que le plus petit paquet moyen révèle scans et inondations. **Regrouper par** passe aux applications, réseaux, segments, équipements, encapsulation et VLAN | -| Chemins du trafic | Quel segment parle à quelle application dans quel pays | +| Chemins du trafic | Quel hôte utilise quelle application vers quel pays : les 10 hôtes les plus actifs, le reste dans Autres. **Par segment** affiche les segments au lieu des hôtes | | Géographie et réseaux | Trafic par pays et par réseau (AS) | | Menaces | Hôtes ayant communiqué avec des adresses de vos listes de menaces, et volume envoyé | | Enregistrements de flux | Flux individuels, du plus récent au plus ancien, avec colonnes au choix | | Contrôle des interfaces | Chiffres de flux à côté des compteurs d'interface, les pires en premier, avec les causes | -| Sources | Équipements, échantillonnage, pertes, collecteurs, SNMP, la base de données pays et réseaux, et **Noms** | +| Sources | Équipements, échantillonnage, pertes, collecteurs, SNMP, la base de données pays et réseaux, le logo et **Noms** | Au-dessus des pages : la plage de temps (de 15 minutes à 30 jours), un champ de recherche facultatif, le rafraîchissement automatique toutes les @@ -716,7 +717,7 @@ celle du navigateur ; on la change en bas du menu. Les plages de plus de 6 heures commencent à une heure pile, si bien que chaque chiffre de la page porte exactement sur la même durée : "24 heures" couvre les 24 dernières heures entières plus l'heure en cours. Sur ces -plages, Top-N s'appuie sur des agrégats horaires ; les filtres n'y sont pas +plages, Top 66 s'appuie sur des agrégats horaires ; les filtres n'y sont pas disponibles, et la page le signale. Choisissez une plage plus courte pour filtrer. Les conversations lisent toujours le détail des flux : sur de longues plages avec beaucoup de flux, cela peut prendre un moment ; une heure est le plus rapide. @@ -726,6 +727,11 @@ libre ; survolez l'espace libre pour voir ce dont les jours de détail conservés ont besoin au rythme actuel (estimation disponible dès qu'il y a une journée de données). +Pour afficher votre propre logo sur la page de connexion et en haut du +menu, utilisez **Sources → Logo → Importer un logo…** : PNG, SVG, JPEG, +WebP ou GIF, 1 Mo au plus, idéalement 272 × 92 pixels (les autres tailles +sont ajustées). **Revenir au logo intégré** rétablit celui de traffic66. + ### Détections @@ -772,11 +778,11 @@ site web. ![Détections : chaque étape d'une attaque, trouvée à travers un échantillonnage sFlow 1:4096](images/findings.png) -![Top-N : le top 66 des conversations de la dernière heure](images/topn.png) +![Top 66 : le top 66 des conversations de la dernière heure](images/topn.png) ![Détails d'un hôte : les détections qui le concernent, son trafic, avec qui il communique, services, pays et derniers flux](images/detail.png) -![Chemins du trafic : quel segment utilise quelle application vers quel pays](images/paths.png) +![Chemins du trafic : quel hôte utilise quelle application vers quel pays](images/paths.png) La même vue d'ensemble en chinois ; toutes les pages sont disponibles en 13 langues : @@ -806,7 +812,7 @@ q quitter. ![Interface terminal : vue d'ensemble](images/tui-overview.png) -![Interface terminal : Top-N des conversations](images/tui-topn.png) +![Interface terminal : Top 66 des conversations](images/tui-topn.png) @@ -959,6 +965,7 @@ Le répertoire de données contient tout : | `traffic66.duckdb` | agrégats, compteurs d'interface et heure en cours | | `password` | mots de passe de connexion (hachés) | | `inventory.txt` | noms (**Sources → Noms**) | +| `logo.png` (ou `.svg`, `.jpg`, `.webp`, `.gif`) | votre logo (**Sources → Logo**), si vous en avez importé un | | `country.mmdb`, `asn.mmdb`, `asn.tsv.gz`, `threats/` | bases de données pays et réseaux et listes de menaces que vous avez ajoutées | **Durée de conservation** : le détail des flux 30 jours, les résumés (vue d'ensemble et longues périodes) 400 jours. diff --git a/docs/README.hi.md b/docs/README.hi.md index 0e2bbd1..91754ee 100644 --- a/docs/README.hi.md +++ b/docs/README.hi.md @@ -590,7 +590,8 @@ snmp 192.0.2.9 s3cret 10.99.0.9:161 - `net`: private ranges (10/8, 172.16/12, 192.168/16, 100.64/10) हमेशा आपके माने जाते हैं। अपने public ranges जोड़ें ताकि उनसे आने-जाने वाला ट्रैफ़िक भी - आपका गिना जाए; नाम **Top-N → सेगमेंट** में और flow के रास्तों में दिखता है। + आपका गिना जाए; नाम **शीर्ष 66** में segment के अनुसार समूह बनाने पर और network + के अनुसार flow के रास्तों में दिखता है। - `snmp [[:port]]`: device वह address है जिससे flows आते हैं। जब डिवाइस SNMP का जवाब किसी दूसरे address पर देता हो, तो management address जोड़ें। SNMP से पढ़े गए interface descriptions नाम के @@ -663,14 +664,14 @@ application, देश, डिवाइस — पर क्लिक किय | पेज | किस सवाल का जवाब देता है | |---|---| | सारांश | अभी कितना ट्रैफ़िक है और पिछले हफ़्ते की तुलना में कितना, application के हिसाब से; खुली संदिग्ध गतिविधियाँ; top clients और services | +| शीर्ष 66 | top 66 की एक table: डिफ़ॉल्ट रूप से conversations (client, server, service, देश)। हर column heading से sort होता है; संख्या वाले columns (ट्रैफ़िक, पैकेट, औसत पैकेट, flows) समय-सीमा के पूरे ट्रैफ़िक से top 66 फिर से चुनते हैं, इसलिए सबसे छोटे औसत पैकेट से scan और flood पकड़े जाते हैं। **इसके अनुसार समूह** से applications, नेटवर्क, segments, डिवाइस, encapsulation और VLAN पर जाएँ | | संदिग्ध गतिविधि | किस पर ध्यान देना है: scans, पासवर्ड का अनुमान, lateral movement, असामान्य uploads, floods और threat list वाला ट्रैफ़िक ([और जानें](#findings)) | -| Top-N | top 66 की एक table: डिफ़ॉल्ट रूप से conversations (client, server, service, देश)। हर column heading से sort होता है; संख्या वाले columns (ट्रैफ़िक, पैकेट, औसत पैकेट, flows) समय-सीमा के पूरे ट्रैफ़िक से top 66 फिर से चुनते हैं, इसलिए सबसे छोटे औसत पैकेट से scan और flood पकड़े जाते हैं। **इसके अनुसार समूह** से applications, नेटवर्क, segments, डिवाइस, encapsulation और VLAN पर जाएँ | -| ट्रैफ़िक के रास्ते | कौन-सा segment किस देश में किस application से बात करता है | +| ट्रैफ़िक के रास्ते | कौन-सा host किस देश की ओर किस application का इस्तेमाल करता है: सबसे व्यस्त 10 hosts, बाकी "अन्य" के रूप में। **सेगमेंट के अनुसार** hosts की जगह नेटवर्क दिखाता है | | भूगोल और नेटवर्क | देश के हिसाब से और नेटवर्क (AS) के हिसाब से ट्रैफ़िक | | ख़तरे की जानकारी | वे hosts जिन्होंने आपकी threat lists के addresses से बात की, और उन्होंने कितना भेजा | | फ़्लो रिकॉर्ड | अलग-अलग flows, सबसे नए पहले, चुने जा सकने वाले columns के साथ | | इंटरफ़ेस मिलान | interface counters के बगल में flow के आँकड़े, सबसे ख़राब पहले, कारणों के साथ | -| स्रोत | डिवाइस, sampling, loss, collectors, SNMP, देश और नेटवर्क डेटाबेस, और **नाम** | +| स्रोत | डिवाइस, sampling, loss, collectors, SNMP, देश और नेटवर्क डेटाबेस, लोगो, और **नाम** | पेजों के ऊपर: time range (15 मिनट से 30 दिन), एक वैकल्पिक search box, हर 30 सेकंड पर automatic refresh, और **लिंक कॉपी करें**, जो ठीक मौजूदा view (पेज, @@ -679,7 +680,7 @@ time range और filters) का link कॉपी करता है ता 6 घंटे से लंबी ranges पूरे घंटे से शुरू होती हैं, ताकि पेज का हर आँकड़ा ठीक एक जैसा समय गिने: "24 घंटे" में पिछले 24 पूरे घंटे और मौजूदा घंटा शामिल हैं। -इन ranges पर Top-N घंटेवार summaries से आता है; वहाँ filters उपलब्ध नहीं +इन ranges पर शीर्ष 66 घंटेवार summaries से आता है; वहाँ filters उपलब्ध नहीं हैं, और पेज यह बता देता है। filter करने के लिए छोटी range चुनें। बातचीत (conversations) हमेशा flow detail पढ़ती है, इसलिए ऊँची flow दरों पर लंबी ranges में इसमें कुछ समय लग सकता है; एक घंटा सबसे तेज़ है। @@ -687,6 +688,11 @@ side menu दिखाता है कि data कितनी disk इस् ख़ाली जगह पर hover करें तो दिखता है कि मौजूदा दर पर रखे गए दिनों के detail को कितनी जगह चाहिए (एक दिन का data होने के बाद अनुमान लगाया जाता है)। +साइन-इन पेज पर और menu के ऊपर अपना लोगो दिखाने के लिए +**स्रोत → लोगो → लोगो अपलोड करें…** का इस्तेमाल करें: PNG, SVG, JPEG, WebP या +GIF, 1 MB तक, 272 × 92 pixels पर सबसे अच्छा (दूसरे आकार फ़िट होने के लिए scale +किए जाते हैं)। **बिल्ट-इन लोगो वापस लाएँ** से traffic66 का लोगो वापस आ जाता है। + ### संदिग्ध गतिविधि @@ -728,11 +734,11 @@ internet scanner के। ![संदिग्ध गतिविधि: एक हमले का हर चरण, 1:4096 sFlow sampling के बावजूद पकड़ा गया](images/findings.png) -![Top-N: पिछले घंटे की top 66 conversations](images/topn.png) +![शीर्ष 66: पिछले घंटे की top 66 conversations](images/topn.png) ![एक host का विवरण: उसके बारे में मिली संदिग्ध गतिविधियाँ, उसका ट्रैफ़िक, वह किससे बात करता है, services, देश और नवीनतम flows](images/detail.png) -![ट्रैफ़िक के रास्ते: कौन-सा segment किस देश की ओर किस application का इस्तेमाल करता है](images/paths.png) +![ट्रैफ़िक के रास्ते: कौन-सा host किस देश की ओर किस application का इस्तेमाल करता है](images/paths.png) यही सारांश चीनी में; हर पेज 13 भाषाओं में उपलब्ध है: @@ -760,7 +766,7 @@ x हटाएँ, / search, t time range, c filters साफ़ करें, ![Terminal UI: सारांश](images/tui-overview.png) -![Terminal UI: Top-N conversations](images/tui-topn.png) +![Terminal UI: शीर्ष 66 conversations](images/tui-topn.png) @@ -908,6 +914,7 @@ traffic66 -data /var/lib/traffic66 -listen "sflow=:6343,netflow=:2055,ipfix=:473 | `traffic66.duckdb` | summaries, interface counters और मौजूदा घंटा | | `password` | login पासवर्ड (hashed) | | `inventory.txt` | नाम (**स्रोत → नाम**) | +| `logo.png` (या `.svg`, `.jpg`, `.webp`, `.gif`) | आपका लोगो (**स्रोत → लोगो**), अगर आपने अपलोड किया है | | `country.mmdb`, `asn.mmdb`, `asn.tsv.gz`, `threats/` | आपके जोड़े हुए देश और नेटवर्क databases और threat lists | **डेटा कितने समय तक रखा जाता है**: flow detail 30 दिन, summaries (overview और लंबी समय-सीमाएँ) 400 दिन। diff --git a/docs/README.id.md b/docs/README.id.md index 617df40..413b814 100644 --- a/docs/README.id.md +++ b/docs/README.id.md @@ -601,7 +601,7 @@ snmp 192.0.2.9 s3cret 10.99.0.9:161 - `net`: rentang privat (10/8, 172.16/12, 192.168/16, 100.64/10) selalu dianggap milik Anda. Tambahkan rentang publik Anda agar trafik ke dan dari rentang itu juga dihitung sebagai milik Anda; namanya muncul di - **Top-N → Segmen** dan di jalur trafik. + **Top 66** saat dikelompokkan per segmen dan di jalur trafik per jaringan. - `snmp [[:port]]`: device adalah alamat asal flow. Tambahkan alamat manajemen bila perangkat menjawab SNMP di alamat lain. Deskripsi interface yang dibaca lewat SNMP dipakai @@ -676,14 +676,14 @@ Halaman: | Halaman | Pertanyaan yang dijawab | |---|---| | Ringkasan | Berapa trafik sekarang dan dibanding minggu lalu, per aplikasi; temuan terbuka; klien dan layanan teratas | +| Top 66 | Satu tabel 66 teratas: secara default percakapan (klien, server, layanan, negara). Setiap judul kolom mengurutkan; kolom angka (lalu lintas, paket, rata-rata paket, flow) memilih ulang 66 teratas dari semua lalu lintas dalam rentang, sehingga rata-rata paket terkecil menemukan pemindaian dan banjir. **Kelompokkan menurut** beralih ke aplikasi, jaringan, segmen, perangkat, enkapsulasi, dan VLAN | | Temuan | Apa yang perlu diperhatikan: pemindaian, tebakan kata sandi, pergerakan lateral, unggahan tidak biasa, flood, dan trafik daftar ancaman ([selengkapnya](#findings)) | -| Top-N | Satu tabel 66 teratas: secara default percakapan (klien, server, layanan, negara). Setiap judul kolom mengurutkan; kolom angka (lalu lintas, paket, rata-rata paket, flow) memilih ulang 66 teratas dari semua lalu lintas dalam rentang, sehingga rata-rata paket terkecil menemukan pemindaian dan banjir. **Kelompokkan menurut** beralih ke aplikasi, jaringan, segmen, perangkat, enkapsulasi, dan VLAN | -| Jalur trafik | Segmen mana berbicara dengan aplikasi apa di negara mana | +| Jalur trafik | Host mana memakai aplikasi apa menuju negara mana: 10 host tersibuk, sisanya sebagai Lainnya. **Per segmen** menampilkan jaringan, bukan host | | Geografi & jaringan | Trafik per negara dan per jaringan (AS) | | Intel ancaman | Host yang berkomunikasi dengan alamat di daftar ancaman Anda, dan berapa banyak yang mereka kirim | | Catatan flow | Flow individual, terbaru di atas, dengan kolom yang bisa dipilih | | Pencocokan antarmuka | Angka flow di samping counter interface, yang paling buruk di atas, beserta alasannya | -| Sumber | Perangkat, sampling, loss, collector, SNMP, basis data negara dan jaringan, dan **Nama** | +| Sumber | Perangkat, sampling, loss, collector, SNMP, basis data negara dan jaringan, logo, dan **Nama** | Di atas halaman: rentang waktu (15 menit sampai 30 hari), kotak pencarian opsional, refresh otomatis setiap 30 detik, dan **Salin tautan**, yang @@ -693,7 +693,7 @@ bagian bawah menu. Rentang yang lebih panjang dari 6 jam dimulai pada jam penuh, sehingga setiap angka di halaman menghitung waktu yang persis sama: "24 jam" mencakup -24 jam penuh terakhir ditambah jam yang sedang berjalan. Top-N untuk rentang +24 jam penuh terakhir ditambah jam yang sedang berjalan. Top 66 untuk rentang ini diambil dari ringkasan per jam; filter tidak tersedia di sana, dan halaman memberi tahu hal itu. Pilih rentang yang lebih pendek untuk memfilter. Percakapan selalu dibaca dari detail flow, jadi untuk rentang @@ -705,6 +705,11 @@ masih kosong; arahkan kursor ke ruang kosong untuk melihat berapa yang dibutuhkan detail untuk hari-hari yang disimpan pada laju saat ini (diperkirakan setelah ada data satu hari). +Untuk menampilkan logo Anda sendiri di halaman masuk dan di bagian atas menu, +gunakan **Sumber → Logo → Unggah logo…**: PNG, SVG, JPEG, WebP, atau GIF, hingga +1 MB, paling baik 272 × 92 piksel (ukuran lain diskalakan agar pas). +**Pakai logo bawaan** mengembalikan logo traffic66. + ### Temuan @@ -748,11 +753,11 @@ yang mengetuk situs web. ![Temuan: setiap langkah serangan, ditemukan melalui sampling sFlow 1:4096](images/findings.png) -![Top-N: 66 percakapan teratas dalam satu jam terakhir](images/topn.png) +![Top 66: 66 percakapan teratas dalam satu jam terakhir](images/topn.png) ![Detail satu host: temuan tentangnya, trafiknya, dengan siapa ia berbicara, layanan, negara, dan flow terbaru](images/detail.png) -![Jalur trafik: segmen mana memakai aplikasi apa menuju negara mana](images/paths.png) +![Jalur trafik: host mana memakai aplikasi apa menuju negara mana](images/paths.png) Ringkasan yang sama dalam bahasa Tionghoa; setiap halaman tersedia dalam 13 bahasa: @@ -780,7 +785,7 @@ tampilan yang sama di browser, q keluar. ![Antarmuka terminal: ringkasan](images/tui-overview.png) -![Antarmuka terminal: percakapan Top-N](images/tui-topn.png) +![Antarmuka terminal: percakapan Top 66](images/tui-topn.png) @@ -930,6 +935,7 @@ Semua tersimpan di direktori data: | `traffic66.duckdb` | ringkasan, counter interface, dan jam berjalan | | `password` | kata sandi login (dalam bentuk hash) | | `inventory.txt` | nama (**Sumber → Nama**) | +| `logo.png` (atau `.svg`, `.jpg`, `.webp`, `.gif`) | logo Anda (**Sumber → Logo**), jika Anda mengunggahnya | | `country.mmdb`, `asn.mmdb`, `asn.tsv.gz`, `threats/` | basis data negara dan jaringan serta daftar ancaman yang Anda tambahkan | **Berapa lama data disimpan**: detail flow 30 hari, ringkasan (ikhtisar dan rentang waktu panjang) 400 hari. Data diff --git a/docs/README.ja.md b/docs/README.ja.md index 393d1aa..8d57767 100644 --- a/docs/README.ja.md +++ b/docs/README.ja.md @@ -497,7 +497,7 @@ snmp 192.0.2.1 public snmp 192.0.2.9 s3cret 10.99.0.9:161 ``` -- `net`:プライベートアドレス範囲(10/8、172.16/12、192.168/16、100.64/10)は常に自社のものとして扱われます。グローバルアドレス範囲も追加すると、それらとの間のトラフィックも自社扱いになります。名前は **Top-N → セグメント** とフローの流れに表示されます。 +- `net`:プライベートアドレス範囲(10/8、172.16/12、192.168/16、100.64/10)は常に自社のものとして扱われます。グローバルアドレス範囲も追加すると、それらとの間のトラフィックも自社扱いになります。名前は、セグメントでグループ化した **上位 66** と、ネットワーク別のフローの流れに表示されます。 - `snmp [[:port]]`:device はフローの送信元アドレスです。機器が別のアドレスで SNMP に応答する場合は管理アドレスを追加します。SNMP で読み取ったインターフェースの説明は、`iface` で名前を付けていない限りインターフェース名として使われます。機器の SNMP アクセスリストで traffic66 のマシンを許可してください。 - 変更は **保存** をクリックすると反映されます。再起動は不要です。 @@ -548,21 +548,23 @@ curl -L https://www.spamhaus.org/drop/drop.txt -o /threats/spamh | ページ | 分かること | |---|---| | 概要 | 現在のトラフィック量と先週との比較(アプリケーション別)、未対応の検知、上位のクライアントとサービス | +| 上位 66 | 上位 66 件を 1 つの表で表示。既定は会話(クライアント、サーバー、サービス、国)。どの列見出しでも並べ替えられます。数値の列(トラフィック、パケット数、平均パケット長、フロー数)は期間内の全トラフィックから上位 66 件を取り直すので、平均パケット長の小さい順でスキャンやフラッドが見つかります。**グループ化** でアプリケーション、ネットワーク、セグメント、機器、カプセル化、VLAN に切り替えられます | | 検知 | 対応が必要なもの:スキャン、パスワード総当たり、横展開、不審なアップロード、フラッド、脅威リストとの通信([詳しく](#findings)) | -| Top-N | 上位 66 件を 1 つの表で表示。既定は会話(クライアント、サーバー、サービス、国)。どの列見出しでも並べ替えられます。数値の列(トラフィック、パケット数、平均パケット長、フロー数)は期間内の全トラフィックから上位 66 件を取り直すので、平均パケット長の小さい順でスキャンやフラッドが見つかります。**グループ化** でアプリケーション、ネットワーク、セグメント、機器、カプセル化、VLAN に切り替えられます | -| フローの流れ | どのセグメントがどの国のどのアプリケーションと通信しているか | +| フローの流れ | どのホストがどの国に向けてどのアプリケーションを使っているか。通信量の多い 10 ホストを表示し、残りは「その他」にまとめます。**ネットワーク別** でホストの代わりにネットワークを表示します | | 地域とネットワーク | 国別・ネットワーク(AS)別のトラフィック | | 脅威インテル | 脅威リスト上のアドレスと通信したホストと、その送信量 | | フローレコード | 個々のフロー(新しい順、表示列は選択可能) | | インターフェース照合 | フローの数値とインターフェースカウンターの対比(差の大きい順、理由付き) | -| 受信状況 | 機器、サンプリング、ロス、コレクター、SNMP、国・ネットワークデータベース、**名前** | +| 受信状況 | 機器、サンプリング、ロス、コレクター、SNMP、国・ネットワークデータベース、ロゴ、**名前** | ページの上部には、時間範囲(15 分〜30 日)、検索ボックス(任意)、30 秒ごとの自動更新、そして **リンクをコピー** があります。**リンクをコピー** は、現在の表示(ページ、時間範囲、フィルター)そのものへのリンクをコピーするので、同僚に送るのに便利です。言語はブラウザーの設定に従い、メニューの一番下で変更できます。 -6 時間より長い時間範囲は正時から始まるため、ページ上のすべての数値がまったく同じ時間を集計します。「24 時間」は、直近の区切りのよい 24 時間に現在の 1 時間を加えた範囲です。これらの範囲の Top-N は 1 時間ごとの集計から作られるため、フィルターは使えません(ページにもその旨が表示されます)。フィルターを使うには短い範囲を選んでください。会話は常にフローの明細を読むため、フローの多い環境で長い範囲を選ぶと時間がかかることがあります。1 時間が最速です。 +6 時間より長い時間範囲は正時から始まるため、ページ上のすべての数値がまったく同じ時間を集計します。「24 時間」は、直近の区切りのよい 24 時間に現在の 1 時間を加えた範囲です。これらの範囲の上位 66 は 1 時間ごとの集計から作られるため、フィルターは使えません(ページにもその旨が表示されます)。フィルターを使うには短い範囲を選んでください。会話は常にフローの明細を読むため、フローの多い環境で長い範囲を選ぶと時間がかかることがあります。1 時間が最速です。 サイドメニューには、データが使っているディスク容量と空き容量が表示されます。空き容量にマウスを重ねると、現在のペースで明細を保持日数分残すのに必要な容量が分かります(1 日分のデータがたまると推定されます)。 +サインイン画面とメニュー上部に独自のロゴを表示するには、**受信状況 → ロゴ → ロゴをアップロード…** を使います。PNG、SVG、JPEG、WebP、GIF に対応し、1 MB まで、推奨サイズは 272 × 92 ピクセルです(他のサイズは収まるように縮小・拡大されます)。**内蔵ロゴに戻す** で traffic66 のロゴに戻ります。 + ### 検知 @@ -587,11 +589,11 @@ curl -L https://www.spamhaus.org/drop/drop.txt -o /threats/spamh ![検知:攻撃の各段階を 1:4096 の sFlow サンプリング越しに検知](images/findings.png) -![Top-N:直近 1 時間の会話上位 66 件](images/topn.png) +![上位 66:直近 1 時間の会話上位 66 件](images/topn.png) ![1 台のホストの詳細:そのホストに関する検知、トラフィック、通信相手、サービス、国、最新のフロー](images/detail.png) -![フローの流れ:どのセグメントがどの国に向けてどのアプリケーションを使っているか](images/paths.png) +![フローの流れ:どのホストがどの国に向けてどのアプリケーションを使っているか](images/paths.png) 同じ概要画面の中国語版です。すべてのページが 13 言語で表示できます: @@ -613,7 +615,7 @@ traffic66 のマシン上では、データディレクトリを読み取れれ ![ターミナル UI:概要](images/tui-overview.png) -![ターミナル UI:Top-N 会話](images/tui-topn.png) +![ターミナル UI:上位 66 の会話](images/tui-topn.png) @@ -744,6 +746,7 @@ traffic66 -data /var/lib/traffic66 -listen "sflow=:6343,netflow=:2055,ipfix=:473 | `traffic66.duckdb` | 集計、インターフェースカウンター、現在の 1 時間分 | | `password` | ログインパスワード(ハッシュ化) | | `inventory.txt` | 名前(**受信状況 → 名前**) | +| `logo.png`(または `.svg`、`.jpg`、`.webp`、`.gif`) | アップロードしたロゴ(**受信状況 → ロゴ**)。アップロードした場合のみ | | `country.mmdb`, `asn.mmdb`, `asn.tsv.gz`, `threats/` | 追加した国・ネットワークデータベースと脅威リスト | **データの保存期間**:フロー明細は 30 日、集計(概要と長い期間)は 400 日です。それより古いデータは自動で削除され、5 分ごとに確認します。それ以外は何も削除せず、ほかの制限もありません。明細の保存日数は `-retention-days` で変更でき、何日でも指定できます(例:`-retention-days 365`)。ディスク使用量もそれに応じて増えます。保存日数分が入りきらないときは、サイドメニューの **空き** が赤くなります。ディスクが満杯になると、空きができるまで新しいフローは保存できません。 diff --git a/docs/README.ko.md b/docs/README.ko.md index 1ab72d5..7cc1c93 100644 --- a/docs/README.ko.md +++ b/docs/README.ko.md @@ -570,7 +570,7 @@ snmp 192.0.2.9 s3cret 10.99.0.9:161 - `net`: 사설 대역(10/8, 172.16/12, 192.168/16, 100.64/10)은 항상 자체 네트워크로 취급됩니다. 공인 대역도 추가하면 그 대역을 오가는 트래픽도 자체 트래픽으로 집계됩니다. - 이름은 **Top-N → 세그먼트**와 트래픽 경로에 표시됩니다. + 이름은 세그먼트로 묶은 **Top 66**과 세그먼트별 트래픽 경로에 표시됩니다. - `snmp [[:port]]`: device는 플로를 보내는 주소입니다. 장비가 다른 주소로 SNMP에 응답한다면 관리 주소를 추가합니다. SNMP로 읽은 인터페이스 설명은 `iface`로 이름을 붙이지 않은 경우 인터페이스 이름으로 쓰입니다. 장비의 @@ -638,14 +638,14 @@ curl -L https://www.spamhaus.org/drop/drop.txt -o /threats/spamh | 페이지 | 알 수 있는 것 | |---|---| | 개요 | 현재 트래픽 양과 지난주 대비 변화(애플리케이션별), 미처리 탐지, 상위 클라이언트와 서비스 | +| Top 66 | 상위 66개를 담은 하나의 표: 기본은 대화(클라이언트, 서버, 서비스, 국가). 모든 열 제목으로 정렬할 수 있고, 숫자 열(트래픽, 패킷, 평균 패킷 크기, 플로)은 기간 내 전체 트래픽에서 상위 66개를 다시 뽑으므로 평균 패킷 크기가 작은 순으로 스캔과 플러드를 찾을 수 있습니다. **그룹 기준**에서 애플리케이션, 네트워크, 세그먼트, 장비, 캡슐화, VLAN으로 바꿀 수 있습니다 | | 탐지 | 살펴봐야 할 것: 스캔, 비밀번호 대입, 내부 확산, 비정상 업로드, 플러드, 위협 목록 트래픽([자세히](#findings)) | -| Top-N | 상위 66개를 담은 하나의 표: 기본은 대화(클라이언트, 서버, 서비스, 국가). 모든 열 제목으로 정렬할 수 있고, 숫자 열(트래픽, 패킷, 평균 패킷 크기, 플로)은 기간 내 전체 트래픽에서 상위 66개를 다시 뽑으므로 평균 패킷 크기가 작은 순으로 스캔과 플러드를 찾을 수 있습니다. **그룹 기준**에서 애플리케이션, 네트워크, 세그먼트, 장비, 캡슐화, VLAN으로 바꿀 수 있습니다 | -| 트래픽 경로 | 어느 세그먼트가 어느 국가의 어느 애플리케이션과 통신하는지 | +| 트래픽 경로 | 어느 호스트가 어느 국가로 어느 애플리케이션을 쓰는지: 트래픽이 가장 많은 호스트 10개, 나머지는 기타로 묶음. **세그먼트별**은 호스트 대신 세그먼트를 보여 줍니다 | | 지역 및 네트워크 | 국가별, 네트워크(AS)별 트래픽 | | 위협 정보 | 위협 목록에 있는 주소와 통신한 호스트와 그 전송량 | | 플로 레코드 | 개별 플로, 최신순, 표시할 열 선택 가능 | | 인터페이스 대조 | 플로 수치와 인터페이스 카운터 비교, 차이가 큰 순, 원인 포함 | -| 수집 상태 | 장비, 샘플링, 유실, 수집기, SNMP, 국가 및 네트워크 데이터베이스, **이름** | +| 수집 상태 | 장비, 샘플링, 유실, 수집기, SNMP, 국가 및 네트워크 데이터베이스, 로고, **이름** | 페이지 위쪽에는 시간 범위(15분~30일), 선택적 검색 상자, 30초마다 자동 새로 고침, 그리고 **링크 복사**가 있습니다. **링크 복사**는 현재 보고 있는 화면(페이지, 시간 범위, 필터) 그대로의 @@ -653,7 +653,7 @@ curl -L https://www.spamhaus.org/drop/drop.txt -o /threats/spamh 아래에서 바꿀 수 있습니다. 6시간보다 긴 범위는 정시에 시작하므로 페이지의 모든 수치가 정확히 같은 시간을 집계합니다. -"24시간"은 지난 24개의 온전한 시간에 현재 시간을 더한 범위입니다. 이런 범위의 Top-N은 +"24시간"은 지난 24개의 온전한 시간에 현재 시간을 더한 범위입니다. 이런 범위의 Top 66은 시간 단위 요약에서 가져오므로 필터를 쓸 수 없으며, 페이지에도 그렇게 표시됩니다. 필터를 쓰려면 더 짧은 범위를 선택하십시오. 대화는 항상 플로 상세를 읽으므로 플로가 많은 환경에서 긴 범위를 고르면 시간이 걸릴 수 있습니다. 1시간이 가장 빠릅니다. @@ -662,6 +662,10 @@ curl -L https://www.spamhaus.org/drop/drop.txt -o /threats/spamh 올리면 현재 속도로 상세 데이터를 보관 일수만큼 유지하는 데 필요한 용량을 볼 수 있습니다 (하루치 데이터가 쌓이면 추정됨). +로그인 화면과 메뉴 맨 위에 자체 로고를 표시하려면 **수집 상태 → 로고 → 로고 업로드…**를 +사용하십시오. PNG, SVG, JPEG, WebP 또는 GIF, 최대 1 MB이며 272 × 92 픽셀이 가장 좋습니다 +(다른 크기는 맞춰서 조정됨). **기본 로고로 되돌리기**를 누르면 traffic66 로고로 돌아갑니다. + ### 탐지 @@ -698,11 +702,11 @@ curl -L https://www.spamhaus.org/drop/drop.txt -o /threats/spamh ![탐지: 1:4096 sFlow 샘플링을 거쳐 찾아낸 공격의 모든 단계](images/findings.png) -![Top-N: 최근 1시간의 상위 66개 대화](images/topn.png) +![Top 66: 최근 1시간의 상위 66개 대화](images/topn.png) ![호스트 하나의 상세: 그 호스트에 관한 탐지, 트래픽, 통신 상대, 서비스, 국가, 최근 플로](images/detail.png) -![트래픽 경로: 어느 세그먼트가 어느 국가로 어느 애플리케이션을 쓰는지](images/paths.png) +![트래픽 경로: 어느 호스트가 어느 국가로 어느 애플리케이션을 쓰는지](images/paths.png) 같은 개요 화면의 중국어 버전입니다. 모든 페이지를 13개 언어로 볼 수 있습니다: @@ -728,7 +732,7 @@ t 시간 범위, c 필터 해제, w 같은 화면을 브라우저에서 열기, ![터미널 UI: 개요](images/tui-overview.png) -![터미널 UI: Top-N 대화](images/tui-topn.png) +![터미널 UI: Top 66 대화](images/tui-topn.png) @@ -872,6 +876,7 @@ traffic66 -data /var/lib/traffic66 -listen "sflow=:6343,netflow=:2055,ipfix=:473 | `traffic66.duckdb` | 요약, 인터페이스 카운터, 현재 시간대 데이터 | | `password` | 로그인 비밀번호(해시) | | `inventory.txt` | 이름(**수집 상태 → 이름**) | +| `logo.png`(또는 `.svg`, `.jpg`, `.webp`, `.gif`) | 업로드한 경우 내 로고(**수집 상태 → 로고**) | | `country.mmdb`, `asn.mmdb`, `asn.tsv.gz`, `threats/` | 추가한 국가 및 네트워크 데이터베이스와 위협 목록 | **데이터 보존 기간**: 플로 상세는 30일, 요약(개요와 긴 기간)은 400일입니다. 그보다 오래된 데이터는 자동으로 삭제되며 5분마다 확인합니다. diff --git a/docs/README.pt.md b/docs/README.pt.md index 30e764a..bfaf766 100644 --- a/docs/README.pt.md +++ b/docs/README.pt.md @@ -602,7 +602,7 @@ snmp 192.0.2.9 s3cret 10.99.0.9:161 - `net`: as faixas privadas (10/8, 172.16/12, 192.168/16, 100.64/10) são sempre consideradas suas. Adicione suas faixas públicas para que o tráfego de e para elas também conte como seu; o nome aparece em - **Top-N → Segmentos** e nos caminhos do tráfego. + **Top 66** agrupado por segmento e nos caminhos do tráfego por segmento. - `snmp [[:port]]`: o equipamento é o endereço de onde vêm os fluxos. Adicione o endereço de gerência quando o equipamento responder SNMP em outro endereço. As descrições de @@ -679,14 +679,14 @@ Páginas: | Página | O que responde | |---|---| | Visão geral | Quanto tráfego há agora e em comparação com a semana passada, por aplicação; detecções abertas; principais clientes e serviços | +| Top 66 | Uma única tabela dos 66 maiores: por padrão, conversas (cliente, servidor, serviço, país). Qualquer cabeçalho ordena; as colunas numéricas (tráfego, pacotes, pacote médio, fluxos) classificam todo o tráfego do período, então o menor pacote médio revela varreduras e inundações. **Agrupar por** muda para aplicações, redes, segmentos, equipamentos, encapsulamento e VLAN | | 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)) | -| Top-N | Uma única tabela dos 66 maiores: por padrão, conversas (cliente, servidor, serviço, país). Qualquer cabeçalho ordena; as colunas numéricas (tráfego, pacotes, pacote médio, fluxos) classificam todo o tráfego do período, então o menor pacote médio revela varreduras e inundações. **Agrupar por** muda para aplicações, redes, segmentos, equipamentos, encapsulamento e VLAN | -| Caminhos do tráfego | Qual segmento fala com qual aplicação em qual país | +| Caminhos do tráfego | Qual host usa qual aplicação para qual país: os 10 hosts com mais tráfego, o resto como Outros. **Por segmento** mostra segmentos em vez de hosts | | Geografia e redes | Tráfego por país e por rede (AS) | | Ameaças | Hosts que se comunicaram com endereços das suas listas de ameaças, e quanto enviaram | | Registros de fluxo | Fluxos individuais, dos mais recentes para os mais antigos, com colunas selecionáveis | | Conferência de interfaces | Números de fluxo ao lado dos contadores de interface, piores primeiro, com os motivos | -| Fontes | Equipamentos, amostragem, perdas, coletores, SNMP, o banco de dados de países e redes, e **Nomes** | +| Fontes | Equipamentos, amostragem, perdas, coletores, SNMP, o banco de dados de países e redes, o logotipo e **Nomes** | Acima das páginas: intervalo de tempo (de 15 minutos a 30 dias), uma caixa de busca opcional, atualização automática a cada 30 segundos e @@ -696,7 +696,7 @@ navegador; dá para trocar no fim do menu. Intervalos maiores que 6 horas começam em uma hora cheia, para que todos os números da página contem exatamente o mesmo tempo: "24 horas" cobre as -últimas 24 horas cheias mais a atual. Nesses intervalos, o Top-N vem de +últimas 24 horas cheias mais a atual. Nesses intervalos, o Top 66 vem de resumos por hora; lá não há filtros, e a página avisa. Escolha um intervalo menor para filtrar. As conversas sempre leem o detalhe dos fluxos, então em intervalos longos com muitos fluxos podem demorar; uma hora é o mais rápido. @@ -705,6 +705,11 @@ O menu lateral mostra quanto disco os dados usam e quanto está livre; passe o mouse sobre o espaço livre para ver quanto os dias de detalhe mantidos precisam no ritmo atual (estimado assim que houver um dia de dados). +Para mostrar o seu próprio logotipo na página de login e no topo do menu, +use **Fontes → Logotipo → Enviar um logotipo…**: PNG, SVG, JPEG, WebP ou +GIF, até 1 MB, de preferência com 272 × 92 pixels (outros tamanhos são +ajustados). **Usar o logotipo embutido** volta ao do traffic66. + ### Detecções @@ -747,11 +752,11 @@ nenhuma detecção, exceto o scanner da internet batendo no site. ![Detecções: cada etapa de um ataque, encontrada através de amostragem sFlow 1:4096](images/findings.png) -![Top-N: as 66 maiores conversas da última hora](images/topn.png) +![Top 66: as 66 maiores conversas da última hora](images/topn.png) ![Detalhes de um host: as detecções sobre ele, o tráfego, com quem fala, serviços, países e fluxos mais recentes](images/detail.png) -![Caminhos do tráfego: qual segmento usa qual aplicação para qual país](images/paths.png) +![Caminhos do tráfego: qual host usa qual aplicação para qual país](images/paths.png) A mesma visão geral em chinês; todas as páginas estão disponíveis em 13 idiomas: @@ -779,7 +784,7 @@ w abrir a mesma visão no navegador, q sair. ![Interface de terminal: visão geral](images/tui-overview.png) -![Interface de terminal: Top-N de conversas](images/tui-topn.png) +![Interface de terminal: Top 66 de conversas](images/tui-topn.png) @@ -929,6 +934,7 @@ O diretório de dados guarda tudo: | `traffic66.duckdb` | resumos, contadores de interface e a hora atual | | `password` | senhas de login (em hash) | | `inventory.txt` | nomes (**Fontes → Nomes**) | +| `logo.png` (ou `.svg`, `.jpg`, `.webp`, `.gif`) | seu logotipo (**Fontes → Logotipo**), se você enviou um | | `country.mmdb`, `asn.mmdb`, `asn.tsv.gz`, `threats/` | bancos de dados de países e redes e listas de ameaças que você adicionou | **Por quanto tempo os dados ficam**: o detalhe de fluxos 30 dias; os resumos (visão geral e períodos longos) diff --git a/docs/README.ru.md b/docs/README.ru.md index 20fb0a0..bca39d6 100644 --- a/docs/README.ru.md +++ b/docs/README.ru.md @@ -595,8 +595,8 @@ snmp 192.0.2.9 s3cret 10.99.0.9:161 - `net`: частные диапазоны (10/8, 172.16/12, 192.168/16, 100.64/10) всегда считаются вашими. Добавьте свои публичные диапазоны, чтобы трафик - к ним и от них тоже считался вашим; название появится в - **Top-N → Сегменты** и в путях трафика. + к ним и от них тоже считался вашим; название появится в **Топ 66** + при группировке по сегментам и в путях трафика по сетям. - `snmp [[:port]]`: устройство — это адрес, с которого приходят потоки. Укажите адрес управления, если устройство отвечает по SNMP на другом адресе. Описания интерфейсов, @@ -672,14 +672,14 @@ curl -L https://www.spamhaus.org/drop/drop.txt -o /threats/spamh | Страница | На какой вопрос отвечает | |---|---| | Обзор | Сколько трафика сейчас и по сравнению с прошлой неделей, по приложениям; открытые обнаружения; основные клиенты и сервисы | +| Топ 66 | Одна таблица топ 66: по умолчанию сеансы (клиент, сервер, сервис, страна). Любой заголовок сортирует; числовые столбцы (трафик, пакеты, средний пакет, потоки) заново выбирают топ 66 из всего трафика за период, поэтому наименьший средний пакет находит сканирования и флуд. **Группировать по** переключает на приложения, сети, сегменты, устройства, инкапсуляцию и VLAN | | Обнаружения | Что требует внимания: сканирования, подбор паролей, боковое перемещение, необычные выгрузки, флуд и трафик со списков угроз ([подробнее](#findings)) | -| Top-N | Одна таблица топ 66: по умолчанию сеансы (клиент, сервер, сервис, страна). Любой заголовок сортирует; числовые столбцы (трафик, пакеты, средний пакет, потоки) заново выбирают топ 66 из всего трафика за период, поэтому наименьший средний пакет находит сканирования и флуд. **Группировать по** переключает на приложения, сети, сегменты, устройства, инкапсуляцию и VLAN | -| Пути трафика | Какой сегмент обращается к какому приложению в какой стране | +| Пути трафика | Какой узел к какому приложению в какой стране обращается: 10 самых активных узлов, остальные как «Прочее». **По сегментам** показывает сети вместо узлов | | География и сети | Трафик по странам и по сетям (AS) | | Угрозы | Хосты, обращавшиеся к адресам из ваших списков угроз, и сколько они отправили | | Записи потоков | Отдельные потоки, новые сверху, с выбором столбцов | | Сверка интерфейсов | Цифры по потокам рядом со счётчиками интерфейсов, худшие сверху, с причинами | -| Источники | Устройства, сэмплирование, потери, коллекторы, SNMP, база стран и сетей и **Названия** | +| Источники | Устройства, сэмплирование, потери, коллекторы, SNMP, база стран и сетей, логотип и **Названия** | Над страницами: временной диапазон (от 15 минут до 30 дней), необязательная строка поиска, автообновление каждые 30 секунд и **Скопировать ссылку** — @@ -688,7 +688,7 @@ curl -L https://www.spamhaus.org/drop/drop.txt -o /threats/spamh Диапазоны длиннее 6 часов начинаются с целого часа, поэтому все цифры на странице считаются ровно за одно и то же время: «24 часа» — это последние 24 -целых часа плюс текущий. Top-N за такие диапазоны строится по почасовым +целых часа плюс текущий. Топ 66 за такие диапазоны строится по почасовым сводкам; фильтры там недоступны, и страница об этом сообщает. Чтобы фильтровать, выберите диапазон покороче. Сеансы всегда читаются из подробных данных потоков, поэтому на длинных диапазонах при большом числе потоков @@ -699,6 +699,11 @@ curl -L https://www.spamhaus.org/drop/drop.txt -o /threats/spamh нужно хранимым дням подробных данных при текущей нагрузке (оценка появляется, когда накопятся данные за сутки). +Чтобы показать свой логотип на странице входа и вверху меню, откройте +**Источники → Логотип → Загрузить логотип…**: PNG, SVG, JPEG, WebP или GIF, +до 1 MB, лучше всего 272 × 92 пикселя (другие размеры масштабируются). +**Вернуть встроенный логотип** возвращает логотип traffic66. + ### Обнаружения @@ -741,11 +746,11 @@ traffic66 учится на уже имеющейся истории. ![Обнаружения: все шаги атаки, найденные через сэмплирование sFlow 1:4096](images/findings.png) -![Top-N: топ 66 сеансов за последний час](images/topn.png) +![Топ 66: топ 66 сеансов за последний час](images/topn.png) ![Подробно об одном хосте: обнаружения по нему, его трафик, с кем он общается, сервисы, страны и последние потоки](images/detail.png) -![Пути трафика: какой сегмент к какому приложению в какой стране обращается](images/paths.png) +![Пути трафика: какой узел к какому приложению в какой стране обращается](images/paths.png) Тот же обзор на китайском; каждая страница доступна на 13 языках: @@ -773,7 +778,7 @@ c сбросить фильтры, w открыть тот же вид в бра ![Терминальный интерфейс: обзор](images/tui-overview.png) -![Терминальный интерфейс: Top-N сеансов](images/tui-topn.png) +![Терминальный интерфейс: Топ 66 сеансов](images/tui-topn.png) @@ -923,6 +928,7 @@ traffic66 -data /var/lib/traffic66 -listen "sflow=:6343,netflow=:2055,ipfix=:473 | `traffic66.duckdb` | сводки, счётчики интерфейсов и текущий час | | `password` | пароли для входа (в виде хешей) | | `inventory.txt` | названия (**Источники → Названия**) | +| `logo.png` (или `.svg`, `.jpg`, `.webp`, `.gif`) | ваш логотип (**Источники → Логотип**), если вы его загрузили | | `country.mmdb`, `asn.mmdb`, `asn.tsv.gz`, `threats/` | добавленные вами базы стран и сетей и списки угроз | **Сколько хранятся данные**: детализация потоков 30 дней, сводки (обзор и длинные периоды) 400 дней. Более diff --git a/docs/README.ur.md b/docs/README.ur.md index 35387c8..c79fd34 100644 --- a/docs/README.ur.md +++ b/docs/README.ur.md @@ -591,7 +591,8 @@ snmp 192.0.2.9 s3cret 10.99.0.9:161 - `net`: private ranges (10/8، 172.16/12، 192.168/16، 100.64/10) ہمیشہ آپ کی مانی جاتی ہیں۔ اپنی public ranges شامل کریں تاکہ ان سے آنے جانے والی ٹریفک بھی - آپ کی گنی جائے؛ نام **ٹاپ N → سیگمنٹس** میں اور flow کے راستوں میں نظر آتا ہے۔ + آپ کی گنی جائے؛ نام **ٹاپ 66** میں segment کے لحاظ سے گروپ بندی پر اور network + کے لحاظ سے flow کے راستوں میں نظر آتا ہے۔ - `snmp [[:port]]`: device وہ address ہے جہاں سے flows آتے ہیں۔ جب ڈیوائس SNMP کا جواب کسی دوسرے address پر دیتی ہو تو management address شامل کریں۔ SNMP سے پڑھی گئی interface descriptions بطور @@ -663,14 +664,14 @@ application، ملک، ڈیوائس — پر کلک کیا جا سکتا ہے: | صفحہ | کس سوال کا جواب دیتا ہے | |---|---| | جائزہ | ابھی کتنی ٹریفک ہے اور پچھلے ہفتے کے مقابلے میں کتنی، application کے حساب سے؛ کھلی مشتبہ سرگرمیاں؛ سرفہرست clients اور services | +| ٹاپ 66 | سرفہرست 66 کی ایک table: ڈیفالٹ طور پر conversations (client، server، service، ملک)۔ ہر column heading سے sort ہوتا ہے؛ عددی columns (ٹریفک، پیکٹ، اوسط پیکٹ، flows) وقت کی حد کے پورے ٹریفک سے سرفہرست 66 دوبارہ چنتے ہیں، اس لیے سب سے چھوٹے اوسط پیکٹ سے scan اور flood پکڑے جاتے ہیں۔ **گروپ بندی بلحاظ** سے applications، نیٹ ورکس، segments، ڈیوائسز، encapsulation اور VLAN پر جائیں | | مشتبہ سرگرمی | کس چیز پر توجہ چاہیے: scans، پاس ورڈ کا اندازہ، lateral movement، غیر معمولی uploads، floods اور threat list والی ٹریفک ([مزید](#findings)) | -| ٹاپ N | سرفہرست 66 کی ایک table: ڈیفالٹ طور پر conversations (client، server، service، ملک)۔ ہر column heading سے sort ہوتا ہے؛ عددی columns (ٹریفک، پیکٹ، اوسط پیکٹ، flows) وقت کی حد کے پورے ٹریفک سے سرفہرست 66 دوبارہ چنتے ہیں، اس لیے سب سے چھوٹے اوسط پیکٹ سے scan اور flood پکڑے جاتے ہیں۔ **گروپ بندی بلحاظ** سے applications، نیٹ ورکس، segments، ڈیوائسز، encapsulation اور VLAN پر جائیں | -| ٹریفک کے راستے | کون سا segment کس ملک میں کس application سے بات کرتا ہے | +| ٹریفک کے راستے | کون سا host کس ملک کی طرف کون سی application استعمال کرتا ہے: 10 سب سے مصروف hosts، باقی "دیگر" کے طور پر۔ **سیگمنٹ کے لحاظ سے** hosts کی جگہ نیٹ ورکس دکھاتا ہے | | مقامات اور نیٹ ورک | ملک کے حساب سے اور نیٹ ورک (AS) کے حساب سے ٹریفک | | خطرے کی معلومات | وہ hosts جنہوں نے آپ کی threat lists کے addresses سے بات کی، اور کتنا بھیجا | | فلو ریکارڈ | انفرادی flows، نئے پہلے، منتخب کیے جا سکنے والے columns کے ساتھ | | انٹرفیس جانچ | interface counters کے ساتھ flow کے اعداد، بدترین پہلے، وجوہات کے ساتھ | -| ذرائع | ڈیوائسز، sampling، loss، collectors، SNMP، ممالک اور نیٹ ورکس کا ڈیٹابیس، اور **نام** | +| ذرائع | ڈیوائسز، sampling، loss، collectors، SNMP، ممالک اور نیٹ ورکس کا ڈیٹابیس، لوگو، اور **نام** | صفحات کے اوپر: time range (15 منٹ سے 30 دن)، ایک اختیاری search box، ہر 30 سیکنڈ پر automatic refresh، اور **لنک کاپی کریں**، جو بالکل موجودہ view (صفحہ، @@ -679,7 +680,7 @@ time range اور filters) کا link کاپی کرتا ہے تاکہ آپ اسے 6 گھنٹے سے لمبی ranges پورے گھنٹے سے شروع ہوتی ہیں، تاکہ صفحے کا ہر عدد بالکل ایک ہی وقت گنے: "24 گھنٹے" میں آخری 24 پورے گھنٹے اور موجودہ گھنٹہ -شامل ہیں۔ ان ranges پر ٹاپ N گھنٹہ وار summaries سے آتا ہے؛ وہاں filters +شامل ہیں۔ ان ranges پر ٹاپ 66 گھنٹہ وار summaries سے آتا ہے؛ وہاں filters دستیاب نہیں، اور صفحہ یہ بتا دیتا ہے۔ filter کرنے کے لیے چھوٹی range چنیں۔ گفتگو (conversations) ہمیشہ flow کی تفصیل پڑھتی ہے، اس لیے زیادہ flow rates پر لمبی ranges میں اس میں کچھ وقت لگ سکتا ہے؛ ایک گھنٹہ سب سے تیز ہے۔ @@ -687,6 +688,11 @@ time range اور filters) کا link کاپی کرتا ہے تاکہ آپ اسے جگہ پر hover کریں تو پتا چلتا ہے کہ موجودہ رفتار پر رکھے گئے دنوں کی تفصیل کو کتنی جگہ چاہیے (ایک دن کا data جمع ہونے کے بعد اندازہ لگایا جاتا ہے)۔ +سائن اِن پیج پر اور menu کے اوپر اپنا لوگو دکھانے کے لیے +**ذرائع → لوگو → لوگو اپ لوڈ کریں…** استعمال کریں: PNG، SVG، JPEG، WebP یا GIF، +1 MB تک، 272 × 92 pixels پر بہترین (دوسرے سائز فٹ ہونے کے لیے scale کیے جاتے +ہیں)۔ **بلٹ اِن لوگو پر واپس جائیں** سے traffic66 کا لوگو واپس آ جاتا ہے۔ + ### مشتبہ سرگرمی @@ -728,11 +734,11 @@ packets بھیجتا ہے کہ نظر نہیں آتا۔ ڈیمو کا حملہ ![مشتبہ سرگرمی: ایک حملے کا ہر مرحلہ، 1:4096 sFlow sampling کے باوجود پکڑا گیا](images/findings.png) -![ٹاپ N: پچھلے گھنٹے کی top 66 conversations](images/topn.png) +![ٹاپ 66: پچھلے گھنٹے کی top 66 conversations](images/topn.png) ![ایک host کی تفصیل: اس کے بارے میں مشتبہ سرگرمیاں، اس کی ٹریفک، وہ کس سے بات کرتا ہے، services، ممالک اور تازہ ترین flows](images/detail.png) -![ٹریفک کے راستے: کون سا segment کس ملک کی طرف کون سی application استعمال کرتا ہے](images/paths.png) +![ٹریفک کے راستے: کون سا host کس ملک کی طرف کون سی application استعمال کرتا ہے](images/paths.png) یہی جائزہ چینی زبان میں؛ ہر صفحہ 13 زبانوں میں دستیاب ہے: @@ -760,7 +766,7 @@ browser میں کھولیں، q باہر نکلیں۔ ![Terminal UI: جائزہ](images/tui-overview.png) -![Terminal UI: ٹاپ N conversations](images/tui-topn.png) +![Terminal UI: ٹاپ 66 conversations](images/tui-topn.png) @@ -907,6 +913,7 @@ traffic66 -data /var/lib/traffic66 -listen "sflow=:6343,netflow=:2055,ipfix=:473 | `traffic66.duckdb` | summaries، interface counters اور موجودہ گھنٹہ | | `password` | login پاس ورڈز (hashed) | | `inventory.txt` | نام (**ذرائع → نام**) | +| `logo.png` (یا `.svg`، `.jpg`، `.webp`، `.gif`) | آپ کا لوگو (**ذرائع → لوگو**)، اگر آپ نے اپ لوڈ کیا ہو | | `country.mmdb`، `asn.mmdb`، `asn.tsv.gz`، `threats/` | آپ کے شامل کردہ ممالک اور نیٹ ورکس کے databases اور threat lists | **ڈیٹا کتنی دیر رکھا جاتا ہے**: flow detail 30 دن، summaries (overview اور لمبی مدتیں) 400 دن۔ اس سے پرانا diff --git a/docs/README.zh.md b/docs/README.zh.md index fe1541c..44f711d 100644 --- a/docs/README.zh.md +++ b/docs/README.zh.md @@ -497,7 +497,7 @@ snmp 192.0.2.1 public snmp 192.0.2.9 s3cret 10.99.0.9:161 ``` -- `net`:私网地址段(10/8、172.16/12、192.168/16、100.64/10)始终视为自有网段。把你的公网地址段也加进来,进出这些地址的流量才会算作内部流量;名称会显示在 **Top-N → 网段** 和流向图中。 +- `net`:私网地址段(10/8、172.16/12、192.168/16、100.64/10)始终视为自有网段。把你的公网地址段也加进来,进出这些地址的流量才会算作内部流量;名称会显示在按网段分组的 **Top 66** 和按网段查看的流向图中。 - `snmp [[:port]]`:device 是流数据的来源地址。如果设备在另一个地址上响应 SNMP,请加上管理地址。通过 SNMP 读到的接口描述会用作接口名,除非你已用 `iface` 为该接口命名。记得在设备的 SNMP 访问控制列表中放行 traffic66 主机。 - 点击 **保存** 后即生效,无需重启。 @@ -548,21 +548,23 @@ curl -L https://www.spamhaus.org/drop/drop.txt -o /threats/spamh | 页面 | 回答什么问题 | |---|---| | 概览 | 当前流量多大、与上周相比如何,按应用拆分;未处理的发现;主要客户端和服务 | +| Top 66 | 一张前 66 名的表:默认是会话(客户端、服务器、服务、国家)。每个列标题都能排序;数字列(流量、包数、平均包长、流数)按时间范围内的全部流量重新取前 66 名,按平均包长从小到大排能找出扫描和泛洪。**分组方式** 可切换到应用、网络、网段、设备、封装和 VLAN | | 发现 | 哪些需要处理:扫描、暴力破解、横向移动、异常上传、泛洪和威胁情报流量([详见](#findings)) | -| Top-N | 一张前 66 名的表:默认是会话(客户端、服务器、服务、国家)。每个列标题都能排序;数字列(流量、包数、平均包长、流数)按时间范围内的全部流量重新取前 66 名,按平均包长从小到大排能找出扫描和泛洪。**分组方式** 可切换到应用、网络、网段、设备、封装和 VLAN | -| 流向 | 哪个网段在访问哪个国家的哪个应用 | +| 流向 | 哪台主机在访问哪个国家的哪个应用:流量最大的 10 台主机,其余归为“其他”。**按网段** 显示网段而不是主机 | | 地理与运营商 | 按国家和按网络(AS)统计的流量 | | 威胁情报 | 与威胁情报列表中地址有通信的主机,以及它们发送了多少流量 | | 流记录 | 单条流记录,最新的在前,可选择显示列 | | 接口对账 | 流统计与接口计数器并列对比,差异最大的在前,附原因 | -| 接入 | 设备、采样、丢包、采集器、SNMP、国家和运营商数据库,以及 **名称** | +| 接入 | 设备、采样、丢包、采集器、SNMP、国家和运营商数据库、Logo,以及 **名称** | 页面上方有:时间范围(15 分钟到 30 天)、可选的搜索框、每 30 秒自动刷新,以及**复制链接**——复制一个精确指向当前视图(页面、时间范围和过滤条件)的链接,方便发给同事。界面语言跟随浏览器设置,可在菜单底部切换。 -超过 6 小时的时间范围从整点开始,因此页面上的每个数字统计的都是完全相同的时间段:“24 小时”涵盖最近 24 个完整小时加上当前这一小时。这些范围的 Top-N 来自小时汇总数据,无法使用过滤条件,页面上也会有提示。需要过滤时请选择较短的时间范围。会话始终读取流明细,因此在流量速率高时选择长时间范围可能需要等一会儿;1 小时最快。 +超过 6 小时的时间范围从整点开始,因此页面上的每个数字统计的都是完全相同的时间段:“24 小时”涵盖最近 24 个完整小时加上当前这一小时。这些范围的 Top 66 来自小时汇总数据,无法使用过滤条件,页面上也会有提示。需要过滤时请选择较短的时间范围。会话始终读取流明细,因此在流量速率高时选择长时间范围可能需要等一会儿;1 小时最快。 侧边菜单显示数据占用了多少磁盘、还剩多少空间;鼠标悬停在剩余空间上,可以看到按当前速率保留各天明细所需的空间(有一天的数据后开始估算)。 +要在登录页和菜单顶部显示你自己的 Logo,请使用 **接入 → Logo → 上传 Logo…**:支持 PNG、SVG、JPEG、WebP 或 GIF,最大 1 MB,最佳尺寸 272 × 92 像素(其他尺寸会缩放以适应)。**恢复内置 Logo** 可改回 traffic66 自带的 Logo。 + ### 发现 @@ -587,11 +589,11 @@ curl -L https://www.spamhaus.org/drop/drop.txt -o /threats/spamh ![发现:攻击的每一步,均通过 1:4096 的 sFlow 采样发现](images/findings.png) -![Top-N:最近一小时的前 66 个会话](images/topn.png) +![Top 66:最近一小时的前 66 个会话](images/topn.png) ![单台主机的详情:与它相关的发现、它的流量、在和谁通信、服务、国家和最新流记录](images/detail.png) -![流向:哪个网段在访问哪个国家的哪个应用](images/paths.png) +![流向:哪台主机在访问哪个国家的哪个应用](images/paths.png) 同一个概览的中文界面;所有页面都支持 13 种语言: @@ -613,7 +615,7 @@ traffic66 -tui # collect and show the termina ![终端界面:概览](images/tui-overview.png) -![终端界面:Top-N 会话](images/tui-topn.png) +![终端界面:Top 66 会话](images/tui-topn.png) @@ -744,6 +746,7 @@ traffic66 -data /var/lib/traffic66 -listen "sflow=:6343,netflow=:2055,ipfix=:473 | `traffic66.duckdb` | 汇总数据、接口计数器和当前小时的数据 | | `password` | 登录密码(哈希) | | `inventory.txt` | 名称(**接入 → 名称**) | +| `logo.png`(或 `.svg`、`.jpg`、`.webp`、`.gif`) | 你的 Logo(**接入 → Logo**),如果上传过 | | `country.mmdb`, `asn.mmdb`, `asn.tsv.gz`, `threats/` | 你添加的国家和运营商数据库以及威胁情报列表 | **数据保留多久**:流明细 30 天,汇总(总览和长时间范围)400 天。更早的数据自动删除,每 5 分钟检查一次;除此之外不删任何数据,也没有其他限制。用 `-retention-days` 修改明细保留天数,任意天数都可以,例如 `-retention-days 365`。占用的磁盘随之增长:保留天数放不下时,侧边栏的 **可用** 会变红。磁盘写满后,新的流无法保存,直到腾出空间。 diff --git a/docs/images/detail.png b/docs/images/detail.png index b5a4950..6fdb130 100644 Binary files a/docs/images/detail.png and b/docs/images/detail.png differ diff --git a/docs/images/findings.png b/docs/images/findings.png index d6538cf..d360149 100644 Binary files a/docs/images/findings.png and b/docs/images/findings.png differ diff --git a/docs/images/interfaces.png b/docs/images/interfaces.png index f5b4b58..1e12f52 100644 Binary files a/docs/images/interfaces.png and b/docs/images/interfaces.png differ diff --git a/docs/images/overview-zh.png b/docs/images/overview-zh.png index dcc6689..28b1a02 100644 Binary files a/docs/images/overview-zh.png and b/docs/images/overview-zh.png differ diff --git a/docs/images/overview.png b/docs/images/overview.png index 7273cf4..7640cf8 100644 Binary files a/docs/images/overview.png and b/docs/images/overview.png differ diff --git a/docs/images/paths.png b/docs/images/paths.png index 5116825..5ab0092 100644 Binary files a/docs/images/paths.png and b/docs/images/paths.png differ diff --git a/docs/images/sources.png b/docs/images/sources.png index 7993953..d669a85 100644 Binary files a/docs/images/sources.png and b/docs/images/sources.png differ diff --git a/docs/images/threats.png b/docs/images/threats.png index 17163f5..98d7d5a 100644 Binary files a/docs/images/threats.png and b/docs/images/threats.png differ diff --git a/docs/images/topn.png b/docs/images/topn.png index c8077d5..2752929 100644 Binary files a/docs/images/topn.png and b/docs/images/topn.png differ diff --git a/docs/images/tui-overview.png b/docs/images/tui-overview.png index 9c352e6..b5b8589 100644 Binary files a/docs/images/tui-overview.png and b/docs/images/tui-overview.png differ diff --git a/docs/images/tui-topn.png b/docs/images/tui-topn.png index 5e98010..3b58181 100644 Binary files a/docs/images/tui-topn.png and b/docs/images/tui-topn.png differ diff --git a/internal/api/handlers.go b/internal/api/handlers.go index 71d9b17..c10fdfd 100644 --- a/internal/api/handlers.go +++ b/internal/api/handlers.go @@ -238,13 +238,15 @@ func (s *Server) sankey(w http.ResponseWriter, r *http.Request) { fail(w, err) return } - links, err := s.Store.Sankey(q) + byHost := r.URL.Query().Get("by") != "segment" + links, err := s.Store.Sankey(q, byHost, 10) if err != nil { fail(w, err) return } - // keep the 6 largest nodes per column, fold the rest into "__other__" - top := func(get func(store.SankeyLink) string) map[string]bool { + // keep the largest nodes per column (10 hosts or 6 segments, 6 + // applications, 6 countries), fold the rest into "__other__" + top := func(get func(store.SankeyLink) string, n ...int) map[string]bool { t := map[string]uint64{} for _, l := range links { t[get(l)] += l.Wire @@ -255,14 +257,22 @@ func (s *Server) sankey(w http.ResponseWriter, r *http.Request) { } sort.Slice(keys, func(i, j int) bool { return t[keys[i]] > t[keys[j]] }) m := map[string]bool{} + limit := 6 + if len(n) > 0 { + limit = n[0] + } for i, k := range keys { - if i < 6 { + if i < limit && k != "__other__" { m[k] = true } } return m } - ks := top(func(l store.SankeyLink) string { return l.Seg }) + first := 6 + if byHost { + first = 10 + } + ks := top(func(l store.SankeyLink) string { return l.Seg }, first) ka := top(func(l store.SankeyLink) string { return l.App }) kc := top(func(l store.SankeyLink) string { return l.CC }) fold := func(m map[string]bool, k string) string { @@ -289,7 +299,11 @@ func (s *Server) sankey(w http.ResponseWriter, r *http.Request) { sort.Slice(out, func(i, j int) bool { return out[i].V > out[j].V }) return out } - writeJSON(w, http.StatusOK, map[string]any{"seg_app": flat(l1), "app_cc": flat(l2)}) + by := "segment" + if byHost { + by = "host" + } + writeJSON(w, http.StatusOK, map[string]any{"by": by, "seg_app": flat(l1), "app_cc": flat(l2)}) } func (s *Server) records(w http.ResponseWriter, r *http.Request) { diff --git a/internal/api/logo.go b/internal/api/logo.go new file mode 100644 index 0000000..852bd61 --- /dev/null +++ b/internal/api/logo.go @@ -0,0 +1,108 @@ +package api + +import ( + "bytes" + "errors" + "fmt" + "io" + "io/fs" + "log" + "net/http" + "os" + "path/filepath" +) + +// maxLogo bounds an uploaded logo. +const maxLogo = 1 << 20 + +var logoTypes = map[string]string{"svg": "image/svg+xml", "png": "image/png", "jpg": "image/jpeg", "webp": "image/webp", "gif": "image/gif"} + +// logoKind tells an image's type from its first bytes. +func logoKind(b []byte) string { + switch { + case bytes.HasPrefix(b, []byte("\x89PNG\r\n\x1a\n")): + return "png" + case bytes.HasPrefix(b, []byte{0xff, 0xd8, 0xff}): + return "jpg" + case len(b) > 12 && bytes.HasPrefix(b, []byte("RIFF")) && string(b[8:12]) == "WEBP": + return "webp" + case bytes.HasPrefix(b, []byte("GIF8")): + return "gif" + } + head := bytes.ToLower(b[:min(len(b), 1024)]) + if bytes.Contains(head, []byte("`)); c != 200 { + t.Fatal("svg rejected", c) + } + if _, err := os.Stat(filepath.Join(dir, "logo.png")); err == nil { + t.Fatal("old logo kept beside the new one") + } + if c := put([]byte("hello")); c != 400 { + t.Fatal("text accepted as a logo", c) + } + if c := put(make([]byte, maxLogo+1)); c != 400 { + t.Fatal("oversized logo accepted", c) + } + w := httptest.NewRecorder() + s.deleteLogo(w, httptest.NewRequest("DELETE", "/api/logo", nil)) + if ct, _ := get(); ct != "image/svg+xml" { + t.Fatal("reset did not restore the built-in logo") + } + w = httptest.NewRecorder() + s.logo(w, httptest.NewRequest("GET", "/logo", nil)) + if !strings.Contains(w.Header().Get("Content-Security-Policy"), "sandbox") { + t.Fatal("logo served without sandbox") + } +} diff --git a/internal/api/server.go b/internal/api/server.go index 896c060..bf3f759 100644 --- a/internal/api/server.go +++ b/internal/api/server.go @@ -79,6 +79,7 @@ func (s *Server) Handler() http.Handler { mux := http.NewServeMux() mux.HandleFunc("POST /api/login", s.login) mux.HandleFunc("POST /api/logout", s.logout) + mux.HandleFunc("GET /logo", s.logo) api := func(pattern string, h http.HandlerFunc) { mux.Handle(pattern, s.auth(h)) } api("GET /api/status", s.status) api("GET /api/overview", s.overview) @@ -94,6 +95,8 @@ func (s *Server) Handler() http.Handler { api("POST /api/inventory", s.putInventory) api("GET /api/findings", s.findings) api("POST /api/findings", s.setFindings) + api("POST /api/logo", s.putLogo) + api("DELETE /api/logo", s.deleteLogo) api("GET /api/geo", s.getGeo) api("POST /api/geo", s.putGeo) static := http.FileServer(http.FS(s.Static)) diff --git a/internal/store/query.go b/internal/store/query.go index c845fd4..5d8b17d 100644 --- a/internal/store/query.go +++ b/internal/store/query.go @@ -637,13 +637,26 @@ type SankeyLink struct { Wire uint64 } -func (s *Store) Sankey(q Query) ([]SankeyLink, error) { +// Sankey returns traffic by segment (or, with byHost, by internal host), +// application and remote country. By host, only the top hosts are kept +// apart; the rest are summed as "__other__". +func (s *Store) Sankey(q Query, byHost bool, hosts int) ([]SankeyLink, error) { where, args, err := q.where() if err != nil { return nil, err } - rows, err := s.DB.Query(fmt.Sprintf(`SELECT segment, app, CASE WHEN dir = 3 THEN '__internal__' WHEN peer_cc = '' THEN '__unknown__' ELSE peer_cc END, sum(wire) - FROM %s WHERE %s GROUP BY 1,2,3`, s.Source(q.From, q.To), where), args...) + cc := `CASE WHEN dir = 3 THEN '__internal__' WHEN peer_cc = '' THEN '__unknown__' ELSE peer_cc END` + sqlq := fmt.Sprintf(`SELECT segment, app, %s, sum(wire) FROM %s WHERE %s GROUP BY 1,2,3`, cc, s.Source(q.From, q.To), where) + if byHost { + // the internal side of each conversation: the client, or the server + // of inbound traffic + sqlq = fmt.Sprintf(`WITH b AS (SELECT CASE WHEN dir = %d THEN server ELSE client END AS h, app, %s AS cc, sum(wire) AS w + FROM %s WHERE %s GROUP BY 1,2,3), + t AS (SELECT h FROM b GROUP BY h ORDER BY sum(w) DESC LIMIT %d) + SELECT CASE WHEN h IN (SELECT h FROM t) THEN h ELSE '__other__' END, app, cc, sum(w) FROM b GROUP BY 1,2,3`, + DirInbound, cc, s.Source(q.From, q.To), where, hosts) + } + rows, err := s.DB.Query(sqlq, args...) if err != nil { return nil, err } diff --git a/internal/web/static/app.css b/internal/web/static/app.css index 0ffe04e..6c07e7e 100644 --- a/internal/web/static/app.css +++ b/internal/web/static/app.css @@ -17,7 +17,9 @@ button,input,select,textarea{font:inherit;color:inherit} .app{display:grid;grid-template-columns:220px 1fr;min-height:100vh} aside{background:var(--surface);border-inline-end:1px solid var(--line);display:flex;flex-direction:column;position:sticky;top:0;height:100vh} -.brand{padding:16px 18px 14px;font-weight:700;font-size:18px;letter-spacing:-.01em;border-bottom:1px solid var(--line);display:flex;align-items:center;gap:8px} +.brand{padding:10px 14px 8px;font-weight:700;font-size:18px;letter-spacing:-.01em;border-bottom:1px solid var(--line);display:flex;align-items:center;gap:8px} +.brand .logo{display:block;height:46px;max-width:150px;object-fit:contain;object-position:left center} +[dir=rtl] .brand .logo{object-position:right center} .brand b{color:var(--accent)} .brand .demo{font-size:11px;font-weight:600;background:var(--warn);color:#1b2432;border-radius:4px;padding:1px 6px;letter-spacing:0} nav.dash{padding:8px;overflow-y:auto;flex:1} @@ -159,7 +161,8 @@ textarea.inv{width:100%;min-height:180px;border:1px solid var(--line-2);border-r .sankey rect,.sankey path{cursor:pointer} .sankey path:hover{stroke-opacity:.6} -.login{position:fixed;inset:0;display:grid;place-items:center;background:var(--bg)} +.login{position:fixed;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:18px;background:var(--bg)} +.login .logo{width:272px;height:92px;object-fit:contain} .login form{width:min(360px,92vw);display:grid;gap:12px;padding:24px} .login .brand{border:0;padding:0 0 4px} .login h2{margin:0;font-size:16px} @@ -208,3 +211,7 @@ th.sk .ar{font-size:10px;margin-inline-start:3px;opacity:.7} .fdhead .cnt{display:flex;align-items:center;gap:6px;font-size:13px} .fdhead .cnt b{font-size:20px;font-weight:650} .fdnote{font-size:12.5px;color:var(--ink-3);margin:10px 0 0} + +/* logo on Sources */ +.logoprev{display:flex;gap:16px;align-items:center;flex-wrap:wrap} +.logoprev img{width:272px;height:92px;object-fit:contain;border:1px dashed var(--line-2);border-radius:8px;background:var(--surface)} diff --git a/internal/web/static/app.js b/internal/web/static/app.js index c94cb01..039a5fd 100644 --- a/internal/web/static/app.js +++ b/internal/web/static/app.js @@ -140,6 +140,7 @@ function readHash() { if (VIEWS.includes(p.get('v'))) state.v = p.get('v'); if (RANGES.includes(p.get('r'))) state.r = p.get('r'); if (p.get('dim')) state.dim = p.get('dim'); + state.sk = p.get('by') === 'segment' ? 'segment' : 'host'; const dd = p.get('d'); if (dd && dd.includes(':')) state.det = {f: dd.slice(0, dd.indexOf(':')), v: dd.slice(dd.indexOf(':') + 1)}; state.f = (p.get('f') || '').split(',').filter(Boolean).map(s => { const neg = s[0] === '!'; if (neg) s = s.slice(1); @@ -150,6 +151,7 @@ function readHash() { function writeHash(push) { const p = new URLSearchParams({v: state.v, r: state.r}); if (state.v === 'topn') p.set('dim', state.dim); + if (state.v === 'sankey' && state.sk === 'segment') p.set('by', 'segment'); if (state.v === 'detail' && state.det) p.set('d', state.det.f + ':' + state.det.v); if (state.f.length) p.set('f', state.f.map(x => (x.neg ? '!' : '') + encodeURIComponent(x.f) + ':' + encodeURIComponent(x.v)).join(',')); const h = '#' + p.toString(); @@ -409,10 +411,10 @@ views.overview = async (el) => {
${t('kpi.peers')}
${nf(tot.peers)}
${esc(t('kpi.countries', {n: nf(tot.countries)}))}
${t('kpi.accuracy')}
${acc.n}
${acc.kind ? status(acc.kind, acc.d) : `${esc(acc.d)}`}
- ${fd ? findingsPanel(fd) : ''}

${t('ov.bw_title')}

${lines.length ? t(basis === 'week' ? 'ov.bw_sub_week' : 'ov.bw_sub_prev') : ''}
${areas.map((a, i) => `${series.names[i] === '__other__' ? esc(a.name) : V('app', series.names[i], a.name)}`).join('')}${lines.length ? `${esc(lines[0].name)}` : ''}
+ ${fd ? findingsPanel(fd) : ''} ${panel('c4', t('ov.dir'), '', '
')} ${panel('c4', t('ov.proto'), '', '
')} ${panel('c4', t('ov.country'), '', '
')} @@ -595,10 +597,26 @@ async function topTable(el, dim) { }); } +// Flow paths start from each internal host (default) or from each network +// segment, through the application to the remote country. +async function lookupNames(ips) { + const ask = ips.filter(ip => ip && !names.has(ip) && !asked.has(ip)); + if (!ask.length) return; + ask.forEach(ip => asked.add(ip)); + try { + const res = await fetch('/api/resolve', {method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify({ips: ask})}); + if (res.ok) for (const [ip, n] of Object.entries(await res.json())) names.set(ip, n); + } catch (e) {} +} views.sankey = async (el) => { - const d = await api('sankey'); - el.innerHTML = `

${t('sankey.title')}

${t('sankey.hint')}
-
`; + const byHost = state.sk !== 'segment'; + const d = await api('sankey', {by: byHost ? 'host' : 'segment'}); + if (byHost) await lookupNames((d.seg_app || []).map(l => l.S).filter(k => k !== '__other__')); + const title = t(byHost ? 'sankey.title_host' : 'sankey.title'); + el.innerHTML = `

${title}

${t('sankey.hint')} +
+
`; + el.querySelectorAll('[data-sk]').forEach(b => b.onclick = () => { state.sk = b.dataset.sk; render(); }); const sEl = $('#chSankey'); if (!(d.seg_app || []).length) { sEl.innerHTML = `
${t('empty.nodata')}
`; return; } const cols = [[], [], []], ids = [{}, {}, {}]; @@ -606,12 +624,12 @@ views.sankey = async (el) => { d.seg_app.forEach(l => { node(0, l.S).out += l.V; node(1, l.T).in += l.V; }); d.app_cc.forEach(l => { node(1, l.S).out += l.V; node(2, l.T).in += l.V; }); cols.forEach(c => c.sort((a, b) => (a.k === '__other__') - (b.k === '__other__') || Math.max(b.in, b.out) - Math.max(a.in, a.out))); - const label = (c, k) => c === 2 ? country(k) : appLabel(k); - const field = ['segment', 'app', 'country']; + const label = (c, k) => c === 2 ? country(k) : c === 0 && byHost && k !== '__other__' ? (names.get(k) || k) : appLabel(k); + const field = [byHost ? 'ip' : 'segment', 'app', 'country']; const draw = () => { const W = sEl.clientWidth, H = sEl.clientHeight; if (W < 300) return; const rtl = document.documentElement.dir === 'rtl'; - const nodeW = 12, pad = 14, colX = rtl ? [W - 130, Math.round(W / 2 - 6), 118] : [118, Math.round(W / 2 - 6), W - 130]; + const nodeW = 12, pad = 14, lw = byHost ? 170 : 118, colX = rtl ? [W - lw - 12, Math.round(W / 2 - 6), 118] : [lw, Math.round(W / 2 - 6), W - 130]; const nv = n => Math.max(n.in, n.out); const k = Math.min(...cols.map(c => (H - pad * (c.length - 1)) / Math.max(1, c.reduce((s, n) => s + nv(n), 0)))); cols.forEach((c, ci) => { let yy = 0; c.forEach((n, i) => { n.ci = ci; n.x = colX[ci]; n.y = yy; n.h = nv(n) * k; n.o = 0; n.i = 0; n.color = ci === 0 ? (n.k === '__other__' ? OTHER : COLORS[i % 6]) : 'var(--ink-2)'; yy += n.h + pad; }); }); @@ -785,6 +803,9 @@ views.sources = async (el) => { ${panel('c12', t('geo.title'), t('geo.sub'), `
    ${geoRows || `
  • ${esc(t('geo.none'))}
  • `}

${t('geo.where')}

`)} + ${panel('c12', t('logo.title'), t('logo.sub'), `
logo +
+ ${t('logo.hint')}
`)} ${panel('c12', t('src.names'), t('src.names_sub'), `
${esc(t('src.names_help'))}
host   192.168.3.28    ${esc(t('src.ex_host'))}
 net    192.168.3.0/24  ${esc(t('src.ex_net'))}
 device 192.168.1.1     ${esc(t('src.ex_device'))}
@@ -803,6 +824,20 @@ snmp   192.168.1.1     public