Skip to content

Commit 23d9238

Browse files
committed
feat(p2p): add ICMP backend support
1 parent 9e642f8 commit 23d9238

19 files changed

Lines changed: 809 additions & 28 deletions

File tree

README.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ WireGold is a pure Go Layer 3 VPN inspired by WireGuard.
1515
### Features
1616

1717
- **Encryption**: XChaCha20-Poly1305 (AEAD) + Curve25519 key exchange + BLAKE2B integrity check
18-
- **Transport**: UDP / UDP-Lite / TCP / Raw IP
18+
- **Transport**: UDP / UDP-Lite / TCP / Raw IP / ICMP
1919
- **Encoding**: Optional Base16384 encoding to traverse text-only filters
2020
- **Anti-censorship**: XOR mask header obfuscation + randomized MTU scaling + optional double-send
2121
- **Compression**: Optional Zstd payload compression
@@ -54,14 +54,17 @@ wg [-c config.yaml] [-d|w] [-g] [-h] [-p] [-l log.txt]
5454

5555
- **macOS Mojave**: max MTU (IPv4 endpoint) is `9159`
5656
- **IPv6 endpoint**: recommended MTU `1280–1500` to avoid oversized segment drops
57+
- **ICMP / Raw IP endpoint**: use bare IP address without port (e.g. `0.0.0.0`), requires root/admin privileges
5758

5859
```yaml
5960
IP: 192.168.233.1
6061
SubNet: 192.168.233.0/24
6162
PrivateKey: 暲菉斂狧污爉窫擸紈卆帞蔩慈睠庮扝憚瞼縀
63+
Network: udp # udp (default), udplite, tcp, ip, icmp
6264
EndPoint: 0.0.0.0:56789
6365
MTU: 1504
6466
SpeedLoop: 4096
67+
MaxTTL: 64
6568
Mask: 0x1234567890abcdef
6669
Base14: true
6770
Peers:
@@ -94,6 +97,9 @@ Peers:
9497
9598
| Field | Description |
9699
|-------|-------------|
100+
| `Network` | Transport protocol: `udp` (default), `udplite`, `tcp`, `ip`, `icmp` |
101+
| `MaxTTL` | Initial TTL for outgoing packets; default `64` |
102+
| `SpeedLoop` | Log receive throughput statistics every N packets; default `4096` |
97103
| `AllowedIPs` | Prefix `x` to accept packets from the subnet without creating a system route; prefix `y` to add an internal route table entry only |
98104
| `Mask` | XOR mask for header obfuscation |
99105
| `Base14` | Enable Base16384 encoding |

README_ZH.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ WireGold 是一个纯 Go 实现的第 3 层 VPN,灵感来自 WireGuard。
1515
### 主要特性
1616

1717
- **加密**: XChaCha20-Poly1305 (AEAD) + Curve25519 密钥交换 + BLAKE2B 完整性校验
18-
- **传输**: 支持 UDP / UDP-Lite / TCP / Raw IP 多种底层传输
18+
- **传输**: 支持 UDP / UDP-Lite / TCP / Raw IP / ICMP 多种底层传输
1919
- **编码**: 可选 Base16384 编码以穿越文本过滤
2020
- **抗审查**: XOR 掩码混淆报头 + 随机 MTU 放缩 + 可选双倍发包
2121
- **压缩**: 可选 Zstd 数据压缩
@@ -53,14 +53,17 @@ wg [-c config.yaml] [-d|w] [-g] [-h] [-p] [-l log.txt]
5353

5454
- **macOS Mojave**: 最大 MTU (IPv4 endpoint) 为 `9159`
5555
- **IPv6 endpoint**: 推荐 MTU `1280~1500`,避免大分片被丢弃
56+
- **ICMP / Raw IP endpoint**: 使用裸 IP 地址,无需端口号 (如 `0.0.0.0`)。需要 root/管理员权限
5657

5758
```yaml
5859
IP: 192.168.233.1
5960
SubNet: 192.168.233.0/24
6061
PrivateKey: 暲菉斂狧污爉窫擸紈卆帞蔩慈睠庮扝憚瞼縀
62+
Network: udp # udp (默认), udplite, tcp, ip, icmp
6163
EndPoint: 0.0.0.0:56789
6264
MTU: 1504
6365
SpeedLoop: 4096
66+
MaxTTL: 64
6467
Mask: 0x1234567890abcdef
6568
Base14: true
6669
Peers:
@@ -93,6 +96,9 @@ Peers:
9396
9497
| 字段 | 说明 |
9598
|------|------|
99+
| `Network` | 传输协议: `udp` (默认), `udplite`, `tcp`, `ip`, `icmp` |
100+
| `MaxTTL` | 发包初始 TTL,默认 `64` |
101+
| `SpeedLoop` | 每收到 N 个包时输出一次吞吐统计,默认 `4096` |
96102
| `AllowedIPs` | 前缀 `x` 表示只接受该网段报文但不建系统路由;前缀 `y` 表示只添加内部路由表条目 |
97103
| `Mask` | XOR 掩码,用于混淆报头 |
98104
| `Base14` | 启用 Base16384 编码 |

