Linux-kylin或ubuntu,配置ip,绑定网口,容器网络隔离,内外部通信

ip配置

永久生效或临时生效

如果涉及生产,每个机器网口的mac地址不同,对于不的系统,ubuntu,centos修改方式不同

应用场景,基于国产化系统kylin 需要每个生产的机器保持一致网口名

在这里插入图片描述
开机的时候kylin系统自己分配网口名字为eno0开始,
在这里插入图片描述
后面根据系统更改后的名字更改自己需要的网口名

#ip set
echo "ip set" >> /zdxlz/etc/system/out.txt

ifconfig eno1 down
ip link set eno1 name MGMT0
ifconfig MGMT0 up
ifconfig MGMT0 192.168.254.232 netmask 255.255.255.0
sleep 1

ifconfig eno2 down
ip link set eno2 name MGMT1
ifconfig MGMT1 up
sleep 1

永久配置就根据Ubuntu修改网口名方案
1、修改yaml文件

/etc/netplan/01-network-manager-all.yaml

2、通过udev规则修改名称

vim /etc/udev/rules .d/7@-persistent-net.rules

修改需要更具具体系统的启动流程,配置文件的调用顺序,以及部分服务的开关等

容器IP管理

#!/usr/bin/env bash

function LOG() {
  CHSMMI_LOG_PATH=/zdxlz/var/log/chsmmi/chsmmi_script.log
  local log_level=$1
  local log_content=$2

  if [ "${log_level}" != "INFO" -a "${log_level}" != "WARN" -a "${log_level}" != "ERROR" ]; then
    return
  fi

  if [ -z "${log_content}" ]; then
    return
  fi

  local curtime=$(date +"%y-%m-%d %H:%M:%S")
  local script_name=$(basename $0)
  echo "${curtime} ${script_name} ${log_level} ${log_content}" >>${CHSMMI_LOG_PATH} 2>&1
}

# echo输出是返回给调用程序的(如chsmmi)
function LOG_ERROR_AND_EXIT() {
  local log_content=$1
  if [ -z "${log_content}" ]; then
    return
  fi
  LOG ERROR "${log_content}"
  echo ${log_content}
  exit 1
}

function get_dns_info() {
  local dns_list=$(grep '^nameserver' /etc/resolv.conf | cut -d " " -f 2)
  if [ -z "${dns_list}" ]; then
    LOG_ERROR_AND_EXIT "Failed to get DNS info."
  fi
  local dns_str=""
  for d in ${dns_list}; do
    if [ ! -z "${dns_str}" ]; then
      dns_str="${dns_str};"
    fi
    dns_str="${dns_str}${d}"
  done
  echo ${dns_str}
  LOG DEBUG "Success to get DNS: ${dns_str}"
  exit 0
}
#创建时不指定共享命名空间--ipc
function create_vsm() {
  local imageName=$1
  local vsmName=$2
  local ecard=$3
  #内存和cpu权重
  local memLimit=${4:-2000}
  local cpuShare=${5:-1024}
//创建
  LOG INFO "create_vsm imageName ${imageName}  vsmName ${vsmName} ecard ${ecard} memLimit ${memLimit} cpuShare ${cpuShare}"
  docker create -it --name ${vsmName} --net=none --hostname ${vsmName} -m ${memLimit}M --cpu-shares ${cpuShare} -v /etc/localtime:/etc/localtime:ro \
  --cap-add NET_ADMIN --device=/dev/${ecard}:/dev/${ecard} ${imageName} /bin/bash /start.sh

  if [ $? != 0 ]; then
    LOG_ERROR_AND_EXIT "create vsm ${vsmName} failed."
  fi
  LOG INFO "Success to create vsm ${vsmName}"
  exit 0
}

function start_vsm() {
  local vsmName=$1
  docker start ${vsmName}
  if [ $? != 0 ]; then
    LOG_ERROR_AND_EXIT "start vsm ${vsmName} failed."
  fi
  LOG INFO "Success to start vsm ${vsmName}"
  exit 0
}

