-
}
- title={t('fwlog.title')}
- subtitle={t('fwlog.intro')}
- extra={
-
- }>
- {connected ? t('fwlog.live') : t('fwlog.disconnected')}
-
+ {!active ? (
+
+ }
+ description={
+
+ {t('fwlog.notStartedTitle')}
+ {t('fwlog.notStartedDesc')}
+
+ }
+ >
: }
- onClick={() => setPaused((p) => !p)}
+ type="primary"
+ size="large"
+ icon={}
+ onClick={() => setActive(true)}
+ style={{ marginTop: 16 }}
>
- {paused ? t('fwlog.resume') : t('fwlog.pause')}
+ {t('fwlog.start')}
-
- } onClick={clear}>{t('fwlog.clear')}
-
-
- } onClick={exportCSV}>{t('fwlog.export')}
-
-
- }
- />
+
+
+ ) : (
+ <>
+ {error &&
}
- {error &&
}
+
+
+ }>
+ {connected ? t('fwlog.live') : t('fwlog.disconnected')}
+
+ }
+ onClick={() => setActive(false)}
+ >
+ {t('fwlog.stop')}
+
+ : }
+ onClick={() => setPaused((p) => !p)}
+ >
+ {paused ? t('fwlog.resume') : t('fwlog.pause')}
+
+
+ } onClick={clear}>{t('fwlog.clear')}
+
+
+ } onClick={exportCSV}>{t('fwlog.export')}
+
+
+
-
-
- setFilters((f) => ({ ...f, action: v || '' }))}
- options={[
- { value: 'accept', label: 'accept' },
- { value: 'drop', label: 'drop' },
- { value: 'reject', label: 'reject' },
- { value: 'blocked', label: 'blocked' },
- ]}
+ `${r.timestamp}-${r.src_ip}-${r.dst_ip}-${r.src_port}-${r.dst_port}-${r.pkt_len}`}
+ size="small"
+ dataSource={[...entries].reverse()}
+ columns={columns}
+ pagination={{ pageSize: 50, showSizeChanger: true, pageSizeOptions: [25, 50, 100, 200] }}
+ locale={{ emptyText: connected ? t('fwlog.empty') : t('fwlog.connecting') }}
/>
- setFilters((f) => ({ ...f, proto: v || '' }))}
- options={[
- { value: 'tcp', label: 'tcp' },
- { value: 'udp', label: 'udp' },
- { value: 'icmp', label: 'icmp' },
- { value: 'icmpv6', label: 'icmpv6' },
- ]}
- />
- setFilters((f) => ({ ...f, src: e.target.value }))}
- />
- setFilters((f) => ({ ...f, dst: e.target.value }))}
- />
- setFilters((f) => ({ ...f, rule_id: e.target.value }))}
- />
-
- {entries.length}{paused && pendingDuringPauseRef.current.length > 0
- ? ` (+${pendingDuringPauseRef.current.length} ${t('fwlog.queued')})`
- : ''}
-
-
-
-
- `${r.timestamp}-${r.src_ip}-${r.dst_ip}-${r.src_port}-${r.dst_port}-${r.pkt_len}`}
- size="small"
- dataSource={[...entries].reverse()}
- columns={columns}
- pagination={{ pageSize: 50, showSizeChanger: true, pageSizeOptions: [25, 50, 100, 200] }}
- locale={{ emptyText: connected ? t('fwlog.empty') : t('fwlog.connecting') }}
- />
+ >
+ )}
)
}
diff --git a/management-ui/src/pages/Firewall/index.tsx b/management-ui/src/pages/Firewall/index.tsx
index 7e3a825..ce45a15 100644
--- a/management-ui/src/pages/Firewall/index.tsx
+++ b/management-ui/src/pages/Firewall/index.tsx
@@ -10,6 +10,7 @@ import ServiceGroupsTab from './ServiceGroups'
import RulesTab from './Rules'
import NATRulesTab from './NATRules'
import ZonesTab from './Zones'
+import LiveLogTab from './LiveLog'
export default function FirewallPage() {
const { t } = useTranslation()
@@ -17,6 +18,7 @@ export default function FirewallPage() {
const tabs = [
{ key: 'rules', label: t('fw.tabs.rules'), children: },
{ key: 'nat', label: t('fw.tabs.nat'), children: },
+ { key: 'live', label: t('fw.tabs.live'), children: },
{ key: 'zones', label: t('fw.tabs.zones'), children: },
{ key: 'addrObj', label: t('fw.tabs.addrObj'), children: },
{ key: 'addrGrp', label: t('fw.tabs.addrGrp'), children: },
diff --git a/packaging/debian/edgeguard-api/DEBIAN/postinst b/packaging/debian/edgeguard-api/DEBIAN/postinst
index ed74935..50f0812 100755
--- a/packaging/debian/edgeguard-api/DEBIAN/postinst
+++ b/packaging/debian/edgeguard-api/DEBIAN/postinst
@@ -243,6 +243,11 @@ stack=fw1:NFLOG,base1:BASE,ifi1:IFINDEX,ip2str1:IP2STR,mac2str1:HWHDR,json1:JSON
[fw1]
group=0
+# qthreshold=1 + qtimeout=1: Kernel batched sonst Pakete bis 1024 oder
+# bis 1s. Mit 1/1 → jedes Paket SOFORT raus, kein Sammeln. Wichtig
+# damit die Live-Log-UI in real-time fließt statt in Bursts.
+qthreshold=1
+qtimeout=1
[json1]
sync=1