如何让局域网通过Ubuntu服务器使用Android USB共享网络?
嘿,我来一步步帮你搞定这个需求!咱们分阶段操作,每一步都很清晰,跟着做就行~
先把手机用USB线连到Ubuntu服务器上,在手机端开启USB共享网络(Android 8.1里一般在「设置-网络和互联网-热点和共享」里找)。
回到Ubuntu的命令行,用下面的命令检查是否识别到了USB网络接口:
ip link show
你应该能看到一个类似usb0的新接口(不同手机可能命名略有不同)。接着给这个接口获取IP地址:
dhclient usb0
用下面的命令确认是否成功拿到IP:
ip addr show usb0
如果输出里有类似inet 192.168.42.100/24这样的内容,说明连接没问题,记下来这个IP的网关(一般是同网段的第一个地址,比如192.168.42.1)。
要让Ubuntu当网关转发流量,必须先打开IP转发开关。临时生效可以用:
echo 1 > /proc/sys/net/ipv4/ip_forward
但重启后会失效,所以得永久配置:编辑/etc/sysctl.conf文件,找到net.ipv4.ip_forward=1这一行,把前面的注释符号#删掉,然后执行下面的命令让配置生效:
sysctl -p
首先看看当前的默认网关(也就是原来的路由器):
ip route show default
输出大概是default via 192.168.1.1 dev eth0这样的。现在要把默认路由改成手机USB接口的网关:
# 先删除原来的默认路由 ip route del default # 添加新的默认路由,替换成你刚才记的usb0网关IP ip route add default via 192.168.42.1 dev usb0
如果想让这个路由配置永久生效(重启后不丢失),可以创建一个systemd网络配置文件。比如新建/etc/systemd/network/usb0.network,内容如下:
[Match] Name=usb0 [Network] DHCP=yes Gateway=192.168.42.1 # 替换成你的usb0实际网关IP
然后重启systemd-networkd服务:
systemctl restart systemd-networkd
因为要让局域网设备把它当网关,Ubuntu的局域网接口(比如eth0)最好设成静态IP。同样用systemd配置,新建/etc/systemd/network/eth0.network:
[Match] Name=eth0 [Network] Address=192.168.1.10/24 # 设一个和原来路由器同网段的静态IP,比如192.168.1.10 DHCP=no
重启networkd服务让配置生效:
systemctl restart systemd-networkd
手机的网络是私网,Ubuntu需要把局域网的流量做地址伪装,才能让手机识别并转发出去。用iptables设置:
iptables -t nat -A POSTROUTING -o usb0 -j MASQUERADE
要让这个规则永久保存,先安装iptables-persistent:
apt-get update && apt-get install iptables-persistent
安装过程中会提示是否保存当前规则,选「Yes」就行。之后重启Ubuntu,规则也不会丢失。
现在有两种方式让局域网设备用Ubuntu当网关:
- 手动配置:给每台设备的网络设置里,把默认网关改成Ubuntu的静态IP(比如
192.168.1.10),DNS可以设成手机提供的或者公共DNS(比如8.8.8.8)。 - 自动分配(更方便):在Ubuntu上装DHCP服务器
dnsmasq,让它自动给局域网设备分配网关和IP。安装命令:
apt-get install dnsmasq
编辑/etc/dnsmasq.conf,添加或修改以下内容:
interface=eth0 # 指定监听局域网接口 dhcp-range=192.168.1.50,192.168.1.200,255.255.255.0,24h # DHCP分配的IP范围和租期 dhcp-option=3,192.168.1.10 # 指定网关为Ubuntu的静态IP dhcp-option=6,8.8.8.8,8.8.4.4 # 指定DNS服务器
重启dnsmasq服务:
systemctl restart dnsmasq
记得要关闭原来路由器的DHCP功能,避免冲突。
找一台局域网设备,执行traceroute 8.8.8.8(Windows用tracert 8.8.8.8),如果第一跳是Ubuntu的静态IP,后续跳转到手机的网络,就说明整个配置成功了!
内容的提问来源于stack exchange,提问作者Sandros

