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 @@
{{ displayAddress(row, row.sourceAddress) }}
- {{ row.sourcePort || $t('firewall.allPorts') }}
+ {{ row.sourcePort || '*' }}
{{ displayAddress(row, row.destinationAddress) }}
- {{ row.destinationPort || $t('firewall.allPorts') }}
+ {{ row.destinationPort || '*' }}
{{ actionLabel(row.action) }}
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 @@
- {{ row.rule?.destinationPort || $t('firewall.allPorts') }}
+ {{ row.rule ? row.rule.destinationPort || '*' : '-' }}
@@ -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) => {