go.mod

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,13 @@ require (
1212
github.com/fumiama/water v0.0.0-20211231134027-da391938d6ac
1313
github.com/klauspost/compress v1.18.5
1414
github.com/sirupsen/logrus v1.9.4
15-
golang.org/x/crypto v0.49.0
15+
golang.org/x/crypto v0.50.0
16+
golang.org/x/net v0.53.0
17+
golang.org/x/sys v0.43.0
1618
gopkg.in/yaml.v3 v3.0.1
1719
)
1820

1921
require (
2022
github.com/fumiama/wintun v0.0.0-20211229152851-8bc97c8034c0 // indirect
21-
golang.org/x/sys v0.43.0 // indirect
22-
golang.org/x/text v0.35.0 // indirect
23+
golang.org/x/text v0.36.0 // indirect
2324
)

go.sum

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,18 +30,20 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
3030
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
3131
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
3232
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
33-
golang.org/x/crypto v0.49.0 h1:+Ng2ULVvLHnJ/ZFEq4KdcDd/cfjrrjjNSXNzxg0Y4U4=
34-
golang.org/x/crypto v0.49.0/go.mod h1:ErX4dUh2UM+CFYiXZRTcMpEcN8b/1gxEuv3nODoYtCA=
33+
golang.org/x/crypto v0.50.0 h1:zO47/JPrL6vsNkINmLoo/PH1gcxpls50DNogFvB5ZGI=
34+
golang.org/x/crypto v0.50.0/go.mod h1:3muZ7vA7PBCE6xgPX7nkzzjiUq87kRItoJQM1Yo8S+Q=
3535
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
36+
golang.org/x/net v0.53.0 h1:d+qAbo5L0orcWAr0a9JweQpjXF19LMXJE8Ey7hwOdUA=
37+
golang.org/x/net v0.53.0/go.mod h1:JvMuJH7rrdiCfbeHoo3fCQU24Lf5JJwT9W3sJFulfgs=
3638
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
3739
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
3840
golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI=
3941
golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
4042
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
4143
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
4244
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
43-
golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8=
44-
golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA=
45+
golang.org/x/text v0.36.0 h1:JfKh3XmcRPqZPKevfXVpI1wXPTqbkE5f7JA92a55Yxg=
46+
golang.org/x/text v0.36.0/go.mod h1:NIdBknypM8iqVmPiuco0Dh6P5Jcdk8lJL0CUebqK164=
4547
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
4648
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
4749
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=

gold/link/me.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,10 @@ func (m *Me) NetworkConfigs() []any {
208208

209209
func (m *Me) Close() error {
210210
for i := 0; i < len(m.jobs); i++ {
211-
close(m.jobs[i])
211+
jb := m.jobs[i]
212+
if jb != nil {
213+
close(jb)
214+
}
212215
}
213216
m.connections = nil
214217
if bin.IsNonNilInterface(m.conn) {

gold/link/peer.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,8 +137,8 @@ func (m *Me) extractPeer(srcip, dstip net.IP, addr p2p.EndPoint) *Link {
137137
logrus.Warnln(file.Header(), "packet from", srcip, "to", dstip, "is refused")
138138
return nil
139139
}
140-
if bin.IsNilInterface(p.endpoint) || !p.endpoint.Euqal(addr) {
141-
if m.ep.Network() == "tcp" && !addr.Euqal(p.endpoint) {
140+
if bin.IsNilInterface(p.endpoint) || !p.endpoint.Equal(addr) {
141+
if m.ep.Network() == "tcp" && !addr.Equal(p.endpoint) {
142142
logrus.Infoln(file.Header(), "set endpoint of peer", p.peerip, "to", addr.String())
143143
p.endpoint = addr
144144
} else { // others are all no status link

gold/link/send.go

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -75,16 +75,12 @@ func (l *Link) write2peer(b pbuf.Bytes, seq uint32) {
7575
if l.doublepacket {
7676
err := l.write2peer1(b, seq)
7777
if err != nil {
78-
if config.ShowDebugLog {
79-
logrus.Warnln("[send] double wr2peer", l.peerip, "err:", err)
80-
}
78+
logrus.Warnln("[send] double wr2peer", l.peerip, "err:", err)
8179
}
8280
}
8381
err := l.write2peer1(b, seq)
8482
if err != nil {
85-
if config.ShowDebugLog {
86-
logrus.Warnln("[send] wr2peer", l.peerip, "err:", err)
87-
}
83+
logrus.Warnln("[send] wr2peer", l.peerip, "err:", err)
8884
}
8985
}
9086

gold/p2p/define.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ func Register(network string, initializer Initializer) (actual Initializer, hase
2323
type EndPoint interface {
2424
fmt.Stringer
2525
Network() string
26-
Euqal(EndPoint) bool
26+
Equal(EndPoint) bool
2727
Listen() (Conn, error)
2828
}
2929

0 commit comments

Comments
 (0)