@@ -45,27 +45,37 @@ func (f *firewall) Install(ctx context.Context) error {
4545 return fmt .Errorf ("%s" , i18n .T .Get ("Unsupported operating system" ))
4646 }
4747
48- // Debian/Ubuntu 需要先禁用并卸载 ufw
4948 if info .OS == types .OSDebian || info .OS == types .OSUbuntu {
50- _ , _ = f .executor .Run (ctx , "ufw" , "disable" )
51- _ , _ = f .executor .Run (ctx , "systemctl" , "stop" , "ufw" )
52- _ , _ = f .executor .Run (ctx , "systemctl" , "disable" , "ufw" )
53- _ = pkgMgr .Remove (ctx , "ufw" )
54-
55- // 还有个傻逼 cloud-init 和 firewalld 冲突
56- _ = pkgMgr .Remove (ctx , "cloud-init" )
49+ return pkgMgr .Install (ctx , "ufw" )
5750 }
5851
5952 return pkgMgr .Install (ctx , "firewalld" )
6053}
6154
6255func (f * firewall ) Enable (ctx context.Context ) error {
56+ ufw , err := f .isUFW (ctx )
57+ if err != nil {
58+ return err
59+ }
60+
61+ if ufw {
62+ result , err := f .executor .Run (ctx , "ufw" , "--force" , "enable" )
63+ if err != nil {
64+ return err
65+ }
66+ if result .ExitCode != 0 {
67+ return fmt .Errorf ("%s: %s" , i18n .T .Get ("Failed to enable firewall" ), result .Stderr )
68+ }
69+ return nil
70+ }
71+
72+ // firewalld
6373 result , err := f .executor .Run (ctx , "systemctl" , "enable" , "--now" , "firewalld" )
6474 if err != nil {
6575 return err
6676 }
6777 if result .ExitCode != 0 {
68- return fmt .Errorf ("%s: %s" , i18n .T .Get ("Failed to enable firewalld " ), result .Stderr )
78+ return fmt .Errorf ("%s: %s" , i18n .T .Get ("Failed to enable firewall " ), result .Stderr )
6979 }
7080
7181 // 设置默认zone
@@ -74,7 +84,24 @@ func (f *firewall) Enable(ctx context.Context) error {
7484}
7585
7686func (f * firewall ) AddPort (ctx context.Context , port int , protocol string ) error {
87+ ufw , err := f .isUFW (ctx )
88+ if err != nil {
89+ return err
90+ }
91+
7792 portStr := fmt .Sprintf ("%d/%s" , port , protocol )
93+
94+ if ufw {
95+ result , err := f .executor .Run (ctx , "ufw" , "allow" , portStr )
96+ if err != nil {
97+ return err
98+ }
99+ if result .ExitCode != 0 {
100+ return fmt .Errorf ("%s %s: %s" , i18n .T .Get ("Failed to add port" ), portStr , result .Stderr )
101+ }
102+ return nil
103+ }
104+
78105 result , err := f .executor .Run (ctx , "firewall-cmd" , "--permanent" , "--zone=public" , "--add-port=" + portStr )
79106 if err != nil {
80107 return err
@@ -86,7 +113,24 @@ func (f *firewall) AddPort(ctx context.Context, port int, protocol string) error
86113}
87114
88115func (f * firewall ) RemovePort (ctx context.Context , port int , protocol string ) error {
116+ ufw , err := f .isUFW (ctx )
117+ if err != nil {
118+ return err
119+ }
120+
89121 portStr := fmt .Sprintf ("%d/%s" , port , protocol )
122+
123+ if ufw {
124+ result , err := f .executor .Run (ctx , "ufw" , "delete" , "allow" , portStr )
125+ if err != nil {
126+ return err
127+ }
128+ if result .ExitCode != 0 {
129+ return fmt .Errorf ("%s %s: %s" , i18n .T .Get ("Failed to remove port" ), portStr , result .Stderr )
130+ }
131+ return nil
132+ }
133+
90134 result , err := f .executor .Run (ctx , "firewall-cmd" , "--permanent" , "--zone=public" , "--remove-port=" + portStr )
91135 if err != nil {
92136 return err
@@ -98,6 +142,22 @@ func (f *firewall) RemovePort(ctx context.Context, port int, protocol string) er
98142}
99143
100144func (f * firewall ) Reload (ctx context.Context ) error {
145+ ufw , err := f .isUFW (ctx )
146+ if err != nil {
147+ return err
148+ }
149+
150+ if ufw {
151+ result , err := f .executor .Run (ctx , "ufw" , "reload" )
152+ if err != nil {
153+ return err
154+ }
155+ if result .ExitCode != 0 {
156+ return fmt .Errorf ("%s: %s" , i18n .T .Get ("Failed to reload firewall" ), result .Stderr )
157+ }
158+ return nil
159+ }
160+
101161 result , err := f .executor .Run (ctx , "firewall-cmd" , "--reload" )
102162 if err != nil {
103163 return err
@@ -107,3 +167,11 @@ func (f *firewall) Reload(ctx context.Context) error {
107167 }
108168 return nil
109169}
170+
171+ func (f * firewall ) isUFW (ctx context.Context ) (bool , error ) {
172+ info , err := f .detector .Detect (ctx )
173+ if err != nil {
174+ return false , err
175+ }
176+ return info .OS == types .OSDebian || info .OS == types .OSUbuntu , nil
177+ }
0 commit comments