实现基础的DDoS防护

This commit is contained in:
刘祥超
2022-05-18 21:03:51 +08:00
parent 45620dcdb7
commit 9bdd9a433c
31 changed files with 2605 additions and 58 deletions

View File

@@ -5,9 +5,12 @@ import (
"github.com/cespare/xxhash"
"math"
"net"
"regexp"
"strings"
)
var ipv4Reg = regexp.MustCompile(`\d+\.`)
// IP2Long 将IP转换为整型
// 注意IPv6没有顺序
func IP2Long(ip string) uint64 {
@@ -54,3 +57,24 @@ func IsLocalIP(ipString string) bool {
return false
}
// IsIPv4 是否为IPv4
func IsIPv4(ip string) bool {
var data = net.ParseIP(ip)
if data == nil {
return false
}
if strings.Contains(ip, ":") {
return false
}
return data.To4() != nil
}
// IsIPv6 是否为IPv6
func IsIPv6(ip string) bool {
var data = net.ParseIP(ip)
if data == nil {
return false
}
return !IsIPv4(ip)
}

View File

@@ -26,3 +26,26 @@ func TestIsLocalIP(t *testing.T) {
a.IsFalse(IsLocalIP("::1:2:3"))
a.IsFalse(IsLocalIP("8.8.8.8"))
}
func TestIsIPv4(t *testing.T) {
var a = assert.NewAssertion(t)
a.IsTrue(IsIPv4("192.168.1.1"))
a.IsTrue(IsIPv4("0.0.0.0"))
a.IsFalse(IsIPv4("192.168.1.256"))
a.IsFalse(IsIPv4("192.168.1"))
a.IsFalse(IsIPv4("::1"))
a.IsFalse(IsIPv4("2001:0db8:85a3:0000:0000:8a2e:0370:7334"))
a.IsFalse(IsIPv4("::ffff:192.168.0.1"))
}
func TestIsIPv6(t *testing.T) {
var a = assert.NewAssertion(t)
a.IsFalse(IsIPv6("192.168.1.1"))
a.IsFloat32(IsIPv6("0.0.0.0"))
a.IsFalse(IsIPv6("192.168.1.256"))
a.IsFalse(IsIPv6("192.168.1"))
a.IsTrue(IsIPv6("::1"))
a.IsTrue(IsIPv6("2001:0db8:85a3:0000:0000:8a2e:0370:7334"))
a.IsTrue(IsIPv4("::ffff:192.168.0.1"))
a.IsTrue(IsIPv6("::ffff:192.168.0.1"))
}

View File

@@ -1,6 +1,7 @@
package utils
import (
"sort"
"strings"
"unsafe"
)
@@ -36,6 +37,22 @@ func FormatAddressList(addrList []string) []string {
return result
}
// ToValidUTF8string 去除字符串中的非UTF-8字符
func ToValidUTF8string(v string) string {
return strings.ToValidUTF8(v, "")
}
// ContainsSameStrings 检查两个字符串slice内容是否一致
func ContainsSameStrings(s1 []string, s2 []string) bool {
if len(s1) != len(s2) {
return false
}
sort.Strings(s1)
sort.Strings(s2)
for index, v1 := range s1 {
if v1 != s2[index] {
return false
}
}
return true
}

View File

@@ -1,56 +1,67 @@
package utils
package utils_test
import (
"github.com/TeaOSLab/EdgeNode/internal/utils"
"github.com/iwind/TeaGo/assert"
"strings"
"testing"
)
func TestBytesToString(t *testing.T) {
t.Log(UnsafeBytesToString([]byte("Hello,World")))
t.Log(utils.UnsafeBytesToString([]byte("Hello,World")))
}
func TestStringToBytes(t *testing.T) {
t.Log(string(UnsafeStringToBytes("Hello,World")))
t.Log(string(utils.UnsafeStringToBytes("Hello,World")))
}
func BenchmarkBytesToString(b *testing.B) {
data := []byte("Hello,World")
var data = []byte("Hello,World")
for i := 0; i < b.N; i++ {
_ = UnsafeBytesToString(data)
_ = utils.UnsafeBytesToString(data)
}
}
func BenchmarkBytesToString2(b *testing.B) {
data := []byte("Hello,World")
var data = []byte("Hello,World")
for i := 0; i < b.N; i++ {
_ = string(data)
}
}
func BenchmarkStringToBytes(b *testing.B) {
s := strings.Repeat("Hello,World", 1024)
var s = strings.Repeat("Hello,World", 1024)
for i := 0; i < b.N; i++ {
_ = UnsafeStringToBytes(s)
_ = utils.UnsafeStringToBytes(s)
}
}
func BenchmarkStringToBytes2(b *testing.B) {
s := strings.Repeat("Hello,World", 1024)
var s = strings.Repeat("Hello,World", 1024)
for i := 0; i < b.N; i++ {
_ = []byte(s)
}
}
func TestFormatAddress(t *testing.T) {
t.Log(FormatAddress("127.0.0.1:1234"))
t.Log(FormatAddress("127.0.0.1 : 1234"))
t.Log(FormatAddress("127.0.0.11234"))
t.Log(utils.FormatAddress("127.0.0.1:1234"))
t.Log(utils.FormatAddress("127.0.0.1 : 1234"))
t.Log(utils.FormatAddress("127.0.0.11234"))
}
func TestFormatAddressList(t *testing.T) {
t.Log(FormatAddressList([]string{
t.Log(utils.FormatAddressList([]string{
"127.0.0.1:1234",
"127.0.0.1 : 1234",
"127.0.0.11234",
}))
}
func TestContainsSameStrings(t *testing.T) {
var a = assert.NewAssertion(t)
a.IsFalse(utils.ContainsSameStrings([]string{"a"}, []string{"b"}))
a.IsFalse(utils.ContainsSameStrings([]string{"a", "b"}, []string{"b"}))
a.IsFalse(utils.ContainsSameStrings([]string{"a", "b"}, []string{"a", "b", "c"}))
a.IsTrue(utils.ContainsSameStrings([]string{"a", "b"}, []string{"a", "b"}))
a.IsTrue(utils.ContainsSameStrings([]string{"a", "b"}, []string{"b", "a"}))
}