Ubuntu设置双网卡, 让开发板可以通过PC的网卡上网

一、前言

  在进行ARM Linux开发的时候经常会遇到这样的问题,在虚拟机上安装一个Ubuntu,开发时将Ubuntu和开发板都设置为静态IP,将二者用网线连接,可以用NFS挂载。但有时Ubuntu需要连接互联网,这时就要将Ubuntu的IP设置为动态IP,并将Ubuntu的网络连接模式设置为NAT模式,使用完之后又设置为桥接模式和静态IP,这样改来改去比较麻烦,而且有时希望开发板也能连接到互联网中去,这样就需要一种比较完美的解决办法。

二、修改虚拟机配置

  在虚拟机的菜单栏中点击“编辑”->“虚拟网络编辑器”,如下图:

  Ubuntu设置双网卡, 让开发板可以通过PC的网卡上网

   点击“还原默认设置”,如下图:

  Ubuntu设置双网卡, 让开发板可以通过PC的网卡上网

  之后重启虚拟机。

  在虚拟机的菜单栏中点击“虚拟机”->“设置”,如下图:

  Ubuntu设置双网卡, 让开发板可以通过PC的网卡上网

  在弹出的界面中点击“添加”,如下图:

  Ubuntu设置双网卡, 让开发板可以通过PC的网卡上网

   点击“网络适配器”,然后点击“下一步”,如下图:

  Ubuntu设置双网卡, 让开发板可以通过PC的网卡上网

 

   选择“NAT 模式”,然后点击“完成”,如下图:

  Ubuntu设置双网卡, 让开发板可以通过PC的网卡上网

 

   这时虚拟机的硬件设备里就有两个网络适配器了,需要保证第一个网络适配器为桥接模式,第二个网络适配器为NAT模式,如下图:

  Ubuntu设置双网卡, 让开发板可以通过PC的网卡上网Ubuntu设置双网卡, 让开发板可以通过PC的网卡上网

   点击“确定”之后等待下图所示进度条走完:

  Ubuntu设置双网卡, 让开发板可以通过PC的网卡上网

 三、修改Ubuntu配置

   3.1 修改配置文件

    在终端执行命令:sudo vim /etc/network/interfaces

     将文件修改为:

 1 sudo vim /etc/network/interfaces
 2 auto lo
 3 iface lo inet loopback
 4 
 5 auto eth0
 6 iface eth0 inet static
 7 address 192.168.1.3
 8 netmask 255.255.255.0
 9 gateway 192.168.1.1
10 
11 auto eth1
12 iface eth1 inet dhcp

    然后保存退出,这个文件指定了网卡eth0的IP为静态IP,IP地址为192.168.1.3,子网掩码为255.255.255.0,网关为192.168.1.1。网卡eth1的IP为动态获取。注意这里输入的静态IP地址与“虚拟网络编辑器”里NAT模式的网卡的IP不能在同一个网段。

    设置完成之后重启虚拟机。

    之后在终端中使用ifconfig命令就可以发现,已经有三张网卡了,如下图:

    Ubuntu设置双网卡, 让开发板可以通过PC的网卡上网

      其中eth0是静态网卡,IP地址与/etc/network/interfaces文件中写入的address一致,eth1是动态网卡, 其IP地址是通过DHCP动态获取的,lo是回环网卡。

  3.2 使用iptables设置转发规则

    在Ubuntu中执行下面两条命令:

sudo modprobe ip_tables
sudo modprobe ip_nat_ftp

  3.3 修改网卡地址转发的配置文件

  修改/etc/sysctl.conf文件(需要用sudo),默认情况下这个文件里所有的内容都是用#注释掉的,将有net.ipv4.ip_forward = 1的这行(大概在第28行)最前面的“#”去掉,然后保存退出。

  执行下面4条命令:

sudo sysctl -p
sudo iptables -P INPUT ACCEPT
sudo iptables -P OUTPUT ACCEPT
sudo iptables -P FORWARD ACCEPT

  3.4 设置网络

  使用ifconfig命令查看eth0和eth1的IP地址,如下图:

Ubuntu设置双网卡, 让开发板可以通过PC的网卡上网

   记住这两个IP,然后执行命令:

sudo iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT  --to 192.168.237.129

  上面这条命令包含两个IP地址,第一个IP地址由eth0的IP地址决定,但是把最后一位设置为0,第二个IP地址与eth1的IP地址相同

  3.5 添加默认路由

  执行命令:sudo route可以查看路由表

  执行下面2条命令:

sudo route del default
sudo route add default gw 192.168.237.2

  上述命令中的“192.168.237.2”的前三个数与eth1的IP地址相同。执行sudo route命令查看路由表,如下图:

  Ubuntu设置双网卡, 让开发板可以通过PC的网卡上网

   此时执行ping www.baidu.com是可以成功的,如果成功不了就试一下ping百度的IP:ping 104.193.88.123

  如果ping域名通不了,但是ping IP能通,则是DNS设置的有问题,如果IP都ping不通,那再检查之前的步骤有没有做错。

四、修改开发板配置

  4.1 修改配置文件

  执行命令:vi /etc/eth0-setting

  写入如下内容:

IP=192.168.1.230
Mask=255.255.255.0
Gateway=192.168.1.3
DNS=114.114.114.114
MAC=08:90:90:90:90:90

  其中,IP为开发板的IP地址,Gateway为Ubuntu网卡eth0的IP地址。

  执行命令:vi /etc/resolv.conf

  写入如下内容:

nameserver 114.114.114.114

  4.2 重设路由表

  执行如下命令,重新设置路由表:

route del default
route add default gw 192.168.1.3

五、联网测试

  在开发板端执行命令:

ping www.baidu.com

  能够ping通,说明开发板已经可以连接互联网了,如下图:

Ubuntu设置双网卡, 让开发板可以通过PC的网卡上网

 

 

 六、问题分析与注意事项

  1)每次开发板重启都需要重新设置路由表,即执行4.2节中的命令。否则开发板能ping通网关,即192.168.1.3,但无法ping通外网。

  2)每次Ubuntu重启都需要重新执行3.2~3.5节中的命令,为了方便,可以将这些命令写成一个脚本,如下:

#!/bin/bash
sudo modprobe ip_tables
sudo modprobe ip_nat_ftp
sudo sysctl -p
sudo iptables -P INPUT ACCEPT
sudo iptables -P OUTPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT  --to 192.168.237.129
sudo route del default
sudo route add default gw 192.168.237.2

  将其命名为net.sh,并执行命令:chmod +x net.sh为其添加可执行权限,每次Ubuntu重启时运行这个文件(用超级用户权限)。

  测试过几次,手动输入命令的话可以成功,但是用脚本执行命令的话就不成功,暂时不知道原因,但是理论上来说脚本也是可以的,暂时先放在这里。

Ubuntu设置双网卡, 让开发板可以通过PC的网卡上网

上一篇:linux命令


下一篇:【Linux 命令】mkdir