Normalize AllocatedIPs/ExtraAllowedIPs to network address before ip route replace
A client CIDR with nonzero host bits (e.g. 10.66.120.1/30 instead of the network 10.66.120.0/30) is tolerated by wg's own AllowedIPs/setconf, which just warns, but plain iproute2 rejects it with "Invalid prefix for given prefix length" and aborts the whole PostUp chain, taking the interface down on start. Added a routeNet template func that clears host bits via net.ParseCIDR before generating each PostUp route line. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ATVUwTa4Pqwq26orW5BcDW
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
3e57de1b44
commit
1539c589a1
@@ -3597,3 +3597,219 @@ Keine Commits in dieser Session.
|
|||||||
- wireguard/service.go | 24 +++
|
- wireguard/service.go | 24 +++
|
||||||
|
|
||||||
---
|
---
|
||||||
|
## 2026-07-29 13:37 – 13:38 (0m)
|
||||||
|
**Beschreibung:** Claude Code Session
|
||||||
|
**Projekt:** wireguard-ui-multi
|
||||||
|
|
||||||
|
### Commits
|
||||||
|
- 3e57de1 Make Start/Stop enable/disable the wg-quick unit, not just start/stop it
|
||||||
|
|
||||||
|
### Geänderte Dateien
|
||||||
|
- DEVLOG.md | 136 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
- wireguard/service.go | 23 ++++++++++++-----
|
||||||
|
|
||||||
|
---
|
||||||
|
## 2026-07-29 13:41 – 13:42 (0m)
|
||||||
|
**Beschreibung:** Claude Code Session
|
||||||
|
**Projekt:** wireguard-ui-multi
|
||||||
|
|
||||||
|
### Commits
|
||||||
|
Keine Commits in dieser Session.
|
||||||
|
|
||||||
|
### Geänderte Dateien
|
||||||
|
- DEVLOG.md | 136 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
- wireguard/service.go | 23 ++++++++++++-----
|
||||||
|
|
||||||
|
---
|
||||||
|
## 2026-07-29 13:43 – 13:44 (0m)
|
||||||
|
**Beschreibung:** Claude Code Session
|
||||||
|
**Projekt:** wireguard-ui-multi
|
||||||
|
|
||||||
|
### Commits
|
||||||
|
Keine Commits in dieser Session.
|
||||||
|
|
||||||
|
### Geänderte Dateien
|
||||||
|
- DEVLOG.md | 136 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
- wireguard/service.go | 23 ++++++++++++-----
|
||||||
|
|
||||||
|
---
|
||||||
|
## 2026-07-29 13:46 – 13:48 (2m)
|
||||||
|
**Beschreibung:** Claude Code Session
|
||||||
|
**Projekt:** wireguard-ui-multi
|
||||||
|
|
||||||
|
### Commits
|
||||||
|
Keine Commits in dieser Session.
|
||||||
|
|
||||||
|
### Geänderte Dateien
|
||||||
|
- DEVLOG.md | 136 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
- wireguard/service.go | 23 ++++++++++++-----
|
||||||
|
|
||||||
|
---
|
||||||
|
## 2026-07-29 13:49 – 13:50 (0m)
|
||||||
|
**Beschreibung:** Claude Code Session
|
||||||
|
**Projekt:** wireguard-ui-multi
|
||||||
|
|
||||||
|
### Commits
|
||||||
|
Keine Commits in dieser Session.
|
||||||
|
|
||||||
|
### Geänderte Dateien
|
||||||
|
- DEVLOG.md | 136 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
- wireguard/service.go | 23 ++++++++++++-----
|
||||||
|
|
||||||
|
---
|
||||||
|
## 2026-07-29 13:51 – 13:51 (0m)
|
||||||
|
**Beschreibung:** Claude Code Session
|
||||||
|
**Projekt:** wireguard-ui-multi
|
||||||
|
|
||||||
|
### Commits
|
||||||
|
Keine Commits in dieser Session.
|
||||||
|
|
||||||
|
### Geänderte Dateien
|
||||||
|
- DEVLOG.md | 136 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
- wireguard/service.go | 23 ++++++++++++-----
|
||||||
|
|
||||||
|
---
|
||||||
|
## 2026-07-29 13:51 – 13:52 (0m)
|
||||||
|
**Beschreibung:** Claude Code Session
|
||||||
|
**Projekt:** wireguard-ui-multi
|
||||||
|
|
||||||
|
### Commits
|
||||||
|
Keine Commits in dieser Session.
|
||||||
|
|
||||||
|
### Geänderte Dateien
|
||||||
|
- DEVLOG.md | 136 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
- wireguard/service.go | 23 ++++++++++++-----
|
||||||
|
|
||||||
|
---
|
||||||
|
## 2026-07-29 13:53 – 13:54 (0m)
|
||||||
|
**Beschreibung:** Claude Code Session
|
||||||
|
**Projekt:** wireguard-ui-multi
|
||||||
|
|
||||||
|
### Commits
|
||||||
|
Keine Commits in dieser Session.
|
||||||
|
|
||||||
|
### Geänderte Dateien
|
||||||
|
- DEVLOG.md | 136 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
- wireguard/service.go | 23 ++++++++++++-----
|
||||||
|
|
||||||
|
---
|
||||||
|
## 2026-07-29 14:01 – 14:02 (0m)
|
||||||
|
**Beschreibung:** Claude Code Session
|
||||||
|
**Projekt:** wireguard-ui-multi
|
||||||
|
|
||||||
|
### Commits
|
||||||
|
Keine Commits in dieser Session.
|
||||||
|
|
||||||
|
### Geänderte Dateien
|
||||||
|
- DEVLOG.md | 136 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
- wireguard/service.go | 23 ++++++++++++-----
|
||||||
|
|
||||||
|
---
|
||||||
|
## 2026-07-29 14:04 – 14:04 (0m)
|
||||||
|
**Beschreibung:** Claude Code Session
|
||||||
|
**Projekt:** wireguard-ui-multi
|
||||||
|
|
||||||
|
### Commits
|
||||||
|
Keine Commits in dieser Session.
|
||||||
|
|
||||||
|
### Geänderte Dateien
|
||||||
|
- DEVLOG.md | 136 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
- wireguard/service.go | 23 ++++++++++++-----
|
||||||
|
|
||||||
|
---
|
||||||
|
## 2026-07-29 14:10 – 14:10 (0m)
|
||||||
|
**Beschreibung:** Claude Code Session
|
||||||
|
**Projekt:** wireguard-ui-multi
|
||||||
|
|
||||||
|
### Commits
|
||||||
|
Keine Commits in dieser Session.
|
||||||
|
|
||||||
|
### Geänderte Dateien
|
||||||
|
- DEVLOG.md | 136 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
- wireguard/service.go | 23 ++++++++++++-----
|
||||||
|
|
||||||
|
---
|
||||||
|
## 2026-07-29 14:11 – 14:11 (0m)
|
||||||
|
**Beschreibung:** Claude Code Session
|
||||||
|
**Projekt:** wireguard-ui-multi
|
||||||
|
|
||||||
|
### Commits
|
||||||
|
Keine Commits in dieser Session.
|
||||||
|
|
||||||
|
### Geänderte Dateien
|
||||||
|
- DEVLOG.md | 136 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
- wireguard/service.go | 23 ++++++++++++-----
|
||||||
|
|
||||||
|
---
|
||||||
|
## 2026-07-29 14:12 – 14:12 (0m)
|
||||||
|
**Beschreibung:** Claude Code Session
|
||||||
|
**Projekt:** wireguard-ui-multi
|
||||||
|
|
||||||
|
### Commits
|
||||||
|
Keine Commits in dieser Session.
|
||||||
|
|
||||||
|
### Geänderte Dateien
|
||||||
|
- DEVLOG.md | 136 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
- wireguard/service.go | 23 ++++++++++++-----
|
||||||
|
|
||||||
|
---
|
||||||
|
## 2026-07-29 14:15 – 14:18 (2m)
|
||||||
|
**Beschreibung:** Claude Code Session
|
||||||
|
**Projekt:** wireguard-ui-multi
|
||||||
|
|
||||||
|
### Commits
|
||||||
|
Keine Commits in dieser Session.
|
||||||
|
|
||||||
|
### Geänderte Dateien
|
||||||
|
- DEVLOG.md | 136 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
- wireguard/service.go | 23 ++++++++++++-----
|
||||||
|
|
||||||
|
---
|
||||||
|
## 2026-07-29 14:18 – 14:20 (2m)
|
||||||
|
**Beschreibung:** Claude Code Session
|
||||||
|
**Projekt:** wireguard-ui-multi
|
||||||
|
|
||||||
|
### Commits
|
||||||
|
Keine Commits in dieser Session.
|
||||||
|
|
||||||
|
### Geänderte Dateien
|
||||||
|
- DEVLOG.md | 136 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
- wireguard/service.go | 23 ++++++++++++-----
|
||||||
|
|
||||||
|
---
|
||||||
|
## 2026-07-29 14:21 – 14:21 (0m)
|
||||||
|
**Beschreibung:** Claude Code Session
|
||||||
|
**Projekt:** wireguard-ui-multi
|
||||||
|
|
||||||
|
### Commits
|
||||||
|
Keine Commits in dieser Session.
|
||||||
|
|
||||||
|
### Geänderte Dateien
|
||||||
|
- DEVLOG.md | 136 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
- wireguard/service.go | 23 ++++++++++++-----
|
||||||
|
|
||||||
|
---
|
||||||
|
## 2026-07-29 14:22 – 14:23 (0m)
|
||||||
|
**Beschreibung:** Claude Code Session
|
||||||
|
**Projekt:** wireguard-ui-multi
|
||||||
|
|
||||||
|
### Commits
|
||||||
|
Keine Commits in dieser Session.
|
||||||
|
|
||||||
|
### Geänderte Dateien
|
||||||
|
- DEVLOG.md | 136 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
- wireguard/service.go | 23 ++++++++++++-----
|
||||||
|
|
||||||
|
---
|
||||||
|
## 2026-07-29 14:25 – 14:28 (2m)
|
||||||
|
**Beschreibung:** Claude Code Session
|
||||||
|
**Projekt:** wireguard-ui-multi
|
||||||
|
|
||||||
|
### Commits
|
||||||
|
Keine Commits in dieser Session.
|
||||||
|
|
||||||
|
### Geänderte Dateien
|
||||||
|
- DEVLOG.md | 136 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
- wireguard/service.go | 23 ++++++++++++-----
|
||||||
|
|
||||||
|
---
|
||||||
|
|||||||
+1
-1
@@ -17,7 +17,7 @@ PreUp = {{ .serverConfig.Interface.PreUp }}
|
|||||||
# "RTNETLINK: File exists" the moment two servers claim the same route,
|
# "RTNETLINK: File exists" the moment two servers claim the same route,
|
||||||
# which used to take down every server started after the first. `replace`
|
# which used to take down every server started after the first. `replace`
|
||||||
# is idempotent and never fails on a pre-existing route.
|
# is idempotent and never fails on a pre-existing route.
|
||||||
PostUp = {{ .serverConfig.Interface.PostUp }}{{range .clientDataList}}{{if eq .Client.Enabled true}}{{range .Client.AllocatedIPs}}ip route replace {{.}} dev %i; {{end}}{{range .Client.ExtraAllowedIPs}}ip route replace {{.}} dev %i; {{end}}{{end}}{{end}}
|
PostUp = {{ .serverConfig.Interface.PostUp }}{{range .clientDataList}}{{if eq .Client.Enabled true}}{{range .Client.AllocatedIPs}}ip route replace {{routeNet .}} dev %i; {{end}}{{range .Client.ExtraAllowedIPs}}ip route replace {{routeNet .}} dev %i; {{end}}{{end}}{{end}}
|
||||||
PreDown = {{ .serverConfig.Interface.PreDown }}
|
PreDown = {{ .serverConfig.Interface.PreDown }}
|
||||||
PostDown = {{ .serverConfig.Interface.PostDown }}
|
PostDown = {{ .serverConfig.Interface.PostDown }}
|
||||||
Table = off
|
Table = off
|
||||||
|
|||||||
+20
-1
@@ -566,6 +566,23 @@ func GetSubnetRangesString() string {
|
|||||||
return strings.TrimSpace(strB.String())
|
return strings.TrimSpace(strB.String())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// routeNetworkCIDR normalizes a CIDR string to its network address (host
|
||||||
|
// bits cleared) for use in `ip route replace <cidr> dev %i` PostUp lines.
|
||||||
|
// wg's own AllowedIPs/setconf tolerates a CIDR with nonzero host bits (e.g.
|
||||||
|
// a peer address like 10.66.120.1/30 instead of the network 10.66.120.0/30)
|
||||||
|
// and just warns, but plain `ip route replace` rejects it outright with
|
||||||
|
// "Invalid prefix for given prefix length" and aborts the whole wg-quick
|
||||||
|
// up - taking down the interface over what should be a harmless data-entry
|
||||||
|
// quirk. Malformed input is passed through unchanged so the resulting
|
||||||
|
// PostUp line still fails loudly instead of silently mangling an address.
|
||||||
|
func routeNetworkCIDR(cidr string) string {
|
||||||
|
_, ipnet, err := net.ParseCIDR(cidr)
|
||||||
|
if err != nil {
|
||||||
|
return cidr
|
||||||
|
}
|
||||||
|
return ipnet.String()
|
||||||
|
}
|
||||||
|
|
||||||
// WriteWireGuardServerConfig to write Wireguard server config. e.g. wg0.conf
|
// WriteWireGuardServerConfig to write Wireguard server config. e.g. wg0.conf
|
||||||
func WriteWireGuardServerConfig(tmplDir fs.FS, serverConfig model.Server, clientDataList []model.ClientData, usersList []model.User, globalSettings model.GlobalSetting) error {
|
func WriteWireGuardServerConfig(tmplDir fs.FS, serverConfig model.Server, clientDataList []model.ClientData, usersList []model.User, globalSettings model.GlobalSetting) error {
|
||||||
var tmplWireguardConf string
|
var tmplWireguardConf string
|
||||||
@@ -596,7 +613,9 @@ func WriteWireGuardServerConfig(tmplDir fs.FS, serverConfig model.Server, client
|
|||||||
}
|
}
|
||||||
|
|
||||||
// parse the template
|
// parse the template
|
||||||
t, err := template.New("wg_config").Parse(tmplWireguardConf)
|
t, err := template.New("wg_config").Funcs(template.FuncMap{
|
||||||
|
"routeNet": routeNetworkCIDR,
|
||||||
|
}).Parse(tmplWireguardConf)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user