我使用VirtualBox并不是很专业,只是拿它来组件服务器。后来这个虚拟机对我越来越重要,我的各种测试服务器和学习服务器越来越多,于是我就给他们规划了IP地址,像这样:
我用的网络一直都是桥接,每个虚拟机都可以上网,也都可以和本地电脑通信,用起来得心应手。
有一天我忽然需要要把一个使用了虚拟机服务器的项目拿到别的地方展示。脱离了我家里的路由器,网络通信出了问题。我才意识到我的本地电脑和虚拟机之间需要组件一个内部网络,没有物理路由器的支持也能正常工作。当然,我希望能切换自如,毕竟虚拟机也需要上网。
经过研究,我采用了双网卡机制,网卡1还是原来的,采用桥接方式上网,可以访问互联网。开启网卡2,用host-only方式上网。
首先需要建立一个新的网络,vbox本身是有一个192.168.56.x网段的网络,如果有必要可以另外创建一个。
在网络设置里面对相应的适配器做点设置。
开启网卡2,选择host-only模式,选择自己创建的一个网络。
启动虚拟机。由于此时的网卡2使用的是动态分配的ip,所以没法用网卡2的ip去ssh,可以使用网卡1的ip登录,或者在虚拟机显示界面直接登录,查看和修改网卡2的配置。
centos7默认网卡1的配置文件在/etc/sysconfig/network-scripts/下面,文件名为ifcfg-enp0s3,网卡2的名称为ifcfg-enp0s8,网卡3为ifcfg-enp0s9,网卡4为ifcfg-enp0s10,但是后面三张网卡实际上没有配置文件,需要手动去创建。我们可以把网卡1的配置文件复制一份,改文件名,再打开,修改内容。
红框部分都是需要修改的,UUID可以重新生成一个,也可以做一点稍微的修改,不要与复制的源文件相同就好了。
重启网络,就可以用网卡2的ip登录了。
为了不混乱,我把网卡1确定为桥接网络,网卡2,确定为192.168.2.x网段,网卡3确定为192.168.10.x网段,网卡4使用vbox默认的192.168.56.x网段,一般使用前两个就行,四个网卡全开会出问题。可以根据网络环境的不同开启合适的网络。
手动复制和修改网络配置文件比较麻烦。我一般会把配置文件做好,放置在一个基础镜像vdi中,需要新增服务器就复制镜像修改。后来我查找资料,学习研究,设计了一个将就够用的脚本,用脚本来修改网卡配置。
脚本源码如下:
#!/bin/bash
#auto alter ip
#auth by chris chan
#2020年10月30日 10:50:00
#######################
DATE=`date +%Y%m%d%H%M`
#定义函数 - 选择要修改IP的网卡
INTERFACE_CHOOSE () {
echo -e "\033[32m---------------------------------------------------------\033[0m"
PS3="请按提示,选择要修改的网卡:"
select INTERFACE in `ls /sys/class/net/|grep -v 'lo'`
do
break
done
}
#定义函数 - 输入IP地址,如果IP地址不正确,循环输入,直到正确为止
DEFINE_IPADDR_NEW () {
echo -e "\033[32m----------------------------------------------------------\033[0m"
echo ""
read -p "请正确输入IP地址: " NEW_IPADDR
echo ${NEW_IPADDR}|grep -iwE '^[1-2][0-9]{0,2}\.([0-9]{1,3}\.){2}[0-9]{1,3}$' >/dev/null 2>&1
while [ $? -ne 0 ]
do
read -p "IP定义不正确,请重新输入 : " NEW_IPADDR
echo ${NEW_IPADDR}|grep -iwE '^[1-2][0-9]{0,2}\.([0-9]{1,3}\.){2}[0-9]{0,3}$' >/dev/null 2>&1
done
}
#定义函数 - 检测IP输入后,是否会IP冲突,如果冲突,则重新调用函数DEFINE_IPADDR_NEW,重新输入IP
CHECK_IP_conflict () {
echo "检测IP中,请稍等2秒..."
ping -c 2 "${NEW_IPADDR}" |grep "ttl" >/dev/null 2>&1
while [ $? -eq 0 ]
do
echo -e "\033[33mIP冲突,请重新输入: \033[0m"
DEFINE_IPADDR_NEW
echo "检测IP中,请稍等2秒..."
ping -c 2 "${NEW_IPADDR}" |grep "ttl" >/dev/null 2>&1
done
echo -e "\033[32m------IP定义成功!------\033[0m"
}
#定义函数 - 输入子网掩码,如果子网掩码不正确,循环输入,直到正确为止
DEFINE_NETMASK_NEW () {
echo -e "\033[32m----------------------------------------------------------\033[0m"
echo ""
read -p "请输入子网掩码(255.255.255.0):" NEW_NETMASK
echo ${NEW_NETMASK}|grep -iwE '^255\.([0-9]{1,3}\.){2}[0-9]{1,3}$' >/dev/null 2>&1
if [ !$NEW_NETMASK ]; then
NEW_NETMASK="255.255.255.0"
echo "已设定默认子网掩码:" ${NEW_NETMASK}
return
fi
while [ $? -ne 0 ]
do
read -p "子网掩码定义不正确,请重新输入: " NEW_NETMASK
echo ""
echo ${NEW_NETMASK}|grep -iwE '^255\.([0-9]{1,3}\.){2}[0-9]{1,3}$' >/dev/null 2>&1
done
}
#定义函数 - 输入网关,如果网关不通,循环输入,直到输入后能ping通为止
DEFINE_GATEWAY () {
echo -e "\033[32m----------------------------------------------------------\033[0m"
read -p "请输入网关(192.168.0.1): " NEW_GATEWAY
echo "检测网关中,请稍等2秒..."
ping -c 2 "${NEW_GATEWAY}"|grep -iE "ttl" >/dev/null 2>&1
if [ !$NEW_GATEWAY ]; then
# NEW_GATEWAY="192.168.0.1"
echo "已设定默认网关:" ${NEW_GATEWAY}
return
fi
while [ $? -ne 0 ]
do
read -p "网关不通,请重新输入正确网关: " NEW_GATEWAY
echo "检测网关中,请稍等2秒..."
ping -c 2 "${NEW_GATEWAY}"|grep -iE "ttl" >/dev/null 2>&1
done
echo -e "\033[32m------网关定义成功!------\033[0m"
}
ping -c 2 ${NEW_GATEWAY}|grep -iE "ttl" >/dev/null 2>&1
INTERFACE_CHOOSE
DEFINE_IPADDR_NEW
CHECK_IP_conflict
DEFINE_NETMASK_NEW
DEFINE_GATEWAY
echo $INTERFACE
echo ${NEW_IPADDR}
echo ${NEW_NETMASK}
echo ${NEW_GATEWAY}
INTERFACE_DIR="/etc/sysconfig/network-scripts"
# 判断网卡配置文件是否存在
NET_CONFIG_FILE=${INTERFACE_DIR}/ifcfg-${INTERFACE}
# 不存在就把ifcfg-enp0s3网卡配置文件复制一份
if [ !$NET_CONFIG_FILE ]; then
\cp ${INTERFACE_DIR}/ifcfg-{enp0s3,${INTERFACE}}
# 写入新的网卡信息
sed -i "/^NAME/cNAME=${INTERFACE}" ${INTERFACE_DIR}/ifcfg-${INTERFACE}
sed -i "/^DEVICE/cDEVICE=${INTERFACE}" ${INTERFACE_DIR}/ifcfg-${INTERFACE}
sed -i "/^UUID/cUUID=$(cat /proc/sys/kernel/random/uuid)" ${INTERFACE_DIR}/ifcfg-${INTERFACE}
sed -i "/^DNS1/cDNS1=${NEW_GATEWAY}" ${INTERFACE_DIR}/ifcfg-${INTERFACE}
fi
DHCP_OR_STATIC=`cat ${INTERFACE_DIR}/ifcfg-${INTERFACE} |sed '/^BOOTPROTO/p' -n|awk -F"=" '{print $2}'`
echo $DHCP_OR_STATIC
#备份网卡文件
\cp ${INTERFACE_DIR}/ifcfg-${INTERFACE}{,${DATE}.bak}
#备份DNS配置文件
\cp /etc/resolv.conf{,.bak}
if [[ ${DHCP_OR_STATIC} == "dhcp" ]];then
sed -i '/^BOOTPROTO/cBOOTPROTO=static' ${INTERFACE_DIR}/ifcfg-${INTERFACE}
sed -i "/^BOOTPROTO/aGATEWAY=${NEW_GATEWAY}" ${INTERFACE_DIR}/ifcfg-${INTERFACE}
sed -i "/^BOOTPROTO/aNETMASK=${NEW_NETMASK}" ${INTERFACE_DIR}/ifcfg-${INTERFACE}
sed -i "/^BOOTPROTO/aIPADDR=${NEW_IPADDR}" ${INTERFACE_DIR}/ifcfg-${INTERFACE}
echo -e "\033[32m已生成网卡${INTERFACE}配置文件,见下: \033[0m"
echo -e "\033[32m#################################################################\033[0m"
cat ${INTERFACE_DIR}/ifcfg-${INTERFACE}
elif [[ ${DHCP_OR_STATIC} == "static" ]];then
sed -i "/^GATEWAY/cGATEWAY=${NEW_GATEWAY}" ${INTERFACE_DIR}/ifcfg-${INTERFACE}
sed -i "/^NETMASK/cNETMASK=${NEW_NETMASK}" ${INTERFACE_DIR}/ifcfg-${INTERFACE}
sed -i "/^IPADDR/cIPADDR=${NEW_IPADDR}" ${INTERFACE_DIR}/ifcfg-${INTERFACE}
echo -e "\033[32m已生成网卡${INTERFACE}配置文件,见下\033[0m"
echo -e "\033[32m#################################################################\033[0m"
cat ${INTERFACE_DIR}/ifcfg-${INTERFACE}
fi
echo -e "\033[32m#################################################################\033[0m"
echo ""
while true
do
read -p "请检查网卡${INTERFACE}配置文件,确认是否执行修改IP操作,YES or NO : " ALTER_Y_N
if [ ! $ALTER_Y_N ]; then
ALTER_Y_N="YES"
fi
case $ALTER_Y_N in
YES|Y|yes|y)
echo -e "\033[32m 网卡${INTERFACE}IP修改成功,网络重启中,请使用新IP链接服务器................the end !\033[0m"
#重启网卡
systemctl restart network.service
#恢复dns配置文件
\cp /etc/resolv.conf.bak /etc/resolv.conf
ifconfig ${INTERFACE}
ping -c 5 www.baidu.com
if [ $? -ne 0 ];then
echo -e "\033[33m-----------------------\033[0m"
echo -e "\033[33m 无法上网,IP回滚!!\033[0m"
echo -e "\033[33m-----------------------\033[0m"
\mv ${INTERFACE_DIR}/ifcfg-${INTERFACE}${DATE}.bak ${INTERFACE_DIR}/ifcfg-${INTERFACE}
systemctl restart network.service
\cp /etc/resolv.conf.bak /etc/resolv.conf
ping -c 2 www.baidu.com
if [ $? -eq 0 ];then
echo -e "\033[32m-----------------------!\033[0m"
echo -e "\033[32m 回滚成功!!\033[0m"
echo -e "\033[32m-----------------------!\033[0m"
ifconfig ${INTERFACE}
else
echo -e "\033[33m回滚失败,请检查!!\033[0m"
fi
fi
exit 0
;;
NO|no|N|n)
\mv ${INTERFACE_DIR}/ifcfg-${INTERFACE}${DATE}.bak ${INTERFACE_DIR}/ifcfg-${INTERFACE}
echo -e "\033[33m网卡${INTERFACE}IP未修改,退出操作!!\033[0m"
exit 1
;;
esac
done