diff --git a/agent/utils/firewall/filter/providers/firewalld/adapter.go b/agent/utils/firewall/filter/providers/firewalld/adapter.go index 207a758fd..d181654d6 100644 --- a/agent/utils/firewall/filter/providers/firewalld/adapter.go +++ b/agent/utils/firewall/filter/providers/firewalld/adapter.go @@ -1060,7 +1060,7 @@ func (systemBackend) Run(ctx context.Context, command filter.NativeCommand) erro } timeout := 60 * time.Second if options > 1 { - timeout = 5 * time.Minute + timeout = 15 * time.Minute } var stderr strings.Builder err := cmd.NewCommandMgr( diff --git a/agent/utils/firewall/filter/safety.go b/agent/utils/firewall/filter/safety.go index aaa5dccc9..8c503f0cd 100644 --- a/agent/utils/firewall/filter/safety.go +++ b/agent/utils/firewall/filter/safety.go @@ -18,7 +18,7 @@ var ( var ErrVerificationFailed = errors.New("firewall rule verification failed") func ProtectRuleSet(snapshot RuleSet, ports []PortWhitelist) (RuleSet, error) { - rules := append([]ObservedRule(nil), snapshot.Rules...) + rules := slices.Clone(snapshot.Rules) whitelist := NewPortWhitelistIndex(ports) for index := range rules { if rules[index].ParseStatus == ParseStatusSupported && whitelist.Matches(rules[index].Rule) { diff --git a/frontend/src/components/log/file/index.vue b/frontend/src/components/log/file/index.vue index 10f7ccb74..b650ad802 100644 --- a/frontend/src/components/log/file/index.vue +++ b/frontend/src/components/log/file/index.vue @@ -267,6 +267,7 @@ const getContent = async (pre: boolean) => { } isLoading.value = true; emit('update:isReading', true); + const requestedPage = readReq.page; let res; try { @@ -290,7 +291,6 @@ const getContent = async (pre: boolean) => { if (res.data.taskStatus && res.data.taskStatus !== 'Executing') { isTailDisabled.value = true; - tailLog.value = false; } logPath.value = res.data.path; @@ -396,6 +396,14 @@ const getContent = async (pre: boolean) => { } } isLoading.value = false; + if (readReq.type === 'task' && res.data.taskStatus && res.data.taskStatus !== 'Executing') { + if (!pre && !res.data.end && res.data.scope !== 'tail' && requestedPage < res.data.total) { + readReq.page = requestedPage + 1; + await getContent(false); + } else { + onCloseLog(); + } + } }; const onCloseLog = async () => { diff --git a/frontend/src/lang/modules/en.ts b/frontend/src/lang/modules/en.ts index 428a587cd..fa32a92d1 100644 --- a/frontend/src/lang/modules/en.ts +++ b/frontend/src/lang/modules/en.ts @@ -4179,7 +4179,7 @@ const message = { 'The runtime and permanent firewall configurations differ. Synchronize them first.', plan_protected_rule: 'This rule is protected and cannot be taken over, changed, or deleted.', plan_blocked: 'This rule cannot be applied safely. Refresh the rules and try again.', - largeRuleSet: 'There are more than {0} firewall rules. We recommend using iptables or nftables.', + largeRuleSet: 'Too many firewall rules may slow down operations. We recommend using iptables or nftables.', scopeDefaultMismatch: 'The system default zone is {0}; this page manages only the public zone.', scopeMissing: 'Managed scope {0} is missing and will be created safely when the first rule is applied.', scopeUnmanagedActive: 'Other active scopes were detected: {0}. 1Panel will not modify their rules.', diff --git a/frontend/src/lang/modules/es-es.ts b/frontend/src/lang/modules/es-es.ts index e226cb875..b4ddf7e44 100644 --- a/frontend/src/lang/modules/es-es.ts +++ b/frontend/src/lang/modules/es-es.ts @@ -4225,7 +4225,8 @@ const message = { plan_runtime_permanent_mismatch: 'Las configuraciones activa y permanente difieren. Sincronízalas primero.', plan_protected_rule: 'Esta regla está protegida y no se puede asumir, modificar ni eliminar.', plan_blocked: 'La regla no puede aplicarse de forma segura. Actualiza la lista e inténtalo de nuevo.', - largeRuleSet: 'Hay más de {0} reglas de cortafuegos. Se recomienda usar iptables o nftables.', + largeRuleSet: + 'Demasiadas reglas de cortafuegos pueden ralentizar las operaciones. Se recomienda usar iptables o nftables.', scopeDefaultMismatch: 'La zona predeterminada es {0}; esta página solo gestiona la zona public.', scopeMissing: 'Falta el ámbito gestionado {0}; se creará de forma segura al aplicar la primera regla.', scopeUnmanagedActive: 'Se detectaron otros ámbitos activos: {0}. 1Panel no modificará sus reglas.', diff --git a/frontend/src/lang/modules/fa.ts b/frontend/src/lang/modules/fa.ts index 2ed484008..a7375ed14 100644 --- a/frontend/src/lang/modules/fa.ts +++ b/frontend/src/lang/modules/fa.ts @@ -4134,7 +4134,8 @@ const message = { plan_runtime_permanent_mismatch: 'پیکربندی فعال و دائمی دیوارهٔ آتش متفاوت است. ابتدا آن‌ها را همگام کنید.', plan_protected_rule: 'این قانون محافظت‌شده است و نمی‌توان آن را مدیریت، تغییر یا حذف کرد.', plan_blocked: 'این قانون با ایمنی قابل اعمال نیست. فهرست را تازه‌سازی و دوباره تلاش کنید.', - largeRuleSet: 'تعداد قوانین دیوارهٔ آتش بیش از {0} است. استفاده از iptables یا nftables توصیه می‌شود.', + largeRuleSet: + 'تعداد زیاد قوانین دیوارهٔ آتش ممکن است عملیات را کند کند. استفاده از iptables یا nftables توصیه می‌شود.', scopeDefaultMismatch: 'ناحیهٔ پیش‌فرض سامانه {0} است؛ این صفحه فقط ناحیهٔ public را مدیریت می‌کند.', scopeMissing: 'محدودهٔ مدیریت‌شدهٔ {0} وجود ندارد و هنگام اعمال نخستین قانون به‌صورت امن ایجاد می‌شود.', scopeUnmanagedActive: 'محدوده‌های فعال دیگری یافت شد: {0}. ‏1Panel قوانین آن‌ها را تغییر نمی‌دهد.', diff --git a/frontend/src/lang/modules/ja.ts b/frontend/src/lang/modules/ja.ts index ff21ac0fe..439587020 100644 --- a/frontend/src/lang/modules/ja.ts +++ b/frontend/src/lang/modules/ja.ts @@ -4160,7 +4160,8 @@ const message = { plan_runtime_permanent_mismatch: '実行中と永続設定のファイアウォール構成が異なります。先に同期してください。', plan_protected_rule: 'このルールは保護されており、管理対象化、変更、削除はできません。', plan_blocked: 'このルールは安全に適用できません。ルールを更新して再試行してください。', - largeRuleSet: 'ファイアウォールルールが {0} 件を超えています。iptables または nftables の使用を推奨します。', + largeRuleSet: + 'ファイアウォールルールが多すぎると操作が遅くなる可能性があります。iptables または nftables の使用を推奨します。', scopeDefaultMismatch: 'システムの既定 zone は {0} です。このページでは public zone のみ管理します。', scopeMissing: '管理対象スコープ {0} がありません。最初のルール適用時に安全に作成されます。', scopeUnmanagedActive: '他の有効な範囲が見つかりました:{0}。1Panel はそのルールを変更しません。', diff --git a/frontend/src/lang/modules/ko.ts b/frontend/src/lang/modules/ko.ts index 70c66c2c3..2574a55f4 100644 --- a/frontend/src/lang/modules/ko.ts +++ b/frontend/src/lang/modules/ko.ts @@ -4084,7 +4084,7 @@ const message = { plan_runtime_permanent_mismatch: '실행 중 구성과 영구 방화벽 구성이 다릅니다. 먼저 동기화하세요.', plan_protected_rule: '이 규칙은 보호되어 관리 전환, 변경 또는 삭제할 수 없습니다.', plan_blocked: '이 규칙을 안전하게 적용할 수 없습니다. 목록을 새로 고친 후 다시 시도하세요.', - largeRuleSet: '방화벽 규칙이 {0}개를 초과했습니다. iptables 또는 nftables 사용을 권장합니다.', + largeRuleSet: '방화벽 규칙이 너무 많으면 작업이 느려질 수 있습니다. iptables 또는 nftables 사용을 권장합니다.', scopeDefaultMismatch: '시스템 기본 zone은 {0}이며 이 페이지는 public zone만 관리합니다.', scopeMissing: '관리 범위 {0}이(가) 없으며 첫 규칙을 적용할 때 안전하게 생성됩니다.', scopeUnmanagedActive: '다른 활성 범위가 감지되었습니다: {0}. 1Panel은 해당 규칙을 변경하지 않습니다.', diff --git a/frontend/src/lang/modules/lo.ts b/frontend/src/lang/modules/lo.ts index b2f68fe90..4b24b22bb 100644 --- a/frontend/src/lang/modules/lo.ts +++ b/frontend/src/lang/modules/lo.ts @@ -4051,7 +4051,7 @@ const message = { plan_runtime_permanent_mismatch: 'ຄ່າໄຟວໍທີ່ໃຊ້ງານແລະຄ່າຖາວອນບໍ່ກົງກັນ. ກະລຸນາຊິງກ່ອນ.', plan_protected_rule: 'ກົດນີ້ຖືກປົກປ້ອງ ແລະບໍ່ສາມາດຮັບເຂົ້າ, ແກ້ໄຂ ຫຼືລຶບໄດ້.', plan_blocked: 'ບໍ່ສາມາດນຳໃຊ້ກົດນີ້ໄດ້ຢ່າງປອດໄພ. ກະລຸນາໂຫຼດໃໝ່ແລ້ວລອງອີກຄັ້ງ.', - largeRuleSet: 'ມີກົດໄຟວໍຫຼາຍກວ່າ {0} ລາຍການ. ແນະນຳໃຫ້ໃຊ້ iptables ຫຼື nftables.', + largeRuleSet: 'ກົດໄຟວໍທີ່ຫຼາຍເກີນໄປອາດເຮັດໃຫ້ການດຳເນີນງານຊ້າລົງ. ແນະນຳໃຫ້ໃຊ້ iptables ຫຼື nftables.', scopeDefaultMismatch: 'zone ຄ່າເລີ່ມຕົ້ນແມ່ນ {0}; ໜ້ານີ້ຈັດການສະເພາະ public zone.', scopeMissing: 'ບໍ່ພົບຂອບເຂດຈັດການ {0}; ລະບົບຈະສ້າງຢ່າງປອດໄພເມື່ອນຳໃຊ້ກົດທຳອິດ.', scopeUnmanagedActive: 'ພົບຂອບເຂດອື່ນທີ່ໃຊ້ງານ: {0}. 1Panel ຈະບໍ່ແກ້ໄຂກົດເຫຼົ່ານັ້ນ.', diff --git a/frontend/src/lang/modules/ms.ts b/frontend/src/lang/modules/ms.ts index daaf32f7a..abac46223 100644 --- a/frontend/src/lang/modules/ms.ts +++ b/frontend/src/lang/modules/ms.ts @@ -4246,7 +4246,8 @@ const message = { plan_runtime_permanent_mismatch: 'Konfigurasi tembok api aktif dan kekal berbeza. Segerakkan dahulu.', plan_protected_rule: 'Peraturan ini dilindungi dan tidak boleh diambil alih, diubah atau dipadam.', plan_blocked: 'Peraturan ini tidak dapat digunakan dengan selamat. Muat semula senarai dan cuba lagi.', - largeRuleSet: 'Terdapat lebih daripada {0} peraturan tembok api. Penggunaan iptables atau nftables disyorkan.', + largeRuleSet: + 'Terlalu banyak peraturan tembok api boleh melambatkan operasi. Penggunaan iptables atau nftables disyorkan.', scopeDefaultMismatch: 'Zon lalai sistem ialah {0}; halaman ini hanya mengurus zon public.', scopeMissing: 'Skop terurus {0} tiada dan akan dicipta dengan selamat apabila peraturan pertama digunakan.', scopeUnmanagedActive: 'Skop aktif lain dikesan: {0}. 1Panel tidak akan mengubah peraturannya.', diff --git a/frontend/src/lang/modules/pt-br.ts b/frontend/src/lang/modules/pt-br.ts index ab1573a04..a34ad2a82 100644 --- a/frontend/src/lang/modules/pt-br.ts +++ b/frontend/src/lang/modules/pt-br.ts @@ -4263,7 +4263,8 @@ const message = { plan_runtime_permanent_mismatch: 'As configurações ativa e permanente são diferentes. Sincronize-as primeiro.', plan_protected_rule: 'Esta regra está protegida e não pode ser assumida, alterada ou excluída.', plan_blocked: 'A regra não pode ser aplicada com segurança. Atualize a lista e tente novamente.', - largeRuleSet: 'Há mais de {0} regras de firewall. Recomendamos usar iptables ou nftables.', + largeRuleSet: + 'Regras de firewall em excesso podem tornar as operações lentas. Recomendamos usar iptables ou nftables.', scopeDefaultMismatch: 'A zona padrão do sistema é {0}; esta página gerencia apenas a zona public.', scopeMissing: 'O escopo gerenciado {0} não existe e será criado com segurança ao aplicar a primeira regra.', scopeUnmanagedActive: 'Outros escopos ativos foram detectados: {0}. O 1Panel não modificará suas regras.', diff --git a/frontend/src/lang/modules/ru.ts b/frontend/src/lang/modules/ru.ts index a28525ad9..5fed9ffab 100644 --- a/frontend/src/lang/modules/ru.ts +++ b/frontend/src/lang/modules/ru.ts @@ -4231,7 +4231,8 @@ const message = { plan_runtime_permanent_mismatch: 'Активная и постоянная конфигурации различаются. Сначала синхронизируйте их.', plan_protected_rule: 'Правило защищено: его нельзя взять под управление, изменить или удалить.', plan_blocked: 'Правило нельзя безопасно применить. Обновите список и повторите попытку.', - largeRuleSet: 'Количество правил брандмауэра превышает {0}. Рекомендуется использовать iptables или nftables.', + largeRuleSet: + 'Слишком большое количество правил брандмауэра может замедлить операции. Рекомендуется использовать iptables или nftables.', scopeDefaultMismatch: 'Системная зона по умолчанию — {0}; на этой странице управляется только зона public.', scopeMissing: 'Управляемая область {0} отсутствует и будет безопасно создана при применении первого правила.', scopeUnmanagedActive: 'Обнаружены другие активные области: {0}. 1Panel не будет изменять их правила.', diff --git a/frontend/src/lang/modules/tr.ts b/frontend/src/lang/modules/tr.ts index 982222a41..d52168ed6 100644 --- a/frontend/src/lang/modules/tr.ts +++ b/frontend/src/lang/modules/tr.ts @@ -4248,7 +4248,8 @@ const message = { plan_runtime_permanent_mismatch: 'Etkin ve kalıcı güvenlik duvarı yapılandırmaları farklı. Önce eşitleyin.', plan_protected_rule: 'Bu kural korumalıdır; yönetimi devralınamaz, değiştirilemez veya silinemez.', plan_blocked: 'Bu kural güvenle uygulanamıyor. Listeyi yenileyip tekrar deneyin.', - largeRuleSet: 'Güvenlik duvarı kural sayısı {0} değerini aşıyor. iptables veya nftables kullanılması önerilir.', + largeRuleSet: + 'Çok fazla güvenlik duvarı kuralı işlemleri yavaşlatabilir. iptables veya nftables kullanılması önerilir.', scopeDefaultMismatch: 'Sistemin varsayılan zone değeri {0}; bu sayfa yalnızca public zone alanını yönetir.', scopeMissing: 'Yönetilen {0} kapsamı eksik ve ilk kural uygulanırken güvenli şekilde oluşturulacak.', scopeUnmanagedActive: 'Başka etkin kapsamlar algılandı: {0}. 1Panel bunların kurallarını değiştirmez.', diff --git a/frontend/src/lang/modules/zh-Hant.ts b/frontend/src/lang/modules/zh-Hant.ts index 032505083..474d0fdab 100644 --- a/frontend/src/lang/modules/zh-Hant.ts +++ b/frontend/src/lang/modules/zh-Hant.ts @@ -3896,7 +3896,7 @@ const message = { plan_runtime_permanent_mismatch: '防火牆執行設定與永久設定不一致,請先完成同步。', plan_protected_rule: '此規則受到保護,不能認領、修改或刪除。', plan_blocked: '目前規則無法安全套用,請重新整理規則後再試。', - largeRuleSet: '目前防火牆規則超過 {0} 條,建議使用 iptables 或 nftables。', + largeRuleSet: '防火牆規則過多可能導致操作卡頓,建議使用 iptables 或 nftables。', scopeDefaultMismatch: '系統預設 zone 為 {0},目前頁面僅管理 public zone。', scopeMissing: '託管範圍 {0} 尚未建立,套用第一條規則時將以安全方式建立。', scopeUnmanagedActive: '偵測到其他使用中範圍:{0},1Panel 不會修改其中的規則。', diff --git a/frontend/src/lang/modules/zh.ts b/frontend/src/lang/modules/zh.ts index c8c3cf82a..e0e12c476 100644 --- a/frontend/src/lang/modules/zh.ts +++ b/frontend/src/lang/modules/zh.ts @@ -3944,7 +3944,7 @@ const message = { plan_runtime_permanent_mismatch: '当前生效的防火墙规则与重启后保留的规则不一致,请先同步后重试。', plan_protected_rule: '该规则受到保护,不能认领、修改或删除。', plan_blocked: '暂时无法处理这条规则,本次操作未生效。请刷新后重试;如仍失败,请检查规则状态。', - largeRuleSet: '当前防火墙规则超过 {0} 条,建议使用 iptables 或 nftables。', + largeRuleSet: '防火墙规则过多可能导致操作卡顿,建议使用 iptables 或 nftables。', scopeDefaultMismatch: '系统默认 zone 为 {0},当前页面仅管理 public zone。', scopeMissing: '托管范围 {0} 尚未创建,应用首条规则时将以安全方式创建。', scopeUnmanagedActive: '检测到其他活动范围:{0},1Panel 不会修改其中的规则。', diff --git a/frontend/src/views/host/firewall/rule/import/index.vue b/frontend/src/views/host/firewall/rule/import/index.vue index bd0e7fa00..c0d5330ae 100644 --- a/frontend/src/views/host/firewall/rule/import/index.vue +++ b/frontend/src/views/host/firewall/rule/import/index.vue @@ -56,13 +56,13 @@ - + - + diff --git a/frontend/src/views/host/firewall/rule/index.vue b/frontend/src/views/host/firewall/rule/index.vue index c3e01703e..ac62ee7a4 100644 --- a/frontend/src/views/host/firewall/rule/index.vue +++ b/frontend/src/views/host/firewall/rule/index.vue @@ -898,10 +898,10 @@ const changeRuleFilter = () => { const notices = computed(() => { const unique = new Map(); - if (inventoryTotal.value > 200 && isServiceBackend.value) { + if (inventoryTotal.value > 1000 && isServiceBackend.value) { unique.set('largeRuleSet', { key: 'largeRuleSet', - text: i18n.global.t('firewall.largeRuleSet', [200]), + text: i18n.global.t('firewall.largeRuleSet'), }); } scopeNotices.value.forEach((notice) => { diff --git a/frontend/src/views/host/firewall/sync/index.vue b/frontend/src/views/host/firewall/sync/index.vue index 2093cefc9..215e8aaa7 100644 --- a/frontend/src/views/host/firewall/sync/index.vue +++ b/frontend/src/views/host/firewall/sync/index.vue @@ -108,7 +108,7 @@ @@ -347,10 +347,16 @@ const reasonText = (reasonCode?: string, reason?: string) => { const actionText = (action?: Firewall.Action) => (action ? i18n.global.t(`firewall.${action}`) : '-'); const displayAddress = (rule: Firewall.Rule) => { - const values = [rule.sourceAddress, rule.destinationAddress] - .filter((value): value is string => Boolean(value)) - .map((value) => formatHostAddress(value, rule.scope.family)); - return values.length > 0 ? values.join(' → ') : i18n.global.t('firewall.anyWhere'); + const wildcard = + rule.scope.family === 'ipv6' ? '::/0' : rule.scope.family === 'inet' ? '0.0.0.0/0, ::/0' : '0.0.0.0/0'; + const addresses = rule.destinationAddress ? [rule.sourceAddress, rule.destinationAddress] : [rule.sourceAddress]; + return addresses + .map((address) => + address && address !== wildcard + ? formatHostAddress(address, rule.scope.family) + : `${wildcard}(${i18n.global.t('firewall.anyWhere')})`, + ) + .join(' → '); }; const dockerAddress = (rule?: Firewall.DockerGuardEndpoint) => {