[原创] 树莓派使用多个联通4G上网卡

需求 在树莓派上使用4G 上网卡上网.

以下内容都是在设备没有加入任何网络的情况下进行的.
如设备已连入局域网或者可以访问公网, 直接翻到文章最后.

下载树莓派系统镜像

我下载的是 ubuntu-mate-16.04.2-desktop-armhf-raspberry-pi.img.xz
Torrent: magnet:?xt=urn:btih:D0F23C109D8662A3FE9338F75839AF8D57E5D4A9
HTTP: https://ubuntu-mate.org/raspberry-pi/ubuntu-mate-16.04.2-desktop-armhf-raspberry-pi.img.xz
官方页面: https://ubuntu-mate.org/download/

购买4G 上网卡

我买的是联通 4G 的上网卡: 联通4G无线上网卡托, 淘宝地址: https://detail.tmall.com/item.htm?id=538368357894&skuId=3215576226356
最好再买一个外接电源的 USB HUB, 绿联30225 4USB 2.0, 京东地址: https://item.jd.com/1804885.html

制作启动盘

因为我使用的是 MacBook, 所以直接使用 dd 命令操作

# 插入设备之前, 最好是看现有设备
$ df -h
# ...
/dev/disk1s1   14Ti  29.1Gi   32G     1%  0000 000    0%   /Volumes/USB_32GB
# 确认设备是挂载到 /dev/disk1 之后
# 取消挂载设备
sudo diskutil unmountDisk /dev/disk1
# 解决写权限问题
sudo diskutil partitionDisk /dev/disk1 1 MBR "Free Space" "%noformat%" 100%
sudo dd bs=1m if=/Users/zhipeng/Downloads/ubuntu-mate-16.04.2-desktop-armhf-raspberry-pi.img.xz/ubuntu-mate-16.04.2-desktop-armhf-raspberry-pi.img  of=/dev/disk1 conv=sync
# 弹出设备
sudo diskutil eject /dev/disk1

配置 wvdial

# 更新系统
$ apt autoclean
$ apt autoremove
$ apt update -y
$ apt upgrade -y
# 安装 wvdial
$ apt install wvdial
# 先不要插入上网卡
$ lsusb
Bus 001 Device 006 ID 05c6:f000 Qualcomm, Inc. 
# 这种情况再稍微等一下
$ lsusb
Bus 001 Device 006 ID 05c6:6000 Qualcomm, Inc. Siemens SG75
...
$ ls /dev/ttyUSB*
/dev/ttyUSB0 /dev/ttyUSB1 /dev/ttyUSB2 /dev/ttyUSB3
# 可以看到设备直接识别出来的. 最好是在 /dev/usb_modeswtich.d/ 新建一个 vender:product 的文件
# cat /dev/usb_modeswitch.d/05c6:6000
$ echo TargetVendor = 0x05c6 > /dev/usb_modeswitch.d/05c6:6000
$ echo TargetProduct = 0x6000 >> /dev/usb_modeswitch.d/05c6:6000
$ echo MessageContent = "5553424312345678000000000000061b000000020000000000000000000000" >> /dev/usb_modeswitch.d/05c6:6000
$ echo NeadResponse = 1 >> /dev/usb_modeswitch.d/05c6:6000

# 配置 /etc/wvdial.conf
# 可以新加一组配置, [Dialer SG75-01]
[Dialer SG75-01]
Init1 = ATZ
Init2 = ATQ V1 E1 S0=0 &C1 &D2 +FCLASS=0
Init3 = ATE0V1
Init4 = ATS0=0
Init5 = AT+CGDCONT=1, "IP", "3GNET"
# 这里 APN 邓勇 Init5中的 3GNET, 所以可以不填
# APN = 3GNET
Init6 = AT+CFUN=1
Modem Type = Analog Modem
# 波特率常见是 9600, 115200, 460800
Baud = 115200
New PPPD = yes
# Modem 一般为一组 ttyUSB* 中的第一个
Modem = /dev/ttyUSB0
ISDN = 0
Phone = *99#
# 用户名, 密码可以不填
Username = username
Password = password
Stupid Mode = 1

# 保存退出
# 开始拨号
$ wvdial SG75-01
如果成功, 会输出 local IP Address: ... remote IP address: ... primary DNS address: ..
$ ifconfig
ppp0 Link encap:Point0toPoint Protocol
    inet addr: 10.17.3.144 P-t-P:10.64.64.64 Mask: 255.255.255.255
    UP POINTTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
    ...
# 测试一下网上
$ pip install speedtest-cli
$ speedtest-cli
# 最后测试, 下行速度可以达到1.8MB/s, 上行也可以达到1.5MB/s

单网卡拨号已经成功, 接下来就是多网卡拨号了.

配置多网卡

配置 /etc/wvdial.conf
和配置单网卡一样, 新增一个配置组 [Dialer SG75-02]
# Modem 一般都是每组中的第一个. 其他选项不用改
Modem = /dev/ttyUSB4

# 等设备绿灯亮以后(红灯灭了), 尝试拨号
$ wvidal SG75-02
# ...
# 不出意外, 第二个上网卡也拨号成功.
$ ifconfig
ppp1 Link encap:Point0toPoint Protocol
    inet addr: 10.77.31.69 P-t-P:10.64.64.65 Mask: 255.255.255.255
    UP POINTTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
    ...

