用GO实现IP门禁优化网络流量管理

 更新时间:2023年12月25日 10:31:13   作者:南丞 PFinalClub  
这篇文章主要为大家介绍了用GO实现IP门禁优化网络流量管理,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

背景

最近在处理数据时,发现线上某个接口的访问量异常高。在初次设计时,并未对流量和访问量进行限制,因此对具体情况并不太清楚。为了解决这一问题,搞了一个简单的IP过滤脚本,并进行了记录。

之前搞IP过滤的时候, 使用了 PHP 的 workerman 来搞的 其实思路差不多一样:

$worker = new Worker('tcp:0.0.0.0:8080');
// 监听一个端口
$worker->count = 2;
// 设置多进程
$worker->onConnect = function (TcpConnection $connection) {
    $list_ip = []; // ip 白名单 
    $remote_ip = $connection->getRemoteIp();
    // 拦截IP
    if (!in_array($remote_ip, $list_ip)) {
        $connection->close();
    }
    // 放行连接,连接内部目标端口
    $to_connection = new AsyncTcpConnection('tcp:127.0.0.1:80');
    // 互相转发流量
    $connection->pipe($to_connection);
    $to_connection->pipe($connection);
    $to_connection->connect();
}

以上PHP代码创建了一个TCP监听器,在连接时进行IP过滤,并将流量转发到目标端口。

Go实现客户端

func main() {
	listener, err := net.Listen("tcp", "127.0.0.1:8080")
	if err != nil {
		fmt.Println("Listen() failed, err: ", err)
		return
	}
	defer func(listener net.Listener) {
		_ = listener.Close()
	}(listener)
	for {
		conn, err := listener.Accept()
		if err != nil {
			fmt.Println("Accept() failed, err: ", err)
			continue
		}
		ip, _, _ := net.SplitHostPort(conn.RemoteAddr().String())
		if !isIPAllowed(ip) {
			fmt.Println("IP: ", ip, " is not allowed")
			_ = conn.Close()
			// TODO 对非白名单IP的连接,应该进行一些处理,比如记录日志
			continue
		}
		fmt.Println("IP: ", ip, " is allowed")
		go handleConn(conn)  // 转发到固定的目标端口
	}
}
func handleConn(conn net.Conn) {
	defer func(conn net.Conn) {
		_ = conn.Close()
	}(conn)
	target, err := net.Dial("tcp", "127.0.0.1:80")
	if err != nil {
		fmt.Println("Dial() failed, err: ", err)
		return
	}
	defer func(target net.Conn) {
		_ = target.Close()
	}(target)
	// 使用 copyAndCount 的并发执行版本(同时处理流向)
	go copyAndCount(target, conn, &inTraffic)
	copyAndCount(conn, target, &outTraffic) // Block until this copy is done
}

代码流程

  • 启动一个 TCP 监听器,等待客户端的连接请求。

  • 当收到连接请求时,检查连接的 IP 是否在白名单中。

  • 如果 IP 在白名单中,则开始处理连接,将连接的流量从输入流量和输出流量分别计入相应的计数器中。

  • 处理连接时,使用 copyAndCount 函数并发地处理两个方向的流量。

  • 处理完成后,关闭连接。

  • 循环等待新的连接请求。

Go 实现管理面板

刚开始准备写这个IP过滤的时候,没有考虑太多,直接就写了,后来发现,这个东西,其实可以写一个管理面板,这样就方便管理了. 然后就 使用 Gin 来整了个面板

主要功能如下:

  • IP 白名单管理, 并且提供了一个接口, 给上面的 转发客户端来用

  • 拦截统计,提供了一个接口, 给上面的客户端来上报拦截日志

  • 流量统计, 包括输入流量和输出流量

  • 流量限制, 包括输入流量限制和输出流量限制

后续完善

  • 目前这个脚本只支持了一个端口的转发,没有实现多个端口的同时绑定转发

  • 目前这个脚本没有实现对客户端的流量进行限制, 也没有实现对服务器的流量进行限制

总结

最后的最后,我也不知道我这玩意儿该叫啥, 因为, 其实, 它就是一个转发代理, 只不过, 它对流量进行了限制, 并且对流量进行了统计, 并且提供了管理面板.

以上就是用GO实现IP门禁优化网络流量管理的详细内容,更多关于GO IP门禁的资料请关注脚本之家其它相关文章!

相关文章

  • 详解Golang中channel的实现

    详解Golang中channel的实现

    channel俗称管道,用于数据传递或数据共享,其本质是一个先进先出的队列,使用goroutine+channel进行数据通讯简单高效,同时也线程安全,本文就给大家讲讲Golang中channel的实现,需要的朋友可以参考下
    2023-09-09
  • Go语言中struct的匿名属性特征实例分析

    Go语言中struct的匿名属性特征实例分析

    这篇文章主要介绍了Go语言中struct的匿名属性特征,实例分析了struct的匿名属性特征,对于深入学习Go语言程序设计具有一定参考借鉴价值,需要的朋友可以参考下
    2015-02-02
  • Go定时器的三种实现方式示例详解

    Go定时器的三种实现方式示例详解

    这篇文章主要为大家介绍了Go定时器的三种实现方式示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • golang中的时间格式化

    golang中的时间格式化

    这篇文章主要介绍了golang中的时间格式化问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • Go语言panic和recover的用法实例

    Go语言panic和recover的用法实例

    panic()和recover()是Go语言中用于处理错误的两个重要函数,本文主要介绍了Go语言panic和recover的用法实例,panic()用于中止程序并引发panic,而recover()用于捕获panic并恢复程序的执行,感兴趣的可以了解一下
    2024-01-01
  • Go开发go-optioner工具实现轻松生成函数选项模式代码

    Go开发go-optioner工具实现轻松生成函数选项模式代码

    go-optioner 是一个在 Go 代码中生成函数选项模式代码的工具,可以根据给定的结构定义自动生成相应的选项代码,下面就来聊聊go-optioner是如何使用的吧
    2023-07-07
  • Golang动态调用方法小结

    Golang动态调用方法小结

    本文主要介绍了Golang动态调用方法小结,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • Golang中的同步工具sync.WaitGroup详解

    Golang中的同步工具sync.WaitGroup详解

    这篇文章主要详细为大家介绍了Golang中的同步工具sync.WaitGroup,文中有详细的代码示例,具有很好的参考价值,希望对大家有所帮助,一起跟随小编过来看看吧
    2023-05-05
  • Go内置序列化库gob的使用

    Go内置序列化库gob的使用

    本文主要介绍了Go内置序列化库gob的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • Go语言中基本数据类型的相互转换详解

    Go语言中基本数据类型的相互转换详解

    Go在不同类型的变量之间赋值时需要显示转换,不能自动转换。这篇文章主要和大家介绍了Go语言中基本数据类型的相互转换,感兴趣的小伙伴可以了解一下
    2022-10-10

最新评论