首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将容器绑定到特定主机VLAN

将容器绑定到特定主机VLAN
EN

Stack Overflow用户
提问于 2022-01-25 05:25:35
回答 2查看 950关注 0票数 0

我有一个主机,它连接到多个VLAN,这些VLAN在我的路由器上有特定的路由规则,它们有不同的属性。

我已经看到了关于在VM中为每个VLAN运行坞的其他建议,但这似乎也是丑陋和混乱的。

例如

/etc/网络/接口:

代码语言:javascript
复制
# Is routed out a VPN on my router
auto bond0.3
iface bond0.3 inet dhcp
iface bond0.3 inet6 auto

# Is null routed at my router (LAN only)
auto bond0.4
iface bond0.4 inet dhcp
  dns-nameserver 192.168.3.1
iface bond0.4 inet6 auto

# Routed directly to my ISP for containers only
auto bond0.7
iface bond0.7 inet dhcp
iface bond0.7 inet6 auto

我在一个名为“external_7”的码头接口上使用了一个macvlan接口:

代码语言:javascript
复制
networks:
  external_v7:
    name: external_v7
    driver: macvlan
    driver_opts:
      parent: bond0.7
    enable_ipv6: false
    ipam:
      config:
      - subnet: 192.168.7.0/24
        gateway: 192.168.7.1
        ip_range: 192.168.7.128/26

接下来,我在VPN后面有一个Bittorrent客户端,有一个单独的VPN隧道容器而不是在我的路由器上使用的主要原因是,当下载什么东西时,它会阻塞隧道,而且我不能使用它来做任何其他事情,所以我为Bittorrent创建了一个专用VPN隧道:

代码语言:javascript
复制
services:
  vpn_bittorrent:
    extends:
      file: ../docker-vpn/docker-compose-vpn.yml
      service: openvpn-client
    container_name: vpn_bittorrent
    networks:
      external_v7:
        ipv4_address: 192.168.7.128
    volumes:
      - /mnt/data/container_data/vpn:/data/vpn
    ports:
      - 192.168.7.128:26129:26129
      - 192.168.7.128:26129:26129/udp

它的扩展部分来自:

代码语言:javascript
复制
services:
  openvpn-client:
    image: ghcr.io/wfg/openvpn-client
    cap_add:
      - NET_ADMIN
    devices:
      - /dev/net/tun
    restart: unless-stopped

最后,我要运行qbittorrent:

代码语言:javascript
复制
  qbittorrent:
    image: ghcr.io/linuxserver/qbittorrent
    container_name: qbittorrent
    network_mode: service:vpn_bittorrent
    environment:
      - PUID=1004
      - PGID=1003
      - WEBUI_PORT=8080
    volumes:
      - /mnt/data/container_data/qbittorrent:/config
      - /mnt/data/shared/incoming:/mnt/shared/incoming
    restart: unless-stopped

当然,我喜欢在前面有一个反向代理,因为我喜欢使用标准端口,比如:443或什么的。

代码语言:javascript
复制
  web:
    image: nginx:stable-alpine
    container_name: web
    hostname: web.internal
    networks:
      external_v4:
        ipv4_address: 192.168.4.133
    volumes:
      - /mnt/data/container_data/web/nginx/auth-basic.conf:/etc/nginx/auth-basic.conf:ro
      - /mnt/data/container_data/web/nginx/htpasswd:/etc/nginx/htpasswd:ro
      - /mnt/data/container_data/web/nginx/http.d:/etc/nginx/http.d:ro
      - /mnt/data/container_data/web/nginx/nginx.conf:/etc/nginx/nginx.conf:ro
      - /mnt/data/container_data/web/nginx/proxy-control.conf:/etc/nginx/proxy-control.conf:ro
      - /mnt/data/container_data/web/nginx/ssl.conf:/etc/nginx/ssl.conf:ro
      - /mnt/data/container_data/web/nginx/ssl:/etc/nginx/ssl:ro
      - /mnt/data/container_data/web/nginx/html:/etc/nginx/html:ro
    command: [nginx-debug, '-g', 'daemon off;']
    ports:
      - 8080:8080
      - 9090:9090
      - 8989:8989
      - 7878:7878
    restart: unless-stopped

每个服务都必须有一个配置:

代码语言:javascript
复制
server {
    listen 443;
    listen [::]:443;
    include /etc/nginx/ssl/qbittorrent.web.internal/qbittorrent.web.internal.conf;

    server_name qbittorrent.web.internal;


    location / {
        proxy_pass http://192.168.7.128:8080/;
        include    /etc/nginx/proxy-control.conf;
        include    /etc/nginx/auth-basic.conf;
    }
}

现在有几个问题:

  1. 如果由于某种原因VPN容器vpn_bittorrent重新启动nginx代理web将无法再看到bittorrent容器,直到它也重新启动,则结果是"502坏网关“错误。我怀疑这与network_mode: service:vpn_bittorrent.

qbittorrentvpn_bittorrent之间的联系有关。

我想用一些更灵活的东西代替我的反向代理,比如192.168.7.128,我不想手动配置nginx吐露以匹配特定的IP地址,比如

  1. 我认为离开macvlan地址可能是件好事,所以我在我的主机

上创建了一座桥。

代码语言:javascript
复制
auto br7
iface br7 inet static
  address 192.168.7.252
  netmask 255.255.255.0
  gateway 192.168.7.1
  bridge_ports bond0.7
  bridge_stp 0

在某种程度上,我希望使用用户定义的桥将我的容器绑定到该界面,然后就根本不用担心对接端的VLAN了。

使停靠者使用特定接口进行出口的唯一方法似乎是主机上的macvlan或路由规则:

如果有更简单的方法我忽略了,请告诉我。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-03-28 15:30:32

我最终解决了这个问题,诀窍是指定范围:

代码语言:javascript
复制
# docker network create --subnet=172.18.0.0/16 -d bridge -o com.docker.network.bridge.name=MY_NET MY_NET

然后使用防火墙标记,在本例中,我选择了7

代码语言:javascript
复制
# iptables -t mangle -A PREROUTING -s 172.18.0.0/16 -j MARK --set-xmark 0x7/0xffffffff

确保为路由启用此sysctl

代码语言:javascript
复制
# sysctl -w net.ipv4.conf.all.rp_filter=2

将容器表添加到/etc/rt_tables

代码语言:javascript
复制
7 CONTAINERS

添加一些ip规则:

代码语言:javascript
复制
# ip rule add fwmark 7 table CONTAINERS prio 700
# ip route add default via 192.168.7.1 table CONTAINERS
# ip route add 192.168.7.1 dev bond0.7 table CONTAINERS

您可以使用以下方法进行测试:

代码语言:javascript
复制
wget -q -O - ifconfig.me
票数 1
EN

Stack Overflow用户

发布于 2022-03-01 23:40:45

代码语言:javascript
复制
sudo nsenter --net=/var/run/netns/hostname
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70843793

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档