使用不同的网卡访问网络

# curl --interface 可以指定网卡访问网络
$ curl --interface ppp0 ip.haschek.at
114.242.248.67
$ curl --interface ppp1 ip.haschek.at
# 结果是 指定 ppp0 可以访问公网. 但指定 ppp1 确没有任何反映.

# 查看一下本地路由表
$ route -n
Destination Gateway Genmask Flags Mertic Ref Use Iface
0.0.0.0  0.0.0.0  0.0.0.0 U 0 0 0 ppp0
10.64.64.64 0.0.0.0 255.255.255.255 UH 0 0 0 ppp0
10.64.64.65 0.0.0.0 255.255.255.255 UH 0 0 0 ppp1

# 可以发现 ppp0 多一条路由配置. 目标网络0.0.0.0的流量都会通过 ppp0 发送, ppp1是个摆设.
# 这就很类似 VPN 之类的拨号软件. Destination 是目标网络, 发往Destination的流量会从对应的网卡发送接受.
# 添加一条网络路由
# 因为我有一台服务器, 可以用来测试是否有请求, IP A 段是112的阿里云ECS.
$ route add -net 112.0.0.0/24 ppp1
$ route -n
# 可以看到多了一条记录
Destination Gateway Genmask Flags Mertic Ref Use Iface
0.0.0.0  0.0.0.0  0.0.0.0 U 0 0 0 ppp0
10.64.64.64 0.0.0.0 255.255.255.255 UH 0 0 0 ppp0
10.64.64.65 0.0.0.0 255.255.255.255 UH 0 0 0 ppp1
112.0.0.0 0.0.0.0 255.255.255.0 U 0 0 0 ppp1

# 在阿里云服务器上监控 nginx 请求日志.
$ tail -f /var/log/nginx/access.log
# 回到树莓派. 测试发送请求
$ curl --interface ppp0 ip.haschek.at
114.242.248.67
$ curl --interface ppp1 http://www.zhangzhipeng2023.cn/
hello world

# 不指定网卡也可以自动分流.
$ curl --interface ip.haschek.at
114.242.248.67
$ curl --interface http://www.zhangzhipeng2023.cn/
hello world

# 可以看到阿里云机器显示出了一条请求.
114.241.28.36 - - [2017-12-06T13:13:11+08:00] "GET / HTTP/1.1" 200 8699 "-" "curl/7.47.0" "-"
# 接下来就是根据网卡数据, 动态的分配 A 段
$ route add -net 100.0.0.0/24 ppp1
$ route add -net 101.0.0.0/24 ppp1
$ route add -net 102.0.0.0/24 ppp1
$ route add -net 103.0.0.0/24 ppp1
# ...

问题是, 只能做到根据 IP段 分流到不通的网卡. 如何实现可以随机网卡发送请求, 或者指定网卡发情请求, 不需要根据 IP 段分流, 实现爬虫需求.
例如: curl –interface ppp0 ip.haschek.at && curl –interface ppp1 ip.haschek.at 返回不通的 公网IP
Docker? 虚拟机?

是的, 使用 Docker 可以解决这个问题, 详见后续文章 http://blog.csdn.net/u012731379/article/details/78744757

单网卡如何公网, 并且不影响局域网. 只需要配置路由表即可.

# 在没有拨号之前查看路由表
$ route -n
0.0.0.0 172.16.30.1 0.0.0.0 UG 600 wlan0
192.254.0.0 0.0.0.0 255.255.255.0 U 600 wlan0

# 拨号之后再查看路由表
$ route -n
0.0.0.0 172.16.30.1 0.0.0.0 UG 600 wlan0
10.63.63.63 0.0.0.0 255.255.255.255 UH 0 ppp0
192.254.0.0 0.0.0.0 255.255.255.0 U 600 wlan0
# 可以看到多了一条记录 ppp0
# 这时如果访问公网查看 ip, 可以查看结果是 wlan0网卡的公网 ip, 因为路由表也是配置的 默认路由/未知目标 从 wlan0 访问.
$ curl ip.haschek.at
62.100.223.114
# 如果想使用网卡上网, 解决办法如下
$ route del -net 0.0.0.0 wlan0
$ route add -net 0.0.0.0 ppp0
# 什么意思呢, 修改默认路由, 使用 ppp0 访问未知目标.
# 测试本地局域网是否正常
# ping 192.168.44.49
# 日志就不写了, 结果是可以访问的. 并且 ssh 完全没问题.

华为的E353 上网卡不建议使用. 封装的太好了, 完全傻瓜式. 并且多个上网卡的 mac 地址一模一样, 插到设备上以后会自动识别为网卡, 多个上网卡的生成网卡名称也一样. 可以修改网卡名, 再修改 mac 地址, 但是ifconfig enxxxx up 之后, mac 地址又变回原先地址.

参考

Run Ubuntu MATE on your Raspberry Pi 2 or 3 today - https://ubuntu-mate.org/raspberry-pi/
Raspberry Pi 用 3G 網卡(3G USB dongle)上網 - https://www.raspberrypi.com.tw/771/how-to-setup-a-usb-3g-modem-on-raspberry-pi/

你可能感兴趣的:(linux,MacBoox-OSX,树莓派)