一、前言
在进行ARM Linux开发的时候经常会遇到这样的问题,在虚拟机上安装一个Ubuntu,开发时将Ubuntu和开发板都设置为静态IP,将二者用网线连接,可以用NFS挂载。但有时Ubuntu需要连接互联网,这时就要将Ubuntu的IP设置为动态IP,并将Ubuntu的网络连接模式设置为NAT模式,使用完之后又设置为桥接模式和静态IP,这样改来改去比较麻烦,而且有时希望开发板也能连接到互联网中去,这样就需要一种比较完美的解决办法。
二、修改虚拟机配置
在虚拟机的菜单栏中点击“编辑”->“虚拟网络编辑器”,如下图:
点击“还原默认设置”,如下图:
之后重启虚拟机。
在虚拟机的菜单栏中点击“虚拟机”->“设置”,如下图:
在弹出的界面中点击“添加”,如下图:
点击“网络适配器”,然后点击“下一步”,如下图:
选择“NAT 模式”,然后点击“完成”,如下图:
这时虚拟机的硬件设备里就有两个网络适配器了,需要保证第一个网络适配器为桥接模式,第二个网络适配器为NAT模式,如下图:
点击“确定”之后等待下图所示进度条走完:
三、修改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命令就可以发现,已经有三张网卡了,如下图:
其中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.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通,说明开发板已经可以连接互联网了,如下图:
六、问题分析与注意事项
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重启时运行这个文件(用超级用户权限)。
测试过几次,手动输入命令的话可以成功,但是用脚本执行命令的话就不成功,暂时不知道原因,但是理论上来说脚本也是可以的,暂时先放在这里。