centos7作为网关

假设该机的ip地址是10.176.22.33

  1. 开启ip转发

    bash

    echo "1" > /proc/sys/net/ipv4/ip_forward
  2. 让他生效。

    bash

    sysctl -p
  3. 设置iptables规则

    bash

    sudo iptables -F
    sudo iptables -P INPUT ACCEPT
    sudo iptables -P FORWARD ACCEPT
    sudo iptables -t nat -A POSTROUTING -o eno1 -j MASQUERADE

    最后一条有个eno1是你机器的网口名 你看下你机器网口名是啥 然后改下就行

编辑/etc/netplan/里面的配制文件

yaml

##  This is the network config written by 'subiquity'
network:
  ethernets:
    eno1:
      dhcp4: no
      dhcp6: no
      addresses:
              - 10.176.22.207/24
              - 2001:DA8:8001:7B22::207/64
      nameservers:
              addresses:
                      - 202.120.224.6
      routes:
              - to: 0.0.0.0/0
                via: 10.176.22.33
                metric: 50
              - to: 10.0.0.0/8
                via: 10.176.22.1
                metric: 50
              - to: ::/0
                via: 2001:DA8:8001:7B22::1
                metric: 70
    eno2:
      dhcp4: true
    eno3:
      dhcp4: true
    eno4:
      dhcp4: true
    ens2f0:
      dhcp4: no
      addresses: [192.168.2.207/24]
      nameservers:
                addresses: [202.120.224.6]
      routes:
              - to: 0.0.0.0/0
                via: 192.168.2.1
                metric: 50
    ens2f1:
      dhcp4: true
  version: 2

其中10.176.22.33为局域网作为网关的机器。

记得配制一条10.0.0.0/8的路由,防止局域网内其他主机无法直接访问这台机器。

  1. 把你上网的网卡的配置文件(/etc/sysconfig/network-scripts/ifcfg-em3)里的GATEWAY改为10.176.22.33

  2. 增加一条路由,防止局域网的其他机器不能访问你。

    bash

    ip route add 10.0.0.0/8 via 10.176.22.1 dev em3
  3. 如果出现RTNETLINK answers: Network is unreachable,在增加一条路由

    bash

    ip route add 10.176.22.1/32 dev em3

bash

ip route add 0.0.0.0/0 via 10.176.22.33
ip route add 10.0.0.0/8 via 10.176.22.1

bash

ip route add 10.176.22.1/32 dev br0
ip route add 10.0.0.0/8 via 10.176.22.1 dev br0
  1. (可选)让docker监听ipv6。

    编辑etc/docker/daemon.json文件

    json

    {
      "ipv6": true,
      "fixed-cidr-v6": "2001:DA8:8001:7B22:200::/80"
    }

    重启docker

    bash

    sudo systemctl restart docker
  2. 创建macvlan

    没有ipv6的版本

    bash

    docker network create -d macvlan \
        --subnet=10.176.22.0/24 \
        --gateway=10.176.22.1 \
         -o parent=em1 \
         -o macvlan_mode=bridge macnet

    有ipv6的版本

    bash

    docker network create -d macvlan --ipv6 \
        --subnet=10.176.22.0/24 \
        --gateway=10.176.22.1 \
        --subnet=2001:DA8:8001:7B22:200::/80 --gateway=2001:DA8:8001:7B22:200::1 \
         -o parent=em1 \
         -o macvlan_mode=bridge macnet

    注意看含义,有的值需要变

  1. 采用centos作为容器

    bash

    docker pull centos:centos7.9.2009
  2. 创建容器

    bash

    docker run --name rui -it -d --network macnet --privileged --ip 10.176.22.208 centos:centos7.9.2009 /bin/bash
  3. 进入容器后, 先更换源

    bash

    cp -r /etc/yum.repos.d /etc/yum.repos.d.bak
    sed -e 's|^mirrorlist=|## mirrorlist=|g' \
             -e 's|^## baseurl=http://mirror.centos.org|baseurl=https://mirrors.bfsu.edu.cn|g' \
             -i.bak \
             /etc/yum.repos.d/CentOS-*.repo
    yum update

    安装一些工具

    bash

    yum install -y  iproute iproute-doc
  4. 像上面一样开启转发

    bash

    echo "1" > /proc/sys/net/ipv4/ip_forward
    sysctl -p
  5. 像上面一样设置iptables

    bash

    iptables -F
    iptables -P INPUT ACCEPT
    iptables -P FORWARD ACCEPT
    iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
  6. 这就设置好了。

  7. 把当前容器作为镜像

    bash

    docker commit -a "ruiRay" -m "a centos gateway " f4d2c6a1070d centos_gateway:20230225
  8. 用当前容器重新创建一个测试

    bash

    docker run --name rui -it -d --network macnet --privileged --ip 10.176.22.209 centos_gateway:20230225 /bin/bash
  9. 发现并不起作用,进入容器查看iptables表发现少了一条记录,于是再次添加

    bash

    iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

    添加以后就能正常使用,还不清楚错误的原因。是不是没有保存?/etc/init.d/iptables save

  10. 把镜像上传到dockerhub方便下次使用。

    bash

    docker login ##  输入帐号密码登录

    在官网上创建一个仓库叫做ruiray/centos_gateway:

    把本地镜像的名字命名为Docker ID/仓库名

    bash

     docker tag centos_gateway:20230225 ruiray/centos_gateway:20230225

    推送到远端

    bash

    docker push ruiray/centos_gateway:20230225

    验证一下

    bash

    docker inspect ruiray/centos_gateway:20230225

    查看镜像

  11. 基于alpine制作的方法也一样,创建一个容器,进入执行如下命令

    bash

    set -eux && sed -i 's/dl-cdn.alpinelinux.org/mirrors.sjtug.sjtu.edu.cn/g' /etc/apk/repositories
    apk add iptables
    iptables -F
    iptables -P INPUT ACCEPT
    iptables -P FORWARD ACCEPT
    iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE