Linux 平台上面单网卡 + TUN/TAP实现局域网其它设备上网

50 篇文章 2 订阅
16 篇文章 2 订阅

目前,可用解决方案分为两种:

1、为由我们提供得 VGW 软件路由器网关

2、为由内核提供得 iptables SNAT 软件路由器网关

两者谁得网络带宽吞吐量更大?即第二类工作在内核的 iptables SNAT,但谁最简单易用?VGW 软件路由器网关。

VGW + pf_ring Linux 平台上面单个 --ncpu 可以提供保底 200Mbps 带宽吞吐量,5个 --ncpu 可以提供三四百兆带宽,基本可以跑满大多数企业/个人用户得本地网络带宽。

本文主要阐述,如何轻松使用于 Linux 平台上面使用单个物理网卡 + TUN/TAP来实现局域网其它设备上网得问题。

建议跟我们搭建得系统环境相同,即 Ubuntu16.04 x86_64 + 4C/4G。

假设我们得局域网段为:

IP: 192.168.0.0

MASK: 255.255.255.0

GW: 192.168.0.1

Linux 软路由器得IP地址配置:192.168.0.21

TUN/TAP IP地址配置:10.0.0.2

而我们希望该IP段上面,192.168.0.221 得局域网IP地址通过我们搭建得 Linux 软路由器来上网,那么只需执行以下命令即可:

1、sudo su

2、iptables -F

3、iptables -t nat -F

4、iptables -t nat -I POSTROUTING -s 192.168.0.221 -j SNAT --to-source 10.0.0.2

但这会产生一个新的问题,即10.0.0.2,TUN/TAP网卡设定得内核IP路由表决定了,192.168.0.221 通过 10.0.0.2 去访问网络得时候,那些可以走 TUN/TAP,那些不能走,而如果设置为 “10.0.0.2” TUN/TAP 为默认网关接口,又会带来一个全新的问题,如何绕过特殊得 “IP地址段”,不然它们经过 “TUN/TAP” 到其虚拟路由程序传送到某个特殊端点上?

哈哈,这是个好问题,但并非不可以解决,只要该虚拟路由程序能够确保一个核心关键点,即在该程序内操作不通得物理网卡路由来控制,IP数据得出入站即可。

但这需要确保物理网卡得IP路由尽量为默认网关,否则物理网卡IP绑定的IP路由表,没有配置得是没有办法访问的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux 中,可以使用 golang 来创建、启动、关闭和删除 tun 虚拟网卡。下面是一个简的代码示例: ```golang package main import ( "log" "os/exec" ) const ( // tun 设备名称 tunName = "mytun" // tun 设备 IP 地址 tunIP = "10.0.0.1/24" ) func createTun() { // 创建 tun 设备 cmd := exec.Command("ip", "tuntap", "add", tunName, "mode", "tun") if err := cmd.Run(); err != nil { log.Fatalf("Failed to create tun device: %v", err) } } func startTun() { // 设置 tun 设备 IP 地址并启动 cmd := exec.Command("ip", "addr", "add", tunIP, "dev", tunName) if err := cmd.Run(); err != nil { log.Fatalf("Failed to set tun device IP address: %v", err) } cmd = exec.Command("ip", "link", "set", tunName, "up") if err := cmd.Run(); err != nil { log.Fatalf("Failed to start tun device: %v", err) } } func stopTun() { // 停止 tun 设备 cmd := exec.Command("ip", "link", "set", tunName, "down") if err := cmd.Run(); err != nil { log.Fatalf("Failed to stop tun device: %v", err) } } func deleteTun() { // 删除 tun 设备 cmd := exec.Command("ip", "tuntap", "del", tunName, "mode", "tun") if err := cmd.Run(); err != nil { log.Fatalf("Failed to delete tun device: %v", err) } } func main() { createTun() startTun() // do something with the tun device stopTun() deleteTun() } ``` 在上面的示例中,我们首先定义了 tun 设备名称和 IP 地址。然后,我们实现了四个函数:`createTun()`、`startTun()`、`stopTun()` 和 `deleteTun()`。这些函数分别用于创建、启动、停止和删除 tun 设备。 在 `createTun()` 函数中,我们使用 `ip tuntap add` 命令来创建 tun 设备。在 `startTun()` 函数中,我们使用 `ip addr add` 命令来设置 tun 设备IP 地址,并使用 `ip link set` 命令启动 tun 设备。在 `stopTun()` 函数中,我们使用 `ip link set` 命令停止 tun 设备。在 `deleteTun()` 函数中,我们使用 `ip tuntap del` 命令删除 tun 设备。 最后,在 `main()` 函数中,我们按照创建、启动、停止、删除的顺序调用这些函数,以完成对 tun 设备的操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值