function stop_vsm() {
  local vsmName=$1
  docker stop ${vsmName}
  if [ $? != 0 ]; then
    LOG_ERROR_AND_EXIT "stop vsm ${vsmName} failed."
  fi
  LOG INFO "Success to stop vsm ${vsmName}"
  exit 0
}

function restart_vsm() {
  LOG INFO "start to restart vsm ${vsmName}"
  local vsmName=$1

  docker restart ${vsmName}
  if [ $? != 0 ]; then
    LOG_ERROR_AND_EXIT "restart vsm ${vsmName} failed."
  fi

  LOG INFO "Success to restart vsm ${vsmName}"
  exit 0
}

function destory_vsm() {
  local vsmName=$1
  docker rm -f ${vsmName}
  if [ $? != 0 ]; then
    LOG_ERROR_AND_EXIT "delete vsm ${vsmName} failed."
  fi
  LOG INFO "Success to delete vsm ${vsmName}"
  exit 0
}

function mask2cdr() {
  local x=${1##*255.}
  set -- 0^^^128^192^224^240^248^252^254^ $(((${#1} - ${#x}) * 2)) ${x%%.*}
  x=${1%%$3*}
  echo $(($2 + (${#x} / 4)))
}

function cdr2mask() {
  # Number of args to shift, 255..255, first non-255 byte, zeroes
  set -- $((5 - ($1 / 8))) 255 255 255 255 $(((255 << (8 - ($1 % 8))) & 255)) 0 0 0
  [ $1 -gt 1 ] && shift $1 || shift
  echo ${1-0}.${2-0}.${3-0}.${4-0}
}

function set_network_vsm() {
  local ip=$1
  local mask=$2
  local gateway=$3
  local vsm_id=$4
  #vsm id
  local id=$5
  local vlan_id=$6
  local eth_type=$7
  local eth_eth_no_vlan=bond0
  local eth_eth_vlan=bond1
  local eth_sfp_no_vlan=SFP0
  local eth_sfp_vlan=SFP1
  local eth=""
  local br_name=""

  #电口
  #ens15f0 ens15f1 ens15f2 ens15f3
  #管理口
  #enp7s0 enp8s0
  #光口
  #ens1f0 ens1f1

  local cdr=$(mask2cdr ${mask})

  local ns=$(docker inspect --format '{{ .State.Pid }}' ${vsm_id})
  #创建虚拟以太网对
  /usr/sbin/ip link add vethIn-$id type veth peer name vethOut-$id
  /usr/sbin/ip link set dev vethOut-$id up
  #将in分配给网络命名空间
  /usr/sbin/ip link set vethIn-$id netns $ns
  #配置外部通信ip 路由 网关 vethIn-1
  nsenter -t $ns -n /usr/sbin/ip addr add ${ip}/${cdr} dev vethIn-$id
  nsenter -t $ns -n /usr/sbin/ip route add default via ${gateway}
  nsenter -t $ns -n /usr/sbin/ip link set dev vethIn-$id up

  if [ ${eth_type} == "eth" ];then
    if [ ${vlan_id} == "0" ];then
      eth=${eth_eth_no_vlan}
    else
      eth=${eth_eth_vlan}
    fi
    br_name="BrEth"
  elif [ ${eth_type} == "sfp" ];then
    if [ ${vlan_id} == "0" ];then
      eth=${eth_sfp_no_vlan}
    else
      eth=${eth_sfp_vlan}
    fi
    br_name="BrSfp"
  else
    LOG_ERROR_AND_EXIT "set vsm:${vsmName} network  failed, invalid eth type: ${eth_type}"
  fi
  LOG INFO "set_network_vsm vsm_id ${vsm_id}, ip ${ip}, mask ${mask}, gateway ${gateway}, id ${id}, eth_type ${eth_type}, eth ${eth}, br_name ${br_name}"
  if [ ${vlan_id} == "0" ];then
    #host
    /usr/sbin/ip link add name ${br_name} type bridge
    /usr/sbin/ip link set ${br_name} up
    #将虚拟机 虚拟以太网vethOut 添加到 BrEth网桥中
    /usr/sbin/ip link set dev vethOut-$id master ${br_name}
    #将绑定的 不带vlan网络接口 bond0物理口 绑定到BrEth网桥上
    /usr/sbin/ip link set dev ${eth} master ${br_name}
    /usr/sbin/ip link set dev ${eth} up
  else
    #host
    #指定的物理接口${eth} 上创建一个 VLAN 子接口,并为这个子接口分配 VLAN ID ${vlan_id}。这个命令的目的是在现有的物理接口上建立一个虚拟接口,以实现 VLAN 隔离
    /usr/sbin/ip link add link ${eth} name ${eth}.${vlan_id} type vlan id ${vlan_id}
    /usr/sbin/ip link set ${eth}.${vlan_id} up
    #创建一个网桥 带id
    /usr/sbin/ip link add name ${br_name}.${vlan_id} type bridge
    /usr/sbin/ip link set ${br_name}.${vlan_id} up
    #将虚拟机的 虚拟以太网接口 桥接到带id号的桥上
    /usr/sbin/ip link set dev vethOut-$id master ${br_name}.${vlan_id}
    #桥接 带id号的 VLAN 子接口
    /usr/sbin/ip link set dev ${eth}.${vlan_id} master ${br_name}.${vlan_id}
    /usr/sbin/ip link set dev ${eth}.${vlan_id} up
  fi

  if [ $? != 0 ]; then
    LOG_ERROR_AND_EXIT "set vsm:${vsmName} network  failed."
  fi
  LOG INFO "Success to set vsm:${vsmName} network."
  exit 0
}

function delete_network_vsm() {
  local ip=$1
  local mask=$2
  local gateway=$3
  local vsm_id=$4
  local id=$5

  local cdr=$(mask2cdr ${mask})

  local ns=$(docker inspect --format '{{ .State.Pid }}' ${vsm_id})
#  /usr/sbin/ip link add vethIn-$id type veth peer name vethOut-$id
#  /usr/sbin/ip link set dev vethOut-$id up
#  /usr/sbin/ip link set vethIn-$id netns $ns
  nsenter -t $ns -n /usr/sbin/ip addr | grep ${ip} > /dev/null 2>&1
  if [ "$?" == "0" ];then
    nsenter -t $ns -n /usr/sbin/ip addr del ${ip}/${cdr} dev vethIn-$id
  fi
  nsenter -t $ns -n /usr/sbin/ip route | grep ${gateway} > /dev/null 2>&1
  if [ "$?" == "0" ];then
    nsenter -t $ns -n /usr/sbin/ip route del default via ${gateway}
  fi
#  nsenter -t $ns -n /usr/sbin/ip link set dev vethIn-$id up
#  /usr/sbin/ip link set dev vethOut-$id master BrEth

  if [ $? != 0 ]; then
    LOG_ERROR_AND_EXIT "delete vsm:${vsmName} network  failed."
  fi
  LOG INFO "Success to delete vsm:${vsmName} network."
  exit 0
}

function set_inter_network_vsm() {
  local vsm_id=$1
  local id=$2
  local cdr=24
  LOG INFO "set_inter_network_vsm vsm_id ${vsm_id}, id ${id}"
#获取容器运行PID
  local ns=$(docker inspect --format '{{ .State.Pid }}' ${vsm_id})
  #创建 一对 虚拟以太网设备(veth),
  /usr/sbin/ip link add vethInInt-$id type veth peer name vethOutInt-$id
  /usr/sbin/ip link set dev vethOutInt-$id up
  #将虚拟以太网设备移动指定网络命名空间 实现隔离和网络分隔
  /usr/sbin/ip link set vethInInt-$id netns $ns
  #根据容器 id号 分配内部通信ip
  /usr/sbin/ip addr add 1.1.${id}.3/${cdr} dev vethOutInt-$id
  /usr/sbin/iptables -nvL | grep 1.1.${id}.0/24 > /dev/null 2>&1
  if [ "$?" != "0" ];then
    LOG INFO "set_inter_network_vsm set vsm_id ${vsm_id}, id ${id}"
    /usr/sbin/iptables -A INPUT -s 1.1.${id}.3/24 -d 1.1.${id}.2/24 -j ACCEPT
  fi
  nsenter -t $ns -n /usr/sbin/ip addr add 1.1.${id}.2/${cdr} dev vethInInt-$id
  nsenter -t $ns -n /usr/sbin/ip link set dev vethInInt-$id up
  LOG INFO "set_inter_network_vsm set vsm white list for qtumd"
  nsenter -t $ns -n /sbin/iptables -A INPUT -p tcp -s 1.1.${id}.3 -d 1.1.${id}.2 -j ACCEPT
  if [ $? != 0 ]; then
    LOG_ERROR_AND_EXIT "set vsm:${vsmName} inter network  failed."
  fi
  LOG INFO "Success to set vsm:${vsmName} inter network."
  exit 0
}

function get_gate_way() {
  local card_name=$1
  local gate_way=$(/usr/sbin/ip route | grep ${card_name} | grep via | cut -d " " -f 3)
  if [ $? != 0 ]; then
    LOG_ERROR_AND_EXIT "get ${card_name}'s gateway failed."
  fi
#  if [ -z "${gate_way}" ]; then
#    gate_way=$(/usr/sbin/ip route | grep ${card_name} | grep via | grep -v default | awk -F 'via' '{print $2}' | awk -F 'dev' '{print $1}')
#  fi
  LOG INFO "get ${card_name}'s gateway successfully."
  echo "${gate_way}"
  exit 0
}

case $1 in
create_vsm)
  create_vsm $2 $3 $4 $5 $6
  ;;
start_vsm)
  start_vsm $2
  ;;
stop_vsm)
  stop_vsm $2
  ;;
restart_vsm)
  restart_vsm $2
  ;;
destory_vsm)
  destory_vsm $2
  ;;
set_network_vsm)
  set_network_vsm $2 $3 $4 $5 $6 $7 $8
  ;;
delete_network_vsm)
  delete_network_vsm $2 $3 $4 $5 $6
  ;;
set_inter_network_vsm)
  set_inter_network_vsm $2 $3
  ;;
get_dns)
  get_dns_info
  ;;
