1. 程式人生 > >[原創] 樹莓派使用多個聯通4G上網絡卡

[原創] 樹莓派使用多個聯通4G上網絡卡

需求 在樹莓派上使用4G 上網絡卡上網.

以下內容都是在裝置沒有加入任何網路的情況下進行的.
如裝置已連入區域網或者可以訪問公網, 直接翻到文章最後.

下載樹莓派系統映象

購買4G 上網絡卡

製作啟動盤

因為我使用的是 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/
<html>hello world</html>

# 不指定網絡卡也可以自動分流.
$ curl --interface ip.haschek.at
114.242.248.67
$ curl --interface http://www.zhangzhipeng2023.cn/
<html>hello world</html>

# 可以看到阿里雲機器顯示出了一條請求.
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? 虛擬機器?

單網絡卡如何公網, 並且不影響區域網. 只需要配置路由表即可.

# 在沒有撥號之前檢視路由表
$ 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 地址又變回原先地址.

參考