Ubuntu 双网卡配置:从GUI到命令行的共享上网实战
1. 为什么需要双网卡共享上网想象一下你的Ubuntu电脑同时连接了两个网络一个是通过有线网卡ETH0接入的互联网另一个是通过无线网卡ETH1连接的内部局域网。这时候局域网内的其他设备比如打印机、NAS或者同事的电脑可能也需要访问互联网但又不方便直接连接外网。这就是典型的双网卡共享上网场景。我在实际工作中遇到过很多类似需求实验室设备需要统一联网但只有一个外网接口、办公室临时网络扩展、甚至是家庭网络改造。Ubuntu系统自带的网络共享功能可以完美解决这个问题而且配置起来比大多数人想象的要简单得多。传统方法可能会考虑使用路由器或者交换机来做网络转发但这既增加了硬件成本又带来了额外的维护工作。其实Ubuntu系统本身就是一个强大的路由器只需要正确配置两块网卡的关系即可。这里最关键的是理解网络地址转换(NAT)的概念——简单说就是让内网设备借用外网网卡的IP地址上网就像公司前台帮你转接外部电话一样。2. 图形界面配置新手友好方案对于刚接触Linux网络配置的用户我强烈推荐先从图形界面开始。Ubuntu自带的网络管理工具nm-connection-editor虽然在新版本中隐藏得比较深但用起来确实直观。2.1 准备工作首先确认你的网络接口情况。打开终端输入ip a你会看到类似这样的输出1: lo: LOOPBACK,UP,LOWER_UP mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 2: eth0: BROADCAST,MULTICAST,UP,LOWER_UP mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 00:16:3e:12:34:56 brd ff:ff:ff:ff:ff:ff inet 192.168.1.100/24 brd 192.168.1.255 scope global dynamic eth0 valid_lft 86300sec preferred_lft 86300sec 3: eth1: BROADCAST,MULTICAST,UP,LOWER_UP mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 00:16:3e:12:34:57 brd ff:ff:ff:ff:ff:ff inet 192.168.52.1/24 brd 192.168.52.255 scope global eth1 valid_lft forever preferred_lft forever这里eth0是我的外网接口(通过DHCP获取IP)eth1是内网接口(我手动设置了192.168.52.1)。2.2 详细配置步骤打开网络配置工具nm-connection-editor这个命令在Ubuntu 18.04之后是必须的因为GUI入口被移除了。找到你的内网网卡(本例是eth1)点击齿轮图标进入编辑界面。在IPv4设置选项卡中将方法从手动改为与其他计算机共享。地址栏可以留空(系统会自动使用10.42.0.1)也可以手动指定如192.168.52.1。我建议手动指定这样后续管理更方便。保存退出后不需要重启配置会立即生效。实测下来这个方法最省心系统会自动帮你设置好iptables规则和路由表。你可以立即在内网其他设备上测试将网关指向这个Ubuntu机器的内网IP(如192.168.52.1)就能上网了。3. 命令行配置深入理解原理图形界面虽然方便但遇到特殊需求时就力不从心了。比如需要定制防火墙规则、修改NAT行为或者调试网络问题时命令行才是终极武器。3.1 启用IP转发首先需要告诉系统允许数据包在不同网卡间转发sudo sysctl -w net.ipv4.ip_forward1想让这个设置永久生效需要编辑/etc/sysctl.conf文件找到并取消注释这行net.ipv4.ip_forward13.2 配置iptables规则这是最核心的部分我们需要设置NAT规则sudo iptables -t nat -A POSTROUTING -s 192.168.52.0/24 -o eth0 -j MASQUERADE sudo iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT sudo iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT解释下这几个命令第一条是NAT核心规则将来自192.168.52.0/24网段的流量通过eth0伪装出去第二条允许从内网到外网的转发第三条允许已建立的连接返回流量3.3 保存iptables规则默认情况下iptables规则重启会丢失我们需要持久化保存sudo apt install iptables-persistent sudo netfilter-persistent save这样下次重启后规则会自动加载。4. 两种方法对比与疑难解答在实际项目中我两种方法都用过多次总结了一些经验对比项图形界面方法命令行方法上手难度非常简单需要网络知识灵活性有限完全可控适用场景简单共享需求复杂网络环境可调试性较差非常好版本兼容性18.04有变化所有版本通用常见问题及解决方案内网设备能ping通网关但无法上网检查Ubuntu主机的iptables规则是否正确特别是FORWARD链是否被其他规则拦截。可以用sudo iptables -L -n -v查看数据包计数帮助定位问题。DNS解析失败在内网设备的网络设置中除了网关还要正确设置DNS。可以尝试使用8.8.8.8等公共DNS。重启后共享失效如果是图形界面方法检查NetworkManager服务是否正常运行命令行方法则要确认是否保存了iptables规则和启用了ip_forward。性能问题在大流量场景下可以尝试优化iptables规则比如限制连接数或带宽。5. 进阶技巧与扩展应用掌握了基础配置后我们可以玩些更高级的5.1 流量监控与统计想知道内网设备用了多少流量试试这些命令# 查看NAT转换统计 sudo iptables -t nat -L -n -v # 按IP统计流量 sudo iptables -N TRAFFIC_ACCT sudo iptables -I FORWARD -j TRAFFIC_ACCT sudo iptables -A TRAFFIC_ACCT -s 192.168.52.10 -j RETURN5.2 端口映射如果需要将外网的某个端口映射到内网服务器sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8080 -j DNAT --to 192.168.52.100:805.3 结合DHCP服务如果不想手动配置内网设备的IP可以在Ubuntu上安装dhcpd服务sudo apt install isc-dhcp-server然后配置/etc/dhcp/dhcpd.conf自动分配IP和网关信息。我在家庭网络中就用这个方案把旧笔记本改造成路由器防火墙广告过滤器运行了三年多非常稳定。特别是疫情期间家里多人同时上网课通过iptables的流量控制功能确保了每个设备都能公平使用带宽。