get_gate_way)
  get_gate_way $2
  ;;
*)
  LOG_ERROR_AND_EXIT "invalid param"
  ;;
esac

1、绑定网口临时配置(由于需要绑定开机后零时更改的网口名,所以需要通过shell配置)
sudo modprobe bonding
sudo ip link add bond0 type bond mode 0 miimon 100
sudo ip link set eth0 down
sudo ip link set eth1 down
sudo ip link set eth0 master bond0
sudo ip link set eth1 master bond0
sudo ip link set bond0 up
2、正常绑定网口及各种模式

1、安装ifenslave;

dpkg -i ifenslave_2.7kord1_all.deb

2、在/etc/modules文件末行加入bonding,设置bonding模块开机自动加载

3、创建/etc/modprobe.d/bonding.conf, 命令vim /etc/modprobe.d/bonding.conf,内容如下:

options bonding mode=1 miimon=100

其中mode=1,表示主-备策略

4、加载bonding模块;
命令:sudo modprobe bonding
查看下是否加载成功
lsmod|grep bonding
配置bond0使用的网络接口
ifenslave bond0 enp1s0f0 enp1s0f1
5、写入配置文件,可以直接替换interfaces文件,修改IP地址即可
vim /etc/network/interfaces 或分开写几个文件放到目录
文件内容如下:

source /etc/network/interfaces.d/*

auto lo
iface lo inet loopback

auto enp1s0f0
iface enp1s0f0 inet manual
bond-master bond0

auto enp1s0f1
iface enp1s0f1 inet manual
bond-master bond0

auto bond0
iface bond0 inet static
address 192.168.1.22
netmask 255.255.255.0
gateway 192.168.1.1
bond-slaves enp1s0f0 enp1s0f1
bond-mode 1
bond-miimon 100

auto enp1s0f2
iface enp1s0f2 inet static
address 192.168.1.111
netmask 255.255.255.128
gateway 192.168.1.1

8、禁用图形化界面网卡

systemctl stop NetworkManager.service
systemctl disable NetworkManager.service
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值