Skip to content

Commit c08e83e

Browse files
authored
fix: Fix firewalld range port forwarding failure issue (#11390)
1 parent 863ee5c commit c08e83e

File tree

14 files changed

+41
-35
lines changed

14 files changed

+41
-35
lines changed

agent/utils/firewall/client/firewalld.go

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import (
99
"github.com/1Panel-dev/1Panel/agent/global"
1010
"github.com/1Panel-dev/1Panel/agent/utils/cmd"
1111
"github.com/1Panel-dev/1Panel/agent/utils/controller"
12-
"github.com/1Panel-dev/1Panel/agent/utils/re"
1312
)
1413

1514
type Firewall struct{}
@@ -119,24 +118,20 @@ func (f *Firewall) ListForward() ([]FireInfo, error) {
119118
}
120119
var datas []FireInfo
121120
for _, line := range strings.Split(stdout, "\n") {
122-
line = strings.TrimFunc(line, func(r rune) bool {
123-
return r <= 32
124-
})
125-
if re.GetRegex(re.FirewalldForwardPattern).MatchString(line) {
126-
match := re.GetRegex(re.FirewalldForwardPattern).FindStringSubmatch(line)
127-
if len(match) < 4 {
128-
continue
129-
}
130-
if len(match[4]) == 0 {
131-
match[4] = "127.0.0.1"
132-
}
133-
datas = append(datas, FireInfo{
134-
Port: match[1],
135-
Protocol: match[2],
136-
TargetIP: match[4],
137-
TargetPort: match[3],
138-
})
121+
line = strings.TrimSpace(line)
122+
parts := strings.Split(line, ":")
123+
if len(parts) < 4 {
124+
continue
125+
}
126+
if parts[3] == "toaddr=" {
127+
parts[3] = "127.0.0.1"
139128
}
129+
datas = append(datas, FireInfo{
130+
Port: strings.TrimPrefix(parts[0], "port="),
131+
Protocol: strings.TrimPrefix(parts[1], "proto="),
132+
TargetIP: strings.TrimPrefix(parts[3], "toaddr="),
133+
TargetPort: strings.TrimPrefix(parts[2], "toport="),
134+
})
140135
}
141136
return datas, nil
142137
}

agent/utils/firewall/client/iptables/forward.go

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ import (
66
)
77

88
func AddForward(protocol, srcPort, dest, destPort, iface string, save bool) error {
9-
// iptabels destPort 范围端口规则为:%d-%d
10-
destPort = strings.ReplaceAll(destPort, ":", "-")
9+
srcPort = strings.ReplaceAll(srcPort, "-", ":")
10+
itemDstPort := strings.ReplaceAll(destPort, "-", ":")
1111
if dest != "" && dest != "127.0.0.1" && dest != "localhost" {
1212
iptablesArg := fmt.Sprintf("-A %s", Chain1PanelPreRouting)
1313
if iface != "" {
@@ -18,15 +18,15 @@ func AddForward(protocol, srcPort, dest, destPort, iface string, save bool) erro
1818
return err
1919
}
2020

21-
if err := Run(NatTab, fmt.Sprintf("-A %s -d %s -p %s --dport %s -j MASQUERADE", Chain1PanelPostRouting, dest, protocol, destPort)); err != nil {
21+
if err := Run(NatTab, fmt.Sprintf("-A %s -d %s -p %s --dport %s -j MASQUERADE", Chain1PanelPostRouting, dest, protocol, itemDstPort)); err != nil {
2222
return err
2323
}
2424

25-
if err := Run(FilterTab, fmt.Sprintf("-A %s -d %s -p %s --dport %s -j ACCEPT", Chain1PanelForward, dest, protocol, destPort)); err != nil {
25+
if err := Run(FilterTab, fmt.Sprintf("-A %s -d %s -p %s --dport %s -j ACCEPT", Chain1PanelForward, dest, protocol, itemDstPort)); err != nil {
2626
return err
2727
}
2828

29-
if err := Run(FilterTab, fmt.Sprintf("-A %s -s %s -p %s --sport %s -j ACCEPT", Chain1PanelForward, dest, protocol, destPort)); err != nil {
29+
if err := Run(FilterTab, fmt.Sprintf("-A %s -s %s -p %s --sport %s -j ACCEPT", Chain1PanelForward, dest, protocol, itemDstPort)); err != nil {
3030
return err
3131
}
3232
} else {
@@ -43,20 +43,21 @@ func AddForward(protocol, srcPort, dest, destPort, iface string, save bool) erro
4343
}
4444

4545
func DeleteForward(num string, protocol, srcPort, dest, destPort, iface string) error {
46+
itemDstPort := strings.ReplaceAll(destPort, "-", ":")
4647
if err := Run(NatTab, fmt.Sprintf("-D %s %s", Chain1PanelPreRouting, num)); err != nil {
4748
return err
4849
}
4950

5051
if dest != "" && dest != "127.0.0.1" && dest != "localhost" {
51-
if err := Run(NatTab, fmt.Sprintf("-D %s -d %s -p %s --dport %s -j MASQUERADE", Chain1PanelPostRouting, dest, protocol, destPort)); err != nil {
52+
if err := Run(NatTab, fmt.Sprintf("-D %s -d %s -p %s --dport %s -j MASQUERADE", Chain1PanelPostRouting, dest, protocol, itemDstPort)); err != nil {
5253
return err
5354
}
5455

55-
if err := Run(FilterTab, fmt.Sprintf("-D %s -d %s -p %s --dport %s -j ACCEPT", Chain1PanelForward, dest, protocol, destPort)); err != nil {
56+
if err := Run(FilterTab, fmt.Sprintf("-D %s -d %s -p %s --dport %s -j ACCEPT", Chain1PanelForward, dest, protocol, itemDstPort)); err != nil {
5657
return err
5758
}
5859

59-
if err := Run(FilterTab, fmt.Sprintf("-D %s -s %s -p %s --sport %s -j ACCEPT", Chain1PanelForward, dest, protocol, destPort)); err != nil {
60+
if err := Run(FilterTab, fmt.Sprintf("-D %s -s %s -p %s --sport %s -j ACCEPT", Chain1PanelForward, dest, protocol, itemDstPort)); err != nil {
6061
return err
6162
}
6263
}

agent/utils/re/re.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ const (
1010
ComposeDisallowedCharsPattern = `[^a-z0-9_-]+`
1111
ComposeEnvVarPattern = `\$\{([^}]+)\}`
1212
DiskKeyValuePattern = `([A-Za-z0-9_]+)=("([^"\\]|\\.)*"|[^ \t]+)`
13-
FirewalldForwardPattern = `^port=(\d{1,5}):proto=(.+?):toport=(\d{1,5}):toaddr=(.*)$`
1413
ValidatorNamePattern = `^[a-zA-Z\p{Han}]{1}[a-zA-Z0-9_\p{Han}]{0,30}$`
1514
ValidatorIPPattern = `^((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})(\.((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})){3}$`
1615
DomainPattern = `^([\w\p{Han}\-\*]{1,100}\.){1,10}([\w\p{Han}\-]{1,24}|[\w\p{Han}\-]{1,24}\.[\w\p{Han}\-]{1,24})(:\d{1,5})?$`
@@ -41,7 +40,6 @@ func Init() {
4140
ComposeDisallowedCharsPattern,
4241
ComposeEnvVarPattern,
4342
DiskKeyValuePattern,
44-
FirewalldForwardPattern,
4543
ValidatorNamePattern,
4644
ValidatorIPPattern,
4745
DomainPattern,

frontend/src/lang/modules/en.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2964,7 +2964,7 @@ const message = {
29642964
targetPort: 'Destination port',
29652965
forwardHelper1: 'If you want to forward to the local port, the destination IP should be set to "127.0.0.1".',
29662966
forwardHelper2: 'Leave the destination IP blank to forward to the local port.',
2967-
forwardPortHelper: 'Support port range, e.g. 80:90',
2967+
forwardPortHelper: 'Supports port ranges, e.g. 8080-8089',
29682968
forwardInboundInterface: 'Forward Inbound Network Interface',
29692969
exportHelper: 'About to export {0} firewall rules. Continue?',
29702970
importSuccess: 'Successfully imported {0} rules',

frontend/src/lang/modules/es-es.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2941,6 +2941,7 @@ const message = {
29412941
targetPort: 'Puerto de destino',
29422942
forwardHelper1: 'Si quieres reenviar al puerto local, la IP de destino debe ser "127.0.0.1".',
29432943
forwardHelper2: 'Deja en blanco la IP de destino para reenviar al puerto local.',
2944+
forwardPortHelper: 'Admite rangos de puertos, ej.: 8080-8089',
29442945
forwardInboundInterface: 'Interfaz de Red de Entrada para Reenvío',
29452946
exportHelper: 'A punto de exportar {0} reglas de firewall. ¿Continuar?',
29462947
importSuccess: 'Se importaron correctamente {0} reglas',

frontend/src/lang/modules/ja.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2882,6 +2882,7 @@ const message = {
28822882
targetPort: '宛先ポート',
28832883
forwardHelper1: 'ローカルポートに転送する場合は、宛先IPを「127.0.0.1」に設定する必要があります。',
28842884
forwardHelper2: '宛先IPを空白のままにして、ローカルポートに転送します。',
2885+
forwardPortHelper: 'ポート範囲をサポートします。例: 8080-8089',
28852886
forwardInboundInterface: '転送入站ネットワークインターフェース',
28862887
exportHelper: '{0} 件のファイアウォールルールをエクスポートします。続行しますか?',
28872888
importSuccess: '{0} 件のルールを正常にインポートしました',

frontend/src/lang/modules/ko.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2827,6 +2827,7 @@ const message = {
28272827
targetPort: '대상 포트',
28282828
forwardHelper1: "로컬 포트로 전달하려면, 대상 IP 를 '127.0.0.1'로 설정해야 합니다.",
28292829
forwardHelper2: '대상 IP 를 비워두면 로컬 포트로 전달됩니다.',
2830+
forwardPortHelper: '포트 범위를 지원합니다, 예: 8080-8089',
28302831
forwardInboundInterface: '포워딩 인바운드 네트워크 인터페이스',
28312832
exportHelper: '{0}개의 방화벽 규칙을 내보내려고 합니다. 계속하시겠습니까?',
28322833
importSuccess: '{0}개의 규칙을 성공적으로 가져왔습니다',

frontend/src/lang/modules/ms.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2944,6 +2944,7 @@ const message = {
29442944
targetPort: 'Port sasaran',
29452945
forwardHelper1: 'Jika anda ingin memajukan ke port tempatan, IP sasaran harus ditetapkan kepada "127.0.0.1".',
29462946
forwardHelper2: 'Biarkan IP sasaran kosong untuk memajukan ke port tempatan.',
2947+
forwardPortHelper: 'Menyokong julat port, cth: 8080-8089',
29472948
forwardInboundInterface: 'Antara Muka Rangkaian Masukan Penerusan',
29482949
exportHelper: 'Akan mengeksport {0} peraturan firewall. Teruskan?',
29492950
importSuccess: '{0} peraturan berjaya diimport',

frontend/src/lang/modules/pt-br.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2949,6 +2949,7 @@ const message = {
29492949
forwardHelper1:
29502950
'Se você deseja redirecionar para a porta local, o IP de destino deve ser definido como "127.0.0.1".',
29512951
forwardHelper2: 'Deixe o IP de destino em branco para redirecionar para a porta local.',
2952+
forwardPortHelper: 'Suporta intervalos de portas, ex. 8080-8089',
29522953
forwardInboundInterface: 'Interface de Rede de Entrada para Encaminhamento',
29532954
exportHelper: 'Prestes a exportar {0} regras de firewall. Continuar?',
29542955
importSuccess: '{0} regras importadas com sucesso',

frontend/src/lang/modules/ru.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2942,7 +2942,8 @@ const message = {
29422942
forwardHelper1:
29432943
'Если вы хотите перенаправить на локальный порт, целевой IP должен быть установлен как "127.0.0.1".',
29442944
forwardHelper2: 'Оставьте целевой IP пустым для перенаправления на локальный порт.',
2945-
forwardInboundInterface: '转发入站Сетевой интерфейс для пересылки входящего трафика网卡',
2945+
forwardPortHelper: 'Поддерживает диапазоны портов, напр. 8080-8089',
2946+
forwardInboundInterface: 'Сетевой интерфейс для пересылки входящего трафика',
29462947
exportHelper: 'Собираюсь экспортировать {0} правил брандмауэра. Продолжить?',
29472948
importSuccess: 'Успешно импортировано {0} правил',
29482949
importPartialSuccess: 'Импорт завершён: {0} успешно, {1} с ошибкой',

0 commit comments

Comments
 (0)