GO 获取指定网卡流量

func TotalFlowByDevice(dev string) uint64 {
	devinfo, err := ioutil.ReadFile("/proc/net/dev")
	if err != nil {
		return 0
	}

	var receive int = -1
	var transmit int = -1

	var receive_bytes uint64
	var transmit_bytes uint64

	lines := strings.Split(string(devinfo), "\n")
	for _, line := range lines {
		//fmt.Println("line :", line)
		if strings.Contains(line, dev) {
			i := 0
			fields := strings.Split(line, ":")
			for _, field := range fields {
				if strings.Contains(field, dev) {
					i = 1
				} else {
					values := strings.Fields(field)
					for _, value := range values {
						//fmt.Println("value :", value)
						if receive == i {
							bytes, _ := strconv.ParseInt(value, 10, 64)
							receive_bytes = uint64(bytes)
						} else if transmit == i {
							bytes, _ := strconv.ParseInt(value, 10, 64)
							transmit_bytes = uint64(bytes)
						}
						i++
					}
				}
			}
		} else if strings.Contains(line, "face") {
			index := 0
			tag := false
			fields := strings.Split(line, "|")
			for _, field := range fields {
				if strings.Contains(field, "face") {
					index = 1
				} else if strings.Contains(field, "bytes") {
					values := strings.Fields(field)
					for _, value := range values {
						//fmt.Println("value :", value)
						if strings.Contains(value, "bytes") {
							if !tag {
								tag = true
								receive = index
							} else {
								transmit = index
							}
						}
						index++
					}
				}
			}
		}
	}
	//fmt.Println("receive :", receive)
	//fmt.Println("transmit :", transmit)
	//fmt.Println("receive_bytes :", receive_bytes)
	//fmt.Println("transmit_bytes :", transmit_bytes)

	return receive_bytes + transmit_bytes
}

 

<think>我们正在解决frpc在双网卡环境下指定使用其中一个网卡的问题。用户的环境是双网卡,一个连接内网(办公网),一个连接外网。我们希望frpc在连接frps服务器时,使用指定网卡(比如外网网卡)来建立连接。根据frp官方文档,frpc可以通过配置`bind_addr`参数来指定本地出口IP地址(即绑定到特定的本地网卡)。另外,也可以通过系统路由表配置来实现,但这里用户希望直接在frpc配置中指定。步骤:1.确定要使用的网卡的IP地址。例如,外网网卡的IP地址为192.168.1.100(假设)。2.在frpc.ini配置文件的[common]部分,添加`bind_addr`参数,值为该网卡的IP地址。示例配置:```ini[common]server_addr=frps.example.com#frps服务器地址server_port=7000#frps服务器端口bind_addr=192.168.1.100#指定使用该IP地址所在的网卡[web]type=tcplocal_ip=127.0.0.1local_port=80remote_port=6000```这样,frpc在连接frps时就会使用192.168.1.100这个IP地址作为源IP,从而使用对应的网卡。另外,如果用户希望不指定IP地址,而是指定网卡设备名(如eth0),frp本身不支持直接指定设备名,但我们可以通过系统路由表来实现(但用户要求的是在frpc中配置)。因此,我们推荐使用`bind_addr`参数指定IP。如果用户不知道网卡的IP地址,可以通过以下命令查看:-Windows:`ipconfig`-Linux:`ifconfig`或`ipaddr`注意:如果指定的IP地址发生变化(比如DHCP分配),则需要动态更新配置。建议在双网卡环境中为需要固定使用的网卡设置静态IP。另外,用户也可以考虑在系统路由表中添加策略路由,使目标为frps服务器的流量指定网卡(如引用[1]所述),但这种方法需要配置系统路由,且与操作系统相关。因此,对于frpc配置,最简单直接的方法就是设置`bind_addr`。引用说明:在用户提供的引用中,引用[1]提到了双网卡配置路由的方法,引用[2]提到了双网卡环境的存在,引用[3]和[4]提到了frp用于内网穿透。我们主要参考了frp的配置方法。相关问题:1.如何查看Windows/Linux系统的网卡IP地址?2.frpc的bind_addr参数是否支持域名?3.双网卡环境下如何配置系统路由表?4.如何为网卡设置静态IP地址?5.frpc还支持哪些网络相关的配置参数?注意:在配置完成后,建议使用`frpc`的日志功能(如`--log_level=debug`)来确认连接使用的本地IP是否正确。</think>### frpc双网卡环境指定网卡配置指南 在双网卡环境中指定frpc使用特定网卡的核心方法是**通过`bind_addr`参数绑定出口IP地址**,以下是详细配置步骤: --- #### 解决方案 1. **确定目标网卡的IP地址** ```bash # Windows: ipconfig # Linux: ip addr ``` 记录需要使用的网卡IP(如外网网卡IP:`192.168.1.100`) 2. **修改frpc.ini配置文件** ```ini [common] server_addr = frps.yourdomain.com server_port = 7000 bind_addr = 192.168.1.100 # 关键:指定出口网卡IP ``` 3. **验证配置生效** 启动frpc时添加日志参数: ```bash ./frpc -c frpc.ini --log_level=debug ``` 在日志中确认输出: ```log [I] [service.go:299] [b1e5f3a2] client bind address [192.168.1.100] ``` --- #### 高级场景配置 **场景1:不同服务使用不同网卡** ```ini # 外网服务走外网卡 [web] type = tcp local_port = 80 remote_port = 6000 bind_addr = 192.168.1.100 # 外网卡IP # 内网服务走内网卡 [internal] type = tcp local_port = 8080 remote_port = 6001 bind_addr = 10.0.0.10 # 内网卡IP ``` **场景2:系统级路由策略(Windows)** ```cmd # 强制所有frp流量指定网关 route add frps.yourdomain.com mask 255.255.255.255 192.168.1.1 ``` **场景3:Linux策略路由** ```bash # 创建专用路由表 echo "200 frp_route" >> /etc/iproute2/rt_tables # 添加路由规则 ip rule add from 192.168.1.100 table frp_route ip route add default via 192.168.1.1 dev eth0 table frp_route ``` --- #### 注意事项 1. **IP地址稳定性** 若使用DHCP获取IP,建议设置静态IP防止地址变化导致连接失败 2. **防火墙配置** 确保系统防火墙允许frpc通过指定网卡访问网络: ```powershell # Windows示例 New-NetFirewallRule -DisplayName "Allow FRP" -Direction Outbound -LocalPort Any -Protocol TCP -Action Allow -InterfaceAlias "Ethernet1" ``` 3. **网络优先级** 当`bind_addr`未生效时,需调整系统网卡优先级: ```cmd # Windows调整网卡跃点数 netsh interface ipv4 set interface "以太网" metric=10 ``` --- #### 验证方法 1. **抓包确认** ```bash tcpdump -i eth0 host frps.yourdomain.com -nnv ``` 2. **路由跟踪** ```bash traceroute -s 192.168.1.100 frps.yourdomain.com ``` 3. **连接测试** ```bash telnet -b 192.168.1.100 frps.yourdomain.com 7000 ``` > **重要提示**:修改配置后需**重启frpc服务**使配置生效。对于需要高可靠性的场景,建议配合系统路由策略使用[^1]。 --- ### 相关问题 1. 如何为Windows网卡配置永久静态路由? 2. Linux策略路由与默认路由的优先级规则是什么? 3. frpc的`bind_addr`参数支持域名解析吗? 4. 双网卡环境下如何避免IP地址冲突? 5. 如何验证frpc实际使用的出口网卡? [^1]: 引用来源:Windows网络路由配置实践 [^2]: 引用来源:Linux高级路由指南
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值