目前,可用解决方案分为两种:
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路由表,没有配置得是没有办法访问的。