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)。
  • 设备
    • 默认网关指向 192.168.2.2(Ubuntu 的 UsbNetwork IP)。


2. 在 Ubuntu 上配置路由和 NAT

(1) 启用 IP 转发

bash 复制代码
sudo sysctl -w net.ipv4.ip_forward=1

永久生效 (编辑 /etc/sysctl.conf):

bash 复制代码
echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

(2) 设置 NAT(让设备通过 Wi-Fi 上网)

bash 复制代码
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 规则(防止重启失效):

bash 复制代码
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:允许这些流量通过。
为什么需要?
  • 确保外网服务器返回的响应包能回到内网设备。
  • 阻止从外网主动发起的非法连接(仅允许"回包"),提升安全性。

三者的协作流程

  1. 内网设备192.168.2.100)访问 8.8.8.8
    • 数据包进入 eno1 → 被 FORWARD 规则放行 → 经过 POSTROUTING 时源IP被改为 wlo1 的IP → 从 wlo1 发出。
  2. Google 服务器 返回响应包:
    • 数据包进入 wlo1 → 被状态检测规则识别为 ESTABLISHED → 放行并转发到 eno1 → 到达内网设备。

验证规则是否生效

bash 复制代码
# 查看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               destination
   10  1200 MASQUERADE  all  --  any    wlo1    192.168.2.0/24      anywhere

Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
   15  1800 ACCEPT     all  --  eno1   wlo1    anywhere             anywhere
   20  2400 ACCEPT


### **(3) 配置 DHCP(可选,自动分配 IP)**
如果你的设备需要自动获取 IP,可以在 Ubuntu 上安装 `isc-dhcp-server`:
```bash
sudo apt install isc-dhcp-server

编辑 /etc/dhcp/dhcpd.conf

ini 复制代码
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;  # 网关指向 Ubuntu
  option domain-name-servers 8.8.8.8, 8.8.4.4;
}

指定监听接口(编辑 /etc/default/isc-dhcp-server):

ini 复制代码
INTERFACESv4="eno1"

启动 DHCP 服务:

bash 复制代码
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) 在设备上测试

bash 复制代码
ping 192.168.2.2      # 测试到 Ubuntu 的连通性
ping 8.8.8.8          # 测试外网访问
  • 如果 8.8.8.8 能通,但网页打不开,检查 DNS 设置(设备端手动设 8.8.8.8)。

(2) 在 Ubuntu 上检查 NAT

bash 复制代码
sudo iptables -t nat -L -v  # 查看 NAT 规则是否生效

输出示例:


5. 常见问题

(1) 设备能 ping 通网关,但无法上网

  • 检查 Ubuntu 的 wlan0 是否正常联网:

    bash 复制代码
    ping 8.8.8.8  # 在 Ubuntu 上测试
  • 检查 NAT 规则:

    bash 复制代码
    sudo iptables -t nat -L  # 确保 POSTROUTING 有 MASQUERADE

(2) DHCP 不分配 IP

  • 检查 isc-dhcp-server 是否运行:

    bash 复制代码
    sudo systemctl status isc-dhcp-server
  • 检查 UsbNetwork 是否已分配 IP:

    bash 复制代码
    ip a show UsbNetwork

(3) 重启后失效

  • 确保 iptables 规则已保存:

    bash 复制代码
    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 上网了!🚀

相关推荐
云飞云共享云桌面17 小时前
苏州昆山精密机械加工厂研发部门10个SolidWorks可以部署云飞云共享云桌面吗?
大数据·运维·服务器·自动化·汽车·制造
聚美智数17 小时前
图片水印-图片剪裁-图片缩放API接口介绍
java·服务器·数据库
小嵌同学18 小时前
Linux 内核中的 Per-CPU 机制详解
linux·运维·arm开发·嵌入式
云飞云共享云桌面18 小时前
自动化设备厂 10 人研发团队,如何共用一台服务器做 SolidWorks 建模?
运维·服务器·网络·3d·自动化·制造
筝筝ba18 小时前
Configure IP Address Via Different User Roles And Verify(1)
服务器
QH1392923188018 小时前
NVIDIA H200 H300服务器
运维·服务器·开发语言·网络·信息与通信
xixiaoyunya18 小时前
中小微企业轻量组网方案的技术选型与实践:从传统专线到软定义隧道的成本与效能分析
服务器·php·apache
Hello-FPGA18 小时前
嵌入式LINUX 设备 ip配置后怎么保存才能掉电不消失?
linux·运维·服务器
奥莱维19 小时前
KNX酒店方案_KNX专用线与高端酒店技术逻辑
java·服务器·前端·数据库
工业一体机老司机19 小时前
Linux工业一体机自启动服务配置:systemd服务单元编写与开机优化实战
java·linux·服务器