一、前言

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

二、修改虚拟机配置

  首先,vmware一定要用管理员方式打开。

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

  

   在弹出的界面中,会有3张网卡,其中VMnet0一定是桥接模式,并且将其桥接到windows的物理网卡,如下图:

  

    其中物理网卡的名字在控制面板的网络连接里可以看到,如下图:

  

    如果没有出现VMnet0,首先检查是否用管理员方式打开,如果确认了是用管理员方式打开的,但依然没有出现VMnet0,则点击“还原默认设置”,若还是没出现VMnet0,那么点击“添加网络”,将VMnet0手动添加进去,在弹出的界面中要选择某个文件,否则即便添加了VMnet0,但VMnet0不能设置为桥接模式(由于缺少素材,这里没有配图)。

  之后重启vmware。

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

  

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

  

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

  

 

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

  

 

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

  

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

  

 三、修改Ubuntu配置

   3.1 修改配置文件

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

     将文件修改为:

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
address 192.168.1.3
netmask 255.255.255.0
gateway 192.168.1.1

auto eth1
iface eth1 inet dhcp

    然后保存退出,这个文件指定了网卡eth0的IP为静态IP,IP地址为192.168.1.3,子网掩码为255.255.255.0,网关为192.168.1.1。网卡eth1的IP为动态获取。

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

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

    

      其中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地址,如下图:

   记住这两个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命令查看路由表,如下图:

  

   此时执行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.90
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通,说明开发板已经可以连接互联网了,如下图:

 

 六、问题分析与注意事项

  1) 有些板子每次重启都需要重新修改/etc/resolv.conf文件,如tiny4412。

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

  3)每次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下编辑,不能在windows上编辑好后再拷贝到Ubuntu中,因为windows中的换行符为"\r\n"而linux中的换行符为“\n”,当脚本执行成功时,会打印出“net.ipv4.ip_forward = 1”,如下图,如果没打印出“net.ipv4.ip_forward = 1”,则表明没有执行成功。

   4)如果配置没有问题,但板子依然无法联网,则确认一下windows的防火墙是否关闭,没关闭的话将其关闭。

  5)虚拟网络编辑器里只有两张网卡,没有VMnet0,如下图:

  

  首先确认虚拟机是否用管理员方式打开的,如果是,则点击“虚拟网络编辑器”对话框左下角的“还原默认设置”,这样VMnet0就出来了。之后还要将VMnet0桥接到电脑的网卡上,通常叫PCIe什么什么的,不同电脑不一样,上述内容中有说怎么看网卡名。