Ubuntu20.04服务器开启路由转发让局域网内其他电脑通过该服务器连接外网
要让你的 Ubuntu作为路由器,通过 Wi-Fi 上网,并给连接到 UsbNetwork
的设备提供网络,需要做以下配置:
1. 网络拓扑
[互联网] ← (Wi-Fi, wlo1) → [Ubuntu] ← (USB网络/USB以太网, UsbNetwork) → [设备]
- Ubuntu:
- Wi-Fi(
wlo1
)已连接互联网(比如家庭路由器)。 - USB网络(
UsbNetwork
)连接设备(IP:192.168.2.x
)。
- Wi-Fi(
- 设备:
- 默认网关指向
192.168.2.2
(Ubuntu 的UsbNetwork
IP)。
- 默认网关指向
2. 在 Ubuntu 上配置路由和 NAT
(1) 启用 IP 转发
sudo sysctl -w net.ipv4.ip_forward=1
永久生效(编辑 /etc/sysctl.conf
):
echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
(2) 设置 NAT(让设备通过 Wi-Fi 上网)
sudo iptables -t nat -A POSTROUTING -o wlo1 -j MASQUERADE
sudo iptables -A FORWARD -i eno1 -o wlo1 -j ACCEPT
sudo iptables -A FORWARD -i wlo1 -o eno1 -m state --state RELATED,ESTABLISHED -j ACCEPT
保存 iptables 规则(防止重启失效):
sudo apt install iptables-persistent
sudo netfilter-persistent save
这三条关键的命令解释如下:
当然!这三条 iptables
命令是配置 NAT(网络地址转换) 和 流量转发 的核心规则,用于让连接到 eno1
(有线网络)的设备通过 wlo1
(Wi-Fi)访问互联网。以下是每条命令的详细解释:
1. sudo iptables -t nat -A POSTROUTING -o wlo1 -j MASQUERADE
作用
启用 源地址转换(SNAT),将来自 eno1
(内网)的流量通过 wlo1
(外网)转发时,自动修改数据包的 源IP地址,使其看起来是从 Ubuntu 的 wlo1
接口发出的。
关键点
-t nat
:操作 NAT 表(专门用于地址转换)。-A POSTROUTING
:在数据包 离开本机前(Post-Routing)修改源IP。-o wlo1
:仅对从wlo1
(Wi-Fi)发出的数据包生效。-j MASQUERADE
:动态将内网设备的私有IP(如192.168.2.x
)替换为wlo1
的当前IP(如192.168.0.x
)。
为什么需要?
- 内网设备(
eno1
下的192.168.2.x
)的IP是私有地址,无法在互联网上路由。 - 通过
MASQUERADE
,外网服务器会将响应包发回wlo1
的IP,再由 Ubuntu 转发给内网设备。
2. sudo iptables -A FORWARD -i eno1 -o wlo1 -j ACCEPT
作用
允许从 eno1
(内网)进入、从 wlo1
(外网)离开的流量 通过防火墙。
关键点
-A FORWARD
:操作FORWARD
链(控制转发的数据包)。-i eno1 -o wlo1
:匹配 进入eno1
且从wlo1
出去 的流量。-j ACCEPT
:允许这些流量通过。
为什么需要?
- 默认情况下,Linux 的防火墙会阻止转发流量。
- 此规则明确允许内网设备访问外网的请求通过。
3. sudo iptables -A FORWARD -i wlo1 -o eno1 -m state --state RELATED,ESTABLISHED -j ACCEPT
作用
允许从 wlo1
(外网)返回的、与已有连接相关的流量 通过防火墙,回到 eno1
(内网)。
关键点
-i wlo1 -o eno1
:匹配 进入wlo1
且从eno1
出去 的流量。-m state --state RELATED,ESTABLISHED
:仅允许 已建立的连接(如内网设备发起的请求的响应包)或 相关的新连接(如FTP的数据连接)。-j ACCEPT
:允许这些流量通过。
为什么需要?
- 确保外网服务器返回的响应包能回到内网设备。
- 阻止从外网主动发起的非法连接(仅允许“回包”),提升安全性。
三者的协作流程
- 内网设备(
192.168.2.100
)访问8.8.8.8
:- 数据包进入
eno1
→ 被FORWARD
规则放行 → 经过POSTROUTING
时源IP被改为wlo1
的IP → 从wlo1
发出。
- 数据包进入
- Google 服务器 返回响应包:
- 数据包进入
wlo1
→ 被状态检测规则识别为ESTABLISHED
→ 放行并转发到eno1
→ 到达内网设备。
- 数据包进入
验证规则是否生效
# 查看NAT规则
sudo iptables -t nat -L -v# 查看FORWARD规则
sudo iptables -L FORWARD -v
输出示例:
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)pkts bytes target prot opt in out source destination10 1200 MASQUERADE all -- any wlo1 192.168.2.0/24 anywhereChain FORWARD (policy DROP 0 packets, 0 bytes)pkts bytes target prot opt in out source destination15 1800 ACCEPT all -- eno1 wlo1 anywhere anywhere20 2400 ACCEPT### **(3) 配置 DHCP(可选,自动分配 IP)**
如果你的设备需要自动获取 IP,可以在 Ubuntu 上安装 `isc-dhcp-server`:
```bash
sudo apt install isc-dhcp-server
编辑 /etc/dhcp/dhcpd.conf
:
subnet 192.168.2.0 netmask 255.255.255.0 {range 192.168.2.100 192.168.2.200;option routers 192.168.2.2; # 网关指向 Ubuntuoption domain-name-servers 8.8.8.8, 8.8.4.4;
}
指定监听接口(编辑 /etc/default/isc-dhcp-server
):
INTERFACESv4="eno1"
启动 DHCP 服务:
sudo systemctl restart isc-dhcp-server
3. 设备端配置
(1) 自动获取 IP(推荐)
- 确保设备设置为 DHCP 自动获取 IP。
- 设备应该会得到
192.168.2.x
的 IP,网关是192.168.2.2
。
(2) 手动设置 IP(如果没有 DHCP)
- IP:
192.168.2.x
(如192.168.2.100
) - 子网掩码:
255.255.255.0
- 网关:
192.168.2.2
- DNS:
8.8.8.8
(或你的 ISP DNS)
4. 测试网络
(1) 在设备上测试
ping 192.168.2.2 # 测试到 Ubuntu 的连通性
ping 8.8.8.8 # 测试外网访问
- 如果
8.8.8.8
能通,但网页打不开,检查 DNS 设置(设备端手动设8.8.8.8
)。
(2) 在 Ubuntu 上检查 NAT
sudo iptables -t nat -L -v # 查看 NAT 规则是否生效
输出示例:
5. 常见问题
(1) 设备能 ping 通网关,但无法上网
- 检查 Ubuntu 的
wlan0
是否正常联网:ping 8.8.8.8 # 在 Ubuntu 上测试
- 检查 NAT 规则:
sudo iptables -t nat -L # 确保 POSTROUTING 有 MASQUERADE
(2) DHCP 不分配 IP
- 检查
isc-dhcp-server
是否运行:sudo systemctl status isc-dhcp-server
- 检查
UsbNetwork
是否已分配 IP:ip a show UsbNetwork
(3) 重启后失效
- 确保
iptables
规则已保存:sudo netfilter-persistent save
- 确保
net.ipv4.ip_forward=1
已写入/etc/sysctl.conf
。
6. 总结
步骤 | 命令/配置 | 作用 |
---|---|---|
1. 启用转发 | net.ipv4.ip_forward=1 | 让 Ubuntu 转发流量 |
2. 设置 NAT | iptables -t nat -A POSTROUTING ... | 让设备通过 Wi-Fi 上网 |
3. 配置 DHCP | isc-dhcp-server | 自动分配 IP |
4. 设备连接 | 手动或自动获取 IP | 确保网关指向 192.168.2.2 |
这样,你的设备就能通过 Ubuntu 的 Wi-Fi 上网了!🚀