mirror of
https://github.com/v2fly/v2ray-core.git
synced 2025-01-02 15:36:41 -05:00
First attempt to regulate errors.
This commit is contained in:
parent
6ecb18268e
commit
c138004bf9
@ -21,6 +21,7 @@ V2Ray 是一个翻墙工具包,用于简化和复用其它翻墙工具,加
|
|||||||
* [建议或意见](https://github.com/v2ray/v2ray-core/issues)
|
* [建议或意见](https://github.com/v2ray/v2ray-core/issues)
|
||||||
* [Issue 指引](https://github.com/V2Ray/v2ray-core/blob/master/spec/issue.md)
|
* [Issue 指引](https://github.com/V2Ray/v2ray-core/blob/master/spec/issue.md)
|
||||||
* [当前状态](https://github.com/V2Ray/v2ray-core/blob/master/spec/status.md)
|
* [当前状态](https://github.com/V2Ray/v2ray-core/blob/master/spec/status.md)
|
||||||
|
* [错误信息](https://github.com/V2Ray/v2ray-core/blob/master/spec/errors.md)
|
||||||
|
|
||||||
## 开发人员相关
|
## 开发人员相关
|
||||||
* [概要设计](https://github.com/V2Ray/v2ray-core/blob/master/spec/design.md)
|
* [概要设计](https://github.com/V2Ray/v2ray-core/blob/master/spec/design.md)
|
||||||
|
58
common/errors/errors.go
Normal file
58
common/errors/errors.go
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
package errors
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
type AuthenticationError struct {
|
||||||
|
AuthDetail interface{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewAuthenticationError(detail interface{}) AuthenticationError {
|
||||||
|
return AuthenticationError{
|
||||||
|
AuthDetail: detail,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (err AuthenticationError) Error() string {
|
||||||
|
return fmt.Sprintf("[Error 0x0001] Invalid auth %v", err.AuthDetail)
|
||||||
|
}
|
||||||
|
|
||||||
|
type ProtocolVersionError struct {
|
||||||
|
Version int
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewProtocolVersionError(version int) ProtocolVersionError {
|
||||||
|
return ProtocolVersionError{
|
||||||
|
Version: version,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (err ProtocolVersionError) Error() string {
|
||||||
|
return fmt.Sprintf("[Error 0x0002] Invalid version %d", err.Version)
|
||||||
|
}
|
||||||
|
|
||||||
|
type CorruptedPacketError struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewCorruptedPacketError() CorruptedPacketError {
|
||||||
|
return CorruptedPacketError{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (err CorruptedPacketError) Error() string {
|
||||||
|
return "[Error 0x0003] Corrupted packet."
|
||||||
|
}
|
||||||
|
|
||||||
|
type IPFormatError struct {
|
||||||
|
IP []byte
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewIPFormatError(ip []byte) IPFormatError {
|
||||||
|
return IPFormatError{
|
||||||
|
IP: ip,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (err IPFormatError) Error() string {
|
||||||
|
return fmt.Sprintf("[Error 0x0004] Invalid IP %v", err.IP)
|
||||||
|
}
|
@ -4,6 +4,7 @@ import (
|
|||||||
"net"
|
"net"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
|
"github.com/v2ray/v2ray-core/common/errors"
|
||||||
"github.com/v2ray/v2ray-core/common/log"
|
"github.com/v2ray/v2ray-core/common/log"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -41,7 +42,8 @@ func IPAddress(ip []byte, port uint16) Address {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
panic(log.Error("Unknown IP format: %v", ip))
|
log.Error(errors.NewIPFormatError(ip).Error())
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,11 +5,11 @@ import (
|
|||||||
"crypto/aes"
|
"crypto/aes"
|
||||||
"crypto/cipher"
|
"crypto/cipher"
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"errors"
|
|
||||||
"hash/fnv"
|
"hash/fnv"
|
||||||
"io"
|
"io"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/v2ray/v2ray-core/common/errors"
|
||||||
v2io "github.com/v2ray/v2ray-core/common/io"
|
v2io "github.com/v2ray/v2ray-core/common/io"
|
||||||
"github.com/v2ray/v2ray-core/common/log"
|
"github.com/v2ray/v2ray-core/common/log"
|
||||||
v2net "github.com/v2ray/v2ray-core/common/net"
|
v2net "github.com/v2ray/v2ray-core/common/net"
|
||||||
@ -29,12 +29,6 @@ const (
|
|||||||
blockSize = 16
|
blockSize = 16
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
|
||||||
ErrorInvalidUser = errors.New("Invalid User")
|
|
||||||
ErrorInvalidVerion = errors.New("Invalid Version")
|
|
||||||
ErrorInvalidHash = errors.New("Invalid Hash")
|
|
||||||
)
|
|
||||||
|
|
||||||
// VMessRequest implements the request message of VMess protocol. It only contains the header of a
|
// VMessRequest implements the request message of VMess protocol. It only contains the header of a
|
||||||
// request message. The data part will be handled by conection handler directly, in favor of data
|
// request message. The data part will be handled by conection handler directly, in favor of data
|
||||||
// streaming.
|
// streaming.
|
||||||
@ -82,7 +76,7 @@ func (r *VMessRequestReader) Read(reader io.Reader) (*VMessRequest, error) {
|
|||||||
|
|
||||||
userId, timeSec, valid := r.vUserSet.GetUser(buffer[:nBytes])
|
userId, timeSec, valid := r.vUserSet.GetUser(buffer[:nBytes])
|
||||||
if !valid {
|
if !valid {
|
||||||
return nil, ErrorInvalidUser
|
return nil, errors.NewAuthenticationError(buffer[:nBytes])
|
||||||
}
|
}
|
||||||
|
|
||||||
aesCipher, err := aes.NewCipher(userId.CmdKey())
|
aesCipher, err := aes.NewCipher(userId.CmdKey())
|
||||||
@ -108,8 +102,7 @@ func (r *VMessRequestReader) Read(reader io.Reader) (*VMessRequest, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if request.Version != Version {
|
if request.Version != Version {
|
||||||
log.Error("Unknown VMess version %d", request.Version)
|
return nil, errors.NewProtocolVersionError(int(request.Version))
|
||||||
return nil, ErrorInvalidVerion
|
|
||||||
}
|
}
|
||||||
|
|
||||||
copy(request.RequestIV[:], buffer[1:17]) // 16 bytes
|
copy(request.RequestIV[:], buffer[1:17]) // 16 bytes
|
||||||
@ -159,7 +152,7 @@ func (r *VMessRequestReader) Read(reader io.Reader) (*VMessRequest, error) {
|
|||||||
expectedHash := binary.BigEndian.Uint32(buffer[bufferLen : bufferLen+4])
|
expectedHash := binary.BigEndian.Uint32(buffer[bufferLen : bufferLen+4])
|
||||||
|
|
||||||
if actualHash != expectedHash {
|
if actualHash != expectedHash {
|
||||||
return nil, ErrorInvalidHash
|
return nil, errors.NewCorruptedPacketError()
|
||||||
}
|
}
|
||||||
|
|
||||||
return request, nil
|
return request, nil
|
||||||
|
25
spec/errors.md
Normal file
25
spec/errors.md
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
# 错误信息
|
||||||
|
|
||||||
|
## 简介
|
||||||
|
在日志中可以看到 [Error XXXXXX] 的信息,其中 XXXXXX 表示错误代码,已知的错误代码和解释如下:
|
||||||
|
|
||||||
|
|
||||||
|
## 0x0001 Authentication Error
|
||||||
|
原因:未认证用户。
|
||||||
|
解决:请检查客户端和服务器的用户数据。
|
||||||
|
|
||||||
|
## 0x0002 Protocol Version Error
|
||||||
|
原因:客户端使用了不正确的协议
|
||||||
|
解决:
|
||||||
|
* 如果错误信息为 Invalid version 67 (或 71、80),则表示你的浏览器使用了 HTTP 代理,而 V2Ray 只接受 Socks 代理。
|
||||||
|
* 请检查客户端配置。
|
||||||
|
|
||||||
|
## 0x0003 Corrupted Packet Error
|
||||||
|
原因:网络数据损坏
|
||||||
|
解决:极有可能你的网络连接被劫持,请更换网络线路或 IP。
|
||||||
|
|
||||||
|
|
||||||
|
## 0x0004 IP Format Error
|
||||||
|
原因:不正确的 IP 地址
|
||||||
|
解决:请检查客户端软件,如浏览器的配置
|
||||||
|
|
@ -92,7 +92,10 @@ Point Server B
|
|||||||
|
|
||||||
./server --config="vpoint_vmess_freedom.json 的绝对路径"
|
./server --config="vpoint_vmess_freedom.json 的绝对路径"
|
||||||
|
|
||||||
## 测试服务器可用性:
|
## 测试服务器可用性
|
||||||
|
|
||||||
curl -v --socks5-hostname 127.0.0.1:1080 https://www.google.com/
|
curl -v --socks5-hostname 127.0.0.1:1080 https://www.google.com/
|
||||||
|
|
||||||
|
## 调试
|
||||||
|
|
||||||
|
使用过程中遇到任何问题,请参考[错误信息](https://github.com/V2Ray/v2ray-core/blob/master/spec/errors.md)。
|
||||||
|
Loading…
Reference in New Issue
Block a user