AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / user-176217

Lasse Michael Mølgaard's questions

Martin Hope
Lasse Michael Mølgaard
Asked: 2025-01-20 18:39:54 +0800 CST

在 SpamAssassin 中用一组词将邮件标记为垃圾邮件

  • 7

我知道如果邮件中出现特定的词语,SpamAssassin 可以为该邮件分配分数。

例如邮件中包含该单词bitcoin,则将 1.0 加到总分。

但是,如果制定一条规则,当且仅当整个集合与邮件匹配时,才将一组单词标记为垃圾邮件,那会怎样呢?

比如,如果您有字词internet和banking,然后interest如果其中一个字词出现在邮件中,则不会为其分配垃圾邮件值,但包含所有字词的邮件将获得垃圾邮件分数,例如包含以下消息的邮件:

Get huge interest through internet banking。

我之所以希望 SpamAssassin 匹配整个集合而不是单个单词,是因为我收到的钓鱼邮件看起来像合法邮件,但它们确实有一个共同的主题,例如“Brobizz”(丹麦版 E-ZPass)续订失败。

由于网络钓鱼邮件看起来与合法邮件完全一样,因此阻止所有包含这些词语而没有其他标准的邮件并不是一个好主意。

但是:这些词语和单独的规则(说明发件人邮件服务器的 IP 地址无法解析)的组合足以成为将邮件标记为垃圾邮件的理由。

那么是否可以只对一组单词分配分数?

spamassassin
  • 1 个回答
  • 153 Views
Martin Hope
Lasse Michael Mølgaard
Asked: 2024-06-06 05:37:11 +0800 CST

使用 Docker 和 Kubernetes 构建 SAMBA AD DC 容器会向卷提供错误的内容

  • 5

我正在为运行 SAMBA Active Directory 域控制器的 Kubernetes 构建一个容器。

我正在通过 Ansible 完成这项工作,并且容器正在部署在 Kubernetes 集群(K3S)中。

Docker 使用以下文件作为其构建的一部分:

etc/krb5.conf
etc/bind/rndc.key
etc/bind/named.conf.local
etc/bind/db.0
etc/bind/db.255
etc/bind/db.empty
etc/bind/named.conf.options
etc/bind/db.local
etc/bind/named.conf
etc/bind/db.127
etc/bind/named.conf.default-zones
etc/supervisor/conf.d/supervisord.conf
etc/freeradius/3.0/mods-available/eap
etc/freeradius/3.0/mods-available/realm
etc/freeradius/3.0/mods-available/ntlm_auth
etc/freeradius/3.0/mods-available/mschap
etc/freeradius/3.0/clients.conf
etc/freeradius/3.0/proxy.conf
etc/freeradius/3.0/sites-available/default
etc/freeradius/3.0/sites-available/inner-tunnel
boot/init.sh
boot/kdb5_util_create.expect
Dockerfile

这个想法是,对于所有文件,容器内的路径都是相同的,但/作为前缀。

然而,当我检查编译后的运行容器时,我发现了一些奇怪的事情。

运行 SAMBA 容器给出错误内容

/etc/samba和/etc/bind的内容/etc/freeradius绝对不应该相同!

我的内容Dockerfile如下:

FROM ubuntu:noble

ENV DEBIAN_FRONTEND noninteractive

# Avoid ERROR: invoke-rc.d: policy-rc.d denied execution of start.
RUN echo "#!/bin/sh\nexit 0" > /usr/sbin/policy-rc.d

VOLUME ["/var/lib/samba", "/etc/samba", "/etc/bind", "/etc/freeradius", "/SambaVolume"]

# Setup ssh and install supervisord
RUN apt-get update
RUN apt-get upgrade -y
RUN apt-get install -y openssh-server supervisor ntp mc
RUN mkdir -p /var/run/sshd
RUN mkdir -p /var/log/supervisor
RUN sed -ri 's/PermitRootLogin without-password/PermitRootLogin Yes/g' /etc/ssh/sshd_config

# Add SAMBA VolumeShare location
RUN mkdir -p /SambaVolume

# Install bind9 dns server
RUN apt-get install -y bind9 dnsutils
# Copy tweaked DNS setttings (instead of ADD, due to we want to overwrite any existing files)
COPY etc/bind/* /etc/bind/

# Install samba and dependencies to make it an Active Directory Domain Controller
RUN apt-get install -y samba smbclient winbind libpam-winbind libnss-winbind krb5-kdc libpam-krb5

# Install Freeradius so validate VPN users against samba
RUN apt-get install -y freeradius

# Copy Freeradius customised files
COPY etc/freeradius/ /etc/freeradius/

# Copy customized kerberos configuration file
COPY etc/krb5.conf /etc/

# Install utilities needed for setup
RUN apt-get install -y expect pwgen
ADD boot/kdb5_util_create.expect /root/kdb5_util_create.expect

# Install rsyslog to get better logging of ie. bind9
RUN apt-get install -y rsyslog

# Create run directory for bind9
RUN mkdir -p /var/run/named
RUN chown -R bind:bind /var/run/named

# Add supervisord and init
ADD etc/supervisor/conf.d/supervisord.conf /etc/supervisor/conf.d/supervisord.conf
ADD boot/init.sh /root/init.sh
RUN chmod 755 /root/init.sh
EXPOSE 53/tcp 53/udp 80/tcp 80/udp 88/tcp 88/udp 135/tcp 135/udp 137/tcp 137/udp 
EXPOSE 138/tcp 138/udp 389/tcp 389/udp 443/tcp 443/udp 445/tcp 445/udp 464/tcp 464/udp 
EXPOSE 636/tcp 636/udp 3268/tcp 3268/udp 3269/tcp 3269/udp 9389/tcp 9389/udp
EXPOSE 123/udp 22/tcp 22/udp
ENTRYPOINT ["/root/init.sh"]
CMD ["app:start"]

使用以下命令将编译后的容器存储在本地寄存器中:

  docker build -t samba:latest samba/
  docker tag samba:latest registry.example.com:5000/samba:latest
  docker push registry.example.com:5000/samba:latest  

它通过 Ansible 进行部署,任务如下:

- name: Create SAMBA Deployment
  kubernetes.core.k8s:
    state: present
    definition:
      apiVersion: apps/v1
      kind: StatefulSet
      metadata:
        name: samba
        namespace: samba-system
        labels:
          app: samba
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: samba
        template:
          metadata:
            labels:
              app: samba
          spec:
            volumes:
              - name: samba-config
                persistentVolumeClaim:
                  claimName: samba-config-vol

            containers:
              - name: samba
                image: registry.example.com:5000/samba:latest
                ports:
                  - containerPort: 123
                    protocol: UDP

#           ### SKIPPING ###

                 - containerPort: 9389
                    protocol: UDP
                  - containerPort: 9389
                    protocol: TCP

                volumeMounts:
                  - name: samba-config
                    mountPath: /etc/samba
                  - name: samba-config
                    mountPath: /etc/bind
                  - name: samba-config
                    mountPath: /etc/freeradius
                  - name: samba-config
                    mountPath: /var/lib/samba

                envFrom:
                  - configMapRef:
                      name: samba-environment-map

                securityContext:
                  priviledged: true
                  allowPrivilegeEscalation: true
                  readOnlyRootFilesystem: false

                  capabilities:
                    add:
                      - ALL

/etc/bind我很奇怪为什么文件夹、/etc/samba和的内容/etc/freeradius相同。

我想我在某处读到您可以persistentVolumeClaim对所有文件夹使用相同的内容?

docker
  • 1 个回答
  • 62 Views
Martin Hope
Lasse Michael Mølgaard
Asked: 2024-05-26 11:27:05 +0800 CST

如何让 ingress-nginx 使用向用户提供的证书?

  • 5

我通过 Ansible 在我的 K3S Kubernetes 集群中进行安装,并且我想使用在集群上运行Home Assistant时生成的 Let's Encrypt 证书作为我的入口。Cert-Manager

我在安装 Home Assistant 时使用以下剧本:

---
- name: Create HomeAssistant namespace
  kubernetes.core.k8s:
    state: present
    definition:
      apiVersion: v1
      kind: Namespace
      metadata:
        name: home-system

- name: Generate certificate for HomeAssistant
  kubernetes.core.k8s:
    state: present
    definition:
      apiVersion: cert-manager.io/v1
      kind: Certificate
      metadata:
        name: homeassistant-tls
        namespace: home-system
      spec:
        secretName: homeassistant-tls-secret
        commonName: "homeassistant.example.com" 
        dnsNames:
        - "homeassistant.example.com"
        issuerRef:
          name: letsencrypt-staging
          kind: ClusterIssuer

- name: Get TLS certificate secret
  kubernetes.core.k8s_info:
    api_version: v1
    name: homeassistant-tls-secret
    kind: Secret
    namespace: home-system
  register: tls_secret
  
- name: Create ConfigMap for HomeAssistant
  kubernetes.core.k8s:
    state: present
    definition:
      apiVersion: v1
      kind: ConfigMap
      metadata:
        name: home-config
        namespace: home-system

      data:
        fullchain.pem: "{{ tls_secret.resources[0].data['tls.crt'] | b64decode }}"

        privkey.pem: "{{ tls_secret.resources[0].data['tls.key'] | b64decode }}"

        groups.yaml: |-

        scripts.yaml: |-

        scenes.yaml: |-

        known_devices.yaml: |- 
    
        automations.yaml: |-

        configuration.yaml: |-

          # Loads Default configuration - DO NOT REMOVE
          default_config:

          # Load frontend themes from the themes folder
          frontend:
            themes: !include_dir_merge_named themes
          
          # Text-to-speech
          tts:
            - platform: google_translate
          
          group: !include groups.yaml
          automation: !include automations.yaml
          script: !include scripts.yaml
          scene: !include scenes.yaml

          http:
            use_x_forwarded_for: true

            trusted_proxies:
            - 127.0.0.1
            - 10.42.0.0/16
            - 10.43.0.0/16
            - 192.168.0.0/24

            ssl_certificate: /ssl/fullchain.pem
            ssl_key: /ssl/privkey.pem

- name: Define storage space for HomeAssistant
  kubernetes.core.k8s:
    state: present
    definition:
      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: homeassist-pvc
        namespace: home-system
      spec:
        accessModes:
          - ReadWriteOnce
        storageClassName: small-longhorn # Store data on only 2 nodes instead of 3
        resources:
          requests:
            storage: 5Gi

- name: Add HomeAssistant StatefulSet
  kubernetes.core.k8s:
    state: present
    definition:
      apiVersion: apps/v1
      kind: StatefulSet
      metadata:
        name: homeassistant
        namespace: home-system
        labels:
          app: homeassistant
      spec:
        serviceName: home-svc
        replicas: 1
        selector:
          matchLabels:
            app: homeassistant
        template:
          metadata:
            labels:
              app: homeassistant
          spec:
            volumes:
            - name: home-config-vol
              persistentVolumeClaim:
                claimName: homeassist-pvc

            - name: home-config-file
              configMap:
                name: home-config

            containers:
            - name: homeassistant
              image: lscr.io/linuxserver/homeassistant:latest
              ports:
                - containerPort: 8123
              volumeMounts:
              - name: home-config-vol
                mountPath: /config

              - name: home-config-file
                mountPath: /config/configuration.yaml
                subPath: configuration.yaml
                
              - name: home-config-file
                mountPath: /config/automations.yaml
                subPath: automations.yaml

              - name: home-config-file
                mountPath: /config/scripts.yaml
                subPath: scripts.yaml

              - name: home-config-file
                mountPath: /config/scenes.yaml
                subPath: scenes.yaml

              - name: home-config-file
                mountPath: /config/groups.yaml
                subPath: groups.yaml

              - name: home-config-file
                mountPath: /ssl/fullchain.pem
                subPath: fullchain.pem

              - name: home-config-file
                mountPath: /ssl/privkey.pem
                subPath: privkey.pem

              env:
                - name: PUID
                  value: "1000"
                - name: PGID
                  value: "1000"
                - name: TZ
                  value: "Etc/UTC"

            securityContext:
              capabilities:
                add:
                - NET_ADMIN
                - NET_RAW
                - SYS_ADMIN

              priviledged: true

- name: Define HomeAssistant service ports
  kubernetes.core.k8s:
    state: present
    definition:
      apiVersion: v1
      kind: Service
      metadata:
        name: home-svc
        namespace: home-system
        annotations: 
          metallb.universe.tf/address-pool: default-pool
      spec:
        type: LoadBalancer
        externalTrafficPolicy: Local
        selector:
          app: homeassistant
        ports:
          - name: "8123"
            port: 8123
            targetPort: 8123

- name: Add HomeAssistant ingress
  kubernetes.core.k8s:
    state: present
    definition:
      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: homeassistant
        namespace: home-system

        annotations:
          kubernetes.io/ingress.class: nginx
          cert-manager.io/cluster-issuer: letsencrypt-staging
          nginx.ingress.kubernetes.io/backend-protocol: HTTPS
          nginx.ingress.kubernetes.io/ssl-redirect: "true"
          nginx.ingress.kubernetes.io/force-ssl-redirect: "true"

      spec:
        ingressClassName: nginx
        tls:
        - hosts:
          - homeassistant.example.com
          secretName: homeassistant-tls

        rules:
        - host: 'homeassistant.example.com'
          http:
            paths:
            -  path: /
               pathType: Prefix
               backend:
                service:
                  name: home-svc
                  port:
                    number: 8123

我已将实际名称替换FQDN为属于 的名称example.com。 :-)

几个关键点:

家庭助理支持 TLS 加密。

因此,我的第一份工作是创建一个 Let's Encrypt 证书,我将其命名为homeassistant-tls。它有相关的秘密homeassistant-tls-secret。

接下来是从密钥中提取证书和密钥homeassistant-tls-secret,并使用它来创建文件fullchain.pem并privkey.pem在 ConfigMap 中home-config。

这些文件包含 base64 解码的证书和密钥。

然后,证书和密钥文件存储在/ssl容器内的文件夹中,这会返回到 ConfigMap 中定义的最后一个重要文件:configuration.yaml。

为了启用 TLS 加密,我们需要将以下行添加到httpconfiguration.yaml 部分:

  ssl_certificate: /ssl/fullchain.pem
  ssl_key: /ssl/privkey.pem

我尝试调用文件tls.crt和tls.key,但显然家庭助理不喜欢它。 :-)

我唯一确定的是文件必须是 PEM 编码的。

运行剧本后,我得到以下输出:

root@central:~# kubectl get svc -n home-system
NAME       TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)          AGE
home-svc   LoadBalancer   10.43.23.186   192.168.0.203   8123:30630/TCP   81m

root@central:~# kubectl get ingress -n home-system
NAME            CLASS   HOSTS                       ADDRESS         PORTS     AGE
homeassistant   nginx   homeassistant.example.com   192.168.0.200   80, 443   85m

当我输入地址:https://192.168.0.203:8123/或https://homeassistant.example.com在浏览器中时,该网站正在运行。

但是,当我检查相关证书时,我得到以下信息:

  • https://192.168.0.203:803(LoadBalancer) 指向 Let's Encrypt 证书,据我所知,这是因为我在文件/ssl夹中定义了证书。
  • https://homeassistant.example.com(Ingress) 指向通用 Kubernetes 集群证书。

那么我该如何Ingress使用正确的证书呢? :-)

更改为secretName肯定不起作用。 :-)homeassist-tls-secret

kubernetes
  • 2 个回答
  • 42 Views
Martin Hope
Lasse Michael Mølgaard
Asked: 2024-05-20 04:11:55 +0800 CST

在 Kubernetes 中连接到 MongoDB 时从 Unifi 网络应用程序获取权限错误

  • 5

我在由 Raspberry 4 和 Raspberry 5 节点混合组成的集群服务器上运行 K3S Kubernetes。

我想在集群服务器上安装Unifi 网络应用程序,并且已经通过使用 Ansible进行了相当深入的配置MetalLB。LonghornCert-Manager

我正在使用linuxserver.io 的Docker 映像作为我的集群服务器,它要求我安装一个包含的单独 pod MongoDB。

在线搜索如何安装 MongoDB 给了我以下 Ansible 文件:

- name: Generate MongoDB secrets
  kubernetes.core.k8s:
    state: present
    definition:
      apiVersion: v1
      kind: Secret
      metadata:
        name: mongodb-secret
        namespace: default
      type: Opaque
      data:
        password: VmVyeVNlY3JldFBhc3NvcmQ= # "VerySecretPassword" encoded in Base64

- name: Create Unifi DB init script
  kubernetes.core.k8s:
    state: present
    definition:
      apiVersion: v1
      kind: ConfigMap
      metadata:
        name: mongodb-init-script
        namespace: default
      data:
        init-script.js: |-
          db.getSiblingDB("unifi-db").createUser({user: "unifi", pwd: "unifi", roles: [{role: "dbOwner", db: "unifi-db"}]});
          db.getSiblingDB("unifi-db_stat").createUser({user: "unifi", pwd: "unifi", roles: [{role: "dbOwner", db: "unifi-db_stat"}]});

- name: Create MongoDB service
  kubernetes.core.k8s:
    state: present
    definition:
      apiVersion: v1
      kind: Service
      metadata:
        name: mongodb-svc
        namespace: default
        labels: 
          app: mongodb
      spec:
        type: ClusterIP
        ports:
        - protocol: TCP
          port: 27017
          targetPort: 27017
        selector:
          app: mongodb

- name: Create MongoDB statefull set
  kubernetes.core.k8s:
    state: present
    definition:
      apiVersion: apps/v1
      kind: StatefulSet
      metadata:
        name: mongodb
        namespace: default
        labels:
          app: mongodb
      spec:
        serviceName: mongodb-svc
        replicas: 1
        selector:
          matchLabels:
            app: mongodb
        template:
          metadata:
            labels:
              app: mongodb
          spec:
            containers:
            - name: mongodb
              image: mongo:4.4.18 # Do NOT set it to 'latest'. I'll explain below.
              ports:
              - containerPort: 27017
              env:
              - name: MONGO_INITDB_ROOT_USERNAME
                value: admin

              - name: MONGO_INITDB_ROOT_PASSWORD
                valueFrom:
                  secretKeyRef:
                    name: mongodb-secret
                    key: password

              volumeMounts:
                - name: mongodb-data
                  mountPath: /data/db

        volumeClaimTemplates:
        - metadata:
            name: mongodb-data
          spec:
            accessModes: ["ReadWriteOnce"]
            resources:
              requests:
                storage: 1Gi

- name: Initialize MongoDB
  kubernetes.core.k8s:
    state: present
    definition:
      apiVersion: batch/v1
      kind: Job
      metadata:
        name: mongodb-init-job
        namespace: default
      spec:
        template:
          metadata:
            name: mongodb-init-pod
          spec:
            restartPolicy: OnFailure
            containers:
            - name: mongodb-init-container
              image: mongo:4.4.18 # Again: Do NOT set it to 'latest'.
              command: [ "mongo", "--host", "mongodb-0.mongodb-svc.default.svc.cluster.local", "--authenticationDatabase", "admin", "--username", "admin", "--password", "$(MONGO_INITDB_ROOT_PASSWORD)", "/mongo-init-script/init-script.js" ]
              
              env:
              - name: MONGO_INITDB_ROOT_PASSWORD
                valueFrom:
                  secretKeyRef:
                    name: mongodb-secret
                    key: password
              volumeMounts:
              - name: mongo-init-script
                mountPath: /mongo-init-script
            volumes:
            - name: mongo-init-script
              configMap:
                name: mongodb-init-script

该部分运行良好。

输出kubectl logs mongodb-init-job-f5f54如下:

MongoDB shell version v4.4.18
connecting to: mongodb://mongodb-0.mongodb-svc.default.svc.cluster.local:27017/?authSource=admin&compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("39ad2f51-07a9-4e67-8c5b-68f6fff92872") }
MongoDB server version: 4.4.18
Successfully added user: {
        "user" : "unifi",
        "roles" : [
                {
                        "role" : "dbOwner",
                        "db" : "unifi-db"
                }
        ]
}
Successfully added user: {
        "user" : "unifi",
        "roles" : [
                {
                        "role" : "dbOwner",
                        "db" : "unifi-db_stat"
                }
        ]
}

这意味着我可以以adminMongoDB 用户身份登录并创建具有数据库访问权限的unifi密码。unifiunifi-db

我还知道可以通过将数据库主机设置为mongodb-0.mongodb-svc.default.svc.cluster.local使用端口来通过 DNS 访问它27017。

我选择安装 MongoDB 4.4.18 版本的原因是,尽管 Unifi 网络应用程序支持高达 7.0 版本,但 MongoDB 对 Raspberry Pi 板的支持情况并不相同。

MongoDB 只能在 Raspberry Pi 上运行到 4.4.18 版本。

接下来是让我的集群服务器上运行 Unifi 网络应用程序。

我正在使用以下任务来执行此操作:

---
- name: Define storage space for Unifi
  kubernetes.core.k8s:
    state: present
    definition:
      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: unifi-cluster-pvc
        namespace: default
      spec:
        accessModes:
          - ReadWriteOnce
        storageClassName: longhorn
        resources:
          requests:
            storage: 5Gi

- name: Add unifi deployment
  kubernetes.core.k8s:
    state: present
    definition:
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: unifi
        namespace: default
        labels:
          app: unifi
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: unifi
        template:
          metadata:
            labels:
              app: unifi
          spec:
            volumes:
            - name: unifi-config
              persistentVolumeClaim:
                claimName: unifi-cluster-pvc
            containers:
            - name: unifi
              image: lscr.io/linuxserver/unifi-network-application:latest
              ports:
                - containerPort: 3478
                  protocol: UDP
                - containerPort: 10001
                  protocol: UDP
                - containerPort: 5514
                  protocol: UDP
                - containerPort: 8080
                - containerPort: 8443
                - containerPort: 8843
                - containerPort: 8880
                - containerPort: 6789
              volumeMounts:
              - name: unifi-config
                mountPath: /config
              env:
                - name: PUID
                  value: "1000"
                - name: GUID
                  value: "1000"
                - name: MONGO_USER
                  value: "unifi"
                - name: MONGO_PASS
                  value: "unifi"
                - name: MONGO_HOST
                  value: "mongodb-0.mongodb-svc.default.svc.cluster.local"
                - name: MONGO_PORT
                  value: "27017"
                - name: MONGO_DBNAME
                  value: "unifi-db"
                - name: MONGO_TLS
                  value: "false"

- name: Define unifi service ports
  kubernetes.core.k8s:
    state: present
    definition:
      apiVersion: v1
      kind: Service
      metadata:
        name: unifi
        namespace: default
      spec:
        type: LoadBalancer
        selector:
          app: unifi
        ports:
          - name: "8080"
            port: 8080
            targetPort: 8080
          - name: "8443"
            port: 8443
            targetPort: 8443
          - name: "8843"
            port: 8843
            targetPort: 8843
          - name: "8880"
            port: 8880
            targetPort: 8880
          - name: "6789"
            port: 6789
            targetPort: 6789
          - name: "3478"
            port: 3478
            protocol: UDP
            targetPort: 3478
          - name: "10001"
            port: 10001
            protocol: UDP
            targetPort: 10001
          - name: "5514"
            port: 5514
            protocol: UDP
            targetPort: 5514

- name: Add unifi ingress
  kubernetes.core.k8s:
    state: present
    definition:
      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: unifi
        namespace: default
        annotations:
          nginx.ingress.kubernetes.io/backend-protocol: HTTPS
          cert-manager.io/cluster-issuer: letsencrypt-staging
          cert-manager.io/acme-challenge-type: dns01
      spec:
        ingressClassName: nginx
        tls:
        - hosts:
          - unifi.example.com
          secretName: unifi-tls
        rules:
        - host: 'unifi.example.com'
          http:
            paths:
            - path: /
              pathType: Prefix
              backend:
                service:
                  name: unifi
                  port:
                    number: 8443

运行该命令kubectl get pods得到以下输出:

NAME                     READY   STATUS      RESTARTS   AGE
mongodb-0                1/1     Running     0          64m
unifi-5dcdbfb6d9-8wbbp   1/1     Running     0          64m
mongodb-init-job-f5f54   0/1     Completed   2          64m

unifi-db我可以使用以下命令登录数据库:kubectl exec mongodb-0 -it -- mongo -u unifi -p unifi unifi-db

命令:show collections

除其他外,还给我以下信息:

account
admin
alarm
crashlog
dashboard
device
...

到目前为止,一切都很好。

然而,我无法启动并运行 Unifi 网络应用程序的网站。

该命令的输出kubectl log unifi-5dcdbfb6d9-8wbbp包括以下消息:

Error creating bean with name 'statDbService' 
defined in com.ubnt.service.DatabaseSpringContext: 
Command failed with error 13 (Unauthorized): 'not 
authorized on unifi-db_stat to execute command { 
listCollections: 1, cursor: {}, nameOnly: true, $db: 
"unifi-db_stat", lsid: { id: UUID("99b4d07f-b3f3-49c9-9979-dbdd27445881") 
} }' on server mongodb-0.mongodb-svc.default.svc.cluster.local:27017. 
The full response is {"ok": 0.0, "errmsg": "not authorized on unifi-db_stat 
to execute command { listCollections: 1, cursor: {}, nameOnly: true, $db: 
\"unifi-db_stat\", lsid: { id: UUID(\"99b4d07f-b3f3-49c9-9979-dbdd27445881\") 
} }", "code": 13, "codeName": "Unauthorized"}

我该如何解决这个问题?

阅读有关 MongoDB 中角色分配工作原理的文档后,我发现将用户的角色设置为dbOwner基本上是一种全通行证,因为它将readWrite、dbAdmin和的角色组合userAdmin成一个角色。

您获得的权限之一是listCollections,上面的错误代码中引用了该权限。

那么发生了什么?

kubernetes
  • 1 个回答
  • 43 Views
Martin Hope
Lasse Michael Mølgaard
Asked: 2024-05-02 18:09:19 +0800 CST

如何使用 Ansible 在 Kubernetes 中创建持久卷声明?

  • 5

我正在尝试使用 Ansible 在 Kubernetes 集群服务器 (K3S) 上安装 Unifi,但在尝试定义持久卷声明时遇到了麻烦。

我正在使用Kubernetes.Core 模块,我将我的任务定义为:

- name: Define storage space for Unifi
  kubernetes.core.k8s:
    state: present
    definition:
      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: unifi-cluster-pvc
        namespace: default
      spec:
        accessModes:
          - ReadWriteOnce
        storageClassName: longhorn
      resources:
        requests:
          storage: 100Mi

但是,当我运行我的剧本时,我收到以下错误:

TASK [unifi : Define storage space for Unifi] 
***********************************************************************
fatal: [central.example.com]: FAILED! => {"changed": false, "msg": 
"Failed to create object: b'{\"kind\":\"Status\",\"apiVersion\":\"v1\",
\"metadata\":{},\"status\":\"Failure\",\"message\":\"PersistentVolumeClaim 
\\\\\"unifi-cluster-pvc\\\\\" is invalid: spec.resources[storage]: Required 
value\",\"reason\":\"Invalid\",\"details\":{\"name\":\"unifi-cluster-pvc\",
\"kind\":\"PersistentVolumeClaim\",\"causes\":[{\"reason\":\"FieldValueRequired\",
\"message\":\"Required value\",\"field\":\"spec.resources[storage]\"}]},\"code\":422}\\n'", 
"reason": "Unprocessable Entity"}

有谁可以解释发生了什么事吗?

因为如果我创建一个名为test.yml以下内​​容的 yaml 文件:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: unifi-cluster-pvc
  namespace: default
spec:
  accessModes:
  - ReadWriteOnce
  storageClassName: longhorn
  resources:
    requests:
      storage: 100Mi

并运行命令:kubectl apply -f test.yml在我的控制器上

然后我收到回消息:

persistentvolumeclaim/unifi-cluster-pvc created
kubernetes
  • 1 个回答
  • 43 Views
Martin Hope
Lasse Michael Mølgaard
Asked: 2024-03-30 04:17:52 +0800 CST

Kubernetes:无法从默认命名空间访问 cert-manager 命名空间中的资源

  • 4

我正在尝试了解 Kubernetes 的工作原理,因此我使用快速入门指南K3S创建了自己的集群。

然后我使用Helm 指南安装了 Cert Manager 。

我想为我的集群使用 Let's Encrypt 证书,并dns01通过我的 DNS 提供商 Simply.com 使用 webhook 来验证它们。

这可以通过使用此处找到的 Webhook 来完成:

https://github.com/RunnerM/simply-dns-webhook

目前我正在测试是否可以使用他们的临时服务器从 Let's Encrypt 获得证书。

letsencrypt-staging.yaml我制作了包含以下内容的Yaml 文件ClusterIssuer:

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-staging
  namespace: default
spec:
  acme:
    email: [email protected]
    privateKeySecretRef:
      name: letsencrypt-staging-key
    server: https://acme-staging-v02.api.letsencrypt.org/directory
    solvers:
    - dns01:
        webhook:
          groupName: com.github.runnerm.cert-manager-simply-webhook
          solverName: simply-dns-solver
          config:
            secretName: simply-credentials # notice the name
      selector:
        dnsZones:
        - 'cluster.example.com'
        - '*.cluster.example.com'

我的配置文件基本上是从 RunnerM GitHub 页面上找到的示例中逐字复制粘贴的。

为了颁发证书,我创建了一个名为certificate-test.yaml以下内​​容的 Yaml 文件:

apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: test-certificate
spec:
  dnsNames:
  - test.cluster.example.com
  issuerRef:
    name: letsencrypt-staging
    kind: ClusterIssuer

  secretName: test-certificate-tls

然后我应该能够通过使用以下命令获得颁发的证书:

kubectl apply -f letsencrypt-staging.yaml
kubectl apply -f certificate-test.yaml

但是我没有收到颁发的证书。

运行时kubectl describe challenge test-certificate-1-1965387138-1295925723我收到以下错误消息:

...
Status:
  Presented:   false
  Processing:  true
  Reason:      secrets "simply-credentials" is forbidden: User "system:serviceaccount:default:my-simply-dns-webhook" cannot get resource "secrets" in API group "" in the namespace "cert-manager"
  State:       pending
E
...

我发现 Simply DNS Webhookmy-simply-dns-webhook正在命名空间中运行default,并且 Simply DNS 凭据存储在cert-manager命名空间中。

那么如何允许 Simply DNS webhook 访问 cert-manager 命名空间中的资源呢?

附加信息

运行该命令kubectl get clusterrolebindings会提供以下信息:

my-simply-dns-webhook:secret-access                    ClusterRole/my-simply-dns-webhook:secret-access                    76s
simply-dns-webhook:challenge-management                ClusterRole/simply-dns-webhook:challenge-management                76s
my-simply-dns-webhook:domain-solver                    ClusterRole/my-simply-dns-webhook:domain-solver                    76s
my-simply-dns-webhook:flow-control                     ClusterRole/my-simply-dns-webhook:flow-control                     76s
my-simply-dns-webhook:auth-delegator                   ClusterRole/system:auth-delegator                                  76s

输出kubectl get clusterrole my-simply-dns-webhook:secret-access给出以下结果:

Name:         my-simply-dns-webhook:secret-access
Labels:       app=simply-dns-webhook
              app.kubernetes.io/managed-by=Helm
              chart=simply-dns-webhook-1.5.4
              heritage=Helm
              release=my-simply-dns-webhook
Annotations:  meta.helm.sh/release-name: my-simply-dns-webhook
              meta.helm.sh/release-namespace: default
PolicyRule:
  Resources  Non-Resource URLs  Resource Names  Verbs
  ---------  -----------------  --------------  -----
  secrets.*  []                 []              [get]

该命令kubectl describe clusterrolebindings my-simply-dns-webhook:secret-access给出输出:

Name:         my-simply-dns-webhook:secret-access
Labels:       app=simply-dns-webhook
              app.kubernetes.io/managed-by=Helm
              chart=simply-dns-webhook-1.5.4
              heritage=Helm
              release=my-simply-dns-webhook
Annotations:  meta.helm.sh/release-name: my-simply-dns-webhook
              meta.helm.sh/release-namespace: default
Role:
  Kind:  ClusterRole
  Name:  my-simply-dns-webhook:secret-access
Subjects:
  Kind            Name                   Namespace
  ----            ----                   ---------
  ServiceAccount  my-simply-dns-webhook  cert-manager

那么我错过了什么?

kubernetes
  • 1 个回答
  • 58 Views
Martin Hope
Lasse Michael Mølgaard
Asked: 2022-04-18 12:17:37 +0800 CST

Freeradius 与 dhcp 服务器:调用 perl 模块返回错误

  • 1

这是我之前的问题的延续,即从 Freeradius DHCP 服务器实现结合 Strongswan VPN 服务器发送静态路由。

在使用 tcpdump 和 Wireshark 调试 Freeradius 时,我发现我可以通过向dhcp 服务器配置文件的我的和部分添加DHCP-Classless-Static-Route和DHCP-Site-specific-25(又名 Microsoft 静态路由)选项来从 Freeradius DHCP 服务器发送无类静态路由。DHCP-DiscoverDHCP-Request

但是:如果我将默认网关设置为Strongswan 文档0.0.0.0建议的那样,Microsoft VPN 客户端似乎不接受静态路由。

至少我在使用route print -4.

此外,当我0.0.0.0通过 VPN 接口用作标准网关时,我无法在 Windows 客户端上手动添加路由。

然而:

假设我想192.168.200.0/24通过 VPN 访问子网,我的 VPN 服务器将地址分配192.168.201.2/24给我的 Windows 客户端。然后实际上可以通过使用 windows 命令通过 192.168.201.2 访问子网 192.168.200.0/24 来在 windows 客户端创建静态路由:

route add 192.168.200.0 mask 255.255.255.0 192.168.201.2

我知道它看起来有点奇怪,但我可以 ping192.168.200.0子网上的任何主机,所以只要它有效,我就很高兴。:-)

但是:如果我可以通过从我的 VPN 服务器通告路由而不是在所有 VPN 客户端上手动进行,我会更高兴。:-)

这意味着我必须对 Freeradius 中的 DHCP 配置进行一些动态编程。在我的情况下,这意味着我必须在 DHCP-Discover 和 DHCP-request 中引用 perl 模块,该模块获取分配的客户端 vpn ip 地址,将其转换为八位字节并将其与也以八位字节形式给出的静态路由组合。

一个例子:

子网192.168.200.0/24将被编码为0x18c0a8c8首先编码子网掩码。

客户端192.168.201.2/24将被编码,0xc0a8c902因为它只是将 IP 地址中的每个数字转换为十六进制。

路由的最终编码将是:0x18c0a8c8c0a8c902因为它只是两个字符串的连接。

然后我必须使用update reply以下代码:

  update reply {
    &DHCP-Classless-Static-Route = 0x18c0a8c8c0a8c902
    &DHCP-Site-specific-25 = 0x18c0a8c8c0a8c902
  }

如果还有更多路由,则所有路由将连接成一个长字符串。

棘手的部分:

假设您具有freeradius/3.0/sites-available/dhcp文件中的 Freeradius DHCP 服务器的默认配置。

DHCP-Discover 和 DHCP-Request 文件的一般结构如下:

dhcp DHCP-Request {
  update reply {
    &DHCP-Message-Type = DHCP-Ack
  }

  update reply {
    # General DHCP options, such as default GW, DNS, IP-address lease time etc.
  }

  update control {
    &Pool-Name := "vpn_pool"
  }

  dhcp_sqlippool

  ok
}

然后据我所知,我需要在dhcp_sqlippool被调用之后和返回之前调用我的 perl 模块ok,因为dhcp_sqlippool它是将 ipaddress 分配给 VPN 客户端的模块。

这意味着我的版本将类似于:

dhcp DHCP-Request {
  update reply {
    &DHCP-Message-Type = DHCP-Ack
  }

  update reply {
    # General DHCP options, such as default GW, DNS, IP-address lease time etc.
  }

  update control {
    &Pool-Name := "vpn_pool"
  }

  dhcp_sqlippool

  perl

  # If perl module returned no error
  if(ok) {
    update reply {
      # Perl-Route contains a hex encoded string with all routes.
      &DHCP-Classless-Static-Route = Perl-Route
      &DHCP-Site-specific-25 = Perl-Route      
    }
  }

  # Not sure if this one is needed?
  update reply {
    &DHCP-End-Of-Options = 255
  }

  ok
}

为了使其工作,我必须在freeradius/3.0/mods-enabled文件夹下启用 perl 并修改文件名以freeradius/3.0/mods-enabled/perl将其指向我的 perl 模块。比如:

filename = ${modconfdir}/${.:instance}/dhcp/Options.pm

但是我如何以正确的方式引用对 perl 的调用呢?

我以为我必须启用该行并在我的 perl 模块func_post_auth = post_auth中freeradius/3.0/mods-enabled/perl创建一个sub post_auth部分来处理来自 Freeradius 的调用,但据我在日志中看到的,我在 Freeradius 中收到以下错误:

(8) perl: perl_embed:: module = /etc/freeradius/3.0/mods-config/perl/dhcp/Options.pm , 
func = post_auth exit status= Undefined subroutine &main::post_auth called.
...
(8)     [perl] = fail
(8)   } # dhcp DHCP-Discover = fail

那么我没有看到的是什么?

perl freeradius dhcp-server
  • 1 个回答
  • 108 Views
Martin Hope
Lasse Michael Mølgaard
Asked: 2022-02-21 06:10:24 +0800 CST

无法在 Strongswan 中使用拆分隧道

  • 0

我正在尝试为 VPN 拆分隧道设置 Strongswan。

我想要的只是子网10.88.0.0/16,10.0.200.0/24可以通过 VPN 隧道访问。其他一切都default gateway通过网络处理。

所有客户端都分配了一个属于该10.0.201.0/24子网的 IP 地址。

在我的配置文件中,我有以下内容:

# Default login method
eap-defaults {
  remote {
   auth = eap-radius
   id = %any
   eap_id = %any
  }
}

connections
{
  conn-unix : conn-defaults, eap-defaults {
    children {
      net {
        local_ts = 10.0.200.0/24, 10.88.0.0/16
      }

      esp_proposals = aes128gcm128-x25519
    }

    pools = IkeVPN-ipv4
    proposals = aes128-sha256-x25519
  }

  conn-windows : conn-defaults, eap-defaults {
    children {
      net {
        local_ts = 10.0.200.0/24, 10.88.0.0/16
      }

      esp_proposals = aes256-sha256-prfsha256-modp1024
    }

    proposals = aes256-sha256-prfsha256-modp1024
    pools = IkeVPN-ipv4
  }
}

pools
{
  IkeVPN-ipv4 {
    addrs = 10.0.201.0/24
    dns = 10.0.88.2
  }
}

当我通过 VPN 登录时,可以 ping 属于10.88.0.0/16and的主机10.0.200.0/24,所以我知道我可以使用 VPN 隧道。

然而:

如果我在仍然连接到 VPN 的同时尝试访问 Internet 上的任何其他资源,那么我什至无法 ping 属于该资源的 IP 地址。

在我的 Windows 计算机上的路由表中,我可以找到以下条目:

连接到 VPN 服务器的 Windows 客户端的部分路由表

我知道,当您有两条路由到给定子网(如0.0.0.0/0路由表中)时,任何具有最低度量的规则都会获胜,并使用该规则转发流量。

但是我不希望 VPN 服务器通过 VPN 安装默认路由,而只是告诉子网10.88.0.0/16并且10.0.200.0/24必须通过 VPN 路由。

我想要的是我看到一个更接近于此的路由表,而不必在每个 VPN 客户端上手动编辑路由表:

所需的路由表

那么我该怎么做呢?

strongswan split-tunneling split-tunnel
  • 1 个回答
  • 434 Views
Martin Hope
Lasse Michael Mølgaard
Asked: 2022-02-06 21:38:28 +0800 CST

将 Jinja 变量插入带引号的字符串中

  • 1

我正在构建一个 Podman 容器,该容器使用 Ansible 运行具有 Bind9 和 Freeradius 支持的 Samba Active Directory,但遇到了一些障碍。

Samba 在我的容器中使用 DLZ_BIND 作为后端运行良好,但我需要将 Freeradius 集成到容器中,这样我才能支持通过 VPN 登录。

我正在尝试在以下行中模板化/etc/freeradius/3.0/mods-available/mschap:

ntlm_auth = "/usr/bin/ntlm_auth --allow-mschapv2 
  --request-nt-key 
  --username={mschap:User-Name} 
  --domain={{ ad_info.netbios_domain }} 
  --challenge=%{%{mschap:Challenge}:-00} 
  --nt-response=%{%{mschap:NT-Response}:-00}"

为了练习,您可以假设 的{{ ad_info.netbios_domain }}值为EXAMPLE。

它是文件中唯一使用 Jinja 变量的地方。

然而,运行 ansible-playbook 让 Ansible 在尝试对文件进行模板化时基本上会在我面前炸毁。

我想这是因为 Jinja 变量被插入到一个带引号的字符串中?因为包含以下行的 BASH shell 脚本不会在 ansible 中崩溃:

SAMBA_ADMIN_PASSWORD="{{ ad_info.admin_password }}"

那么当你有一个带引号的字符串时,使用 Jinja 的正确方法是什么?

编辑

我制作了一个只包含有问题的行的模板,并从 ansible 得到了以下错误:

failed: [myhost.example.com] (item=etc/freeradius/3.0/mods-available/mschap) => 
{
  "ansible_loop_var": "item", 
  "changed": false, "item": 
  "etc/freeradius/3.0/mods-available/mschap-jinja", 
  "msg": "AnsibleError: template error while templating string: tag name expected. 

  String: ntlm_auth = \"/usr/bin/ntlm_auth 
    --allow-mschapv2 
    --request-nt-key 
    --username={mschap:User-Name} 
    --domain={{ ad_info.netbios_domain }} 
    --challenge=%{%{mschap:Challenge}:-00} 
    --nt-response=%{%{mschap:NT-Response}:-00}\"
"}
ansible jinja
  • 1 个回答
  • 1691 Views
Martin Hope
Lasse Michael Mølgaard
Asked: 2021-06-14 13:20:36 +0800 CST

iPhone 用户不连接 StrongSwan VPN,而 Android 和 Windows 10 用户可以?

  • 2

我有一个 StrongSwan VPN,由于某种我不知道的原因,它无法将 iOS 用户连接到我的 VPN 服务器。

一些快速说明:

  • 我的 StrongSwan 服务器是连接到我的网络的 VPN 客户端的前端。我用于WireGuard我的后端站点到站点路由。

  • 所有 StrongSwan VPN 用户都经过FreeRadius服务器验证。

  • StrongSwan 客户端在子网上被分配一个 IP 192.168.201.0/24,而 WireGuard 主干网络在192.168.200.0/24子网上运行。

  • 所有客户端也都获得了一个公共 IPv6 地址,该地址属于分配给我的 /48 子网。

我在 Ubuntu 20.04 上运行 StrongSwan,我的配置文件位于该/etc/swanctl/config/文件夹中,由于文件名以.conf.

内容如下:

# Default VPN server settings for all connections
conn-defaults {
    local_addrs = PUBLIC_IPV4, PUBLIC_IPV6

    local {
      auth = pubkey
      certs = vpn-ecdsa.cer
      id = vpn.example.com
    }

    version = 2
    send_certreq = no
    send_cert = always
    unique = never
    fragmentation = yes
    encap = yes
    dpd_delay = 60s

    rekey_time = 0s
}

# Default login method
eap-defaults {
  remote {
   auth = eap-radius
   id = %any
   eap_id = %any
  }
}

connections
{
  # Generic Android configuration that is extended further down.
  #
  # Works with StrongSwan VPN client for Android
  conn-unix : conn-defaults, eap-defaults {
    children {
      net {
        local_ts = 0.0.0.0/0, ::/0
      }

      net-unix : child-defaults {
      }

      esp_proposals = aes128gcm128-x25519
    }

    proposals = aes128-sha256-x25519
  }

  # All Windows klients matches this rule as username validation 
  # is done by 'eap_start = yes' in strongswan.conf. 
  #
  # Works with Windows 10 built-in VPN client.
  conn-windows : conn-defaults, eap-defaults {
    children {
      net {
        local_ts = 0.0.0.0/0, ::/0
      }

      esp_proposals = aes256-sha256-prfsha256-modp1024
    }

    proposals = aes256-sha256-prfsha256-modp1024
    pools = IkeVPN-site-ipv4, IkeVPN-site-ipv6

  }

  # A very similar configuration to Windows clients 
  # configuration, except iOS uses 2048 bit keys, 
  # while Windows uses 1024 bit keys.
  #
  # Does NOT work in its current state.
  conn-ios : conn-defaults, eap-defaults {
    children {
      net {
        local_ts = 0.0.0.0/0, ::/0
      }

      esp_proposals = aes256-sha2_256
      pools = IkeVPN-site-ipv4, IkeVPN-site-ipv6

    }

    proposals = aes256-sha256-prfsha256-modp2048
  }

  # Android users is matched against this connection as they are 
  # running the app StrongSwan VPN client. Username is passed in the
  # 'id' field to StrongSwan VPN server.
  conn-unix-site : connections.conn-unix {
    remote {
      id = *@site.example.com
    }
    pools = IkeVPN-site-ipv4, IkeVPN-site-ipv6
  }
}

pools
{
   IkeVPN-site-ipv4 {
      addrs = 192.168.201.0/24
      dns = 192.168.200.1
   }

   IkeVPN-site-ipv6 {
      addrs = 2001:db8:cafe::/97
      dns = 2001:db8::1
   }
}

我的配置是使用以下网页给出的结构创建的:

https://wiki.strongswan.org/projects/strongswan/wiki/Strongswanconf#Referencing-other-Sections

我使用它的原因是避免在我的所有连接配置文件中重复相同的配置设置。

如果您不熟悉此设置,conn-ios则应将以下配置视为等效:

conn-ios {
   # Obtained from conn-default
   local_addrs = PUBLIC_IPV4, PUBLIC_IPV6

   local {
      auth = pubkey
      certs = vpn-ecdsa.cer
      id = vpn.example.com
   }

   version = 2
   send_certreq = no
   send_cert = always
   unique = never
   fragmentation = yes
   encap = yes
   dpd_delay = 60s

   rekey_time = 0s

   # Obtained from eap-defaults
   remote {
      auth = eap-radius
      id = %any
      eap_id = %any
   }

   # Obtained from original conn-ios profile above.
   children {
      net {
         local_ts = 0.0.0.0/0, ::/0
      }

      esp_proposals = aes256-sha2_256
      pools = IkeVPN-site-ipv4, IkeVPN-site-ipv6
   }

   proposals = aes256-sha256-prfsha256-modp2048
}

本conn-default节中列出的服务器证书是使用 Acme.sh 从 Let's Encrypt 获得的 ECDSA 证书。

proposalsiOS 配置中的加密值esp_proposals取自https://wiki.strongswan.org/projects/strongswan/wiki/AppleClients中的提示。

在测试 Android 或 Windows 用户的所有组合时,连接没有任何问题,但是当有人尝试使用 iPhone 登录时,连接就会停止。

iPhone尝试连接时的日志输出如下:

10[IKE] CLIENT_IPV4 is initiating an IKE_SA
10[CFG] received proposals: IKE:AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_2048, IKE:AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/ECP_256, IKE:AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_1536, IKE:AES_CBC_128/HMAC_SHA1_96/PRF_HMAC_SHA1/MODP_1024, IKE:3DES_CBC/HMAC_SHA1_96/PRF_HMAC_SHA1/MODP_1024
10[CFG] configured proposals: IKE:AES_CBC_128/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/CURVE_25519
10[IKE] no matching proposal found, trying alternative config
10[CFG] received proposals: IKE:AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_2048, IKE:AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/ECP_256, IKE:AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_1536, IKE:AES_CBC_128/HMAC_SHA1_96/PRF_HMAC_SHA1/MODP_1024, IKE:3DES_CBC/HMAC_SHA1_96/PRF_HMAC_SHA1/MODP_1024
10[CFG] configured proposals: IKE:AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_1024
10[IKE] no matching proposal found, trying alternative config
10[CFG] selected proposal: IKE:AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_2048
10[IKE] remote host is behind NAT
10[ENC] generating IKE_SA_INIT response 0 [ SA KE No N(NATD_S_IP) N(NATD_D_IP) N(FRAG_SUP) N(CHDLESS_SUP) N(MULT_AUTH) ]
10[NET] sending packet: from PUBLIC_IPV4[500] to CLIENT_IPV4[6452] (456 bytes)
06[NET] received packet: from CLIENT_IPV4[13549] to PUBLIC_IPV4[4500] (512 bytes)
06[ENC] unknown attribute type INTERNAL_DNS_DOMAIN
06[ENC] parsed IKE_AUTH request 1 [ IDi N(INIT_CONTACT) IDr CPRQ(ADDR MASK DHCP DNS ADDR6 DHCP6 DNS6 DOMAIN) N(ESP_TFC_PAD_N) N(NON_FIRST_FRAG) SA TSi TSr N(MOBIKE_SUP) ]
06[CFG] looking for peer configs matching PUBLIC_IPV4[vpn.example.com]...CLIENT_IPV4[PRIVATE_CLASS_A_ADDRESS]
06[CFG] selected peer config 'conn-ios'
06[IKE] initiating EAP_IDENTITY method (id 0x00)
06[IKE] received ESP_TFC_PADDING_NOT_SUPPORTED, not using ESPv3 TFC padding
06[IKE] peer supports MOBIKE
06[IKE] authentication of 'vpn.example.com' (myself) with ECDSA-256 signature successful
06[IKE] sending end entity cert "CN=vpn.example.com"
06[IKE] sending issuer cert "C=US, O=Let's Encrypt, CN=R3"
06[ENC] generating IKE_AUTH response 1 [ IDr CERT CERT AUTH EAP/REQ/ID ]
06[ENC] splitting IKE message (2816 bytes) into 3 fragments
06[ENC] generating IKE_AUTH response 1 [ EF(1/3) ]
06[ENC] generating IKE_AUTH response 1 [ EF(2/3) ]
06[ENC] generating IKE_AUTH response 1 [ EF(3/3) ]
06[NET] sending packet: from PUBLIC_IPV4[4500] to CLIENT_IPV4[13549] (1236 bytes)
06[NET] sending packet: from PUBLIC_IPV4[4500] to CLIENT_IPV4[13549] (1236 bytes)
06[NET] sending packet: from PUBLIC_IPV4[4500] to CLIENT_IPV4[13549] (500 bytes)
11[JOB] deleting half open IKE_SA with CLIENT_IPV4 after timeout

iPhone 用户使用以下设置使用内置 VPN 客户端进行连接:

  • 类型 IKEv2

  • 描述:VPN服务器

  • 服务器:vpn.example.com

  • 远程 ID:vpn.example.com

  • 本地标识:空白

  • 用户名和密码验证。

  • 用户名:[email protected]

  • 密码:ItIsASecret

有谁知道为什么 iOS 用户在加载conn-ios配置文件时连接会停止?

更新 我们起飞了!:-)

根据@ecdsa 的建议,我已将证书切换为 2048 位 RSA 证书。

我的 Radius 服务器被调用。用户身份验证成功,客户端获得分配 IP 地址。我很开心。:-)

我conn-ios现在的配置是:

  conn-ios : conn-defaults, eap-defaults {

    # Overriding defaults from 'conn-default'
    local {
      auth = pubkey
      certs = vpn-rsa.cer
      id = vpn.example.com
    }

    children {
      net {
        local_ts = 0.0.0.0/0, ::/0
      }

      esp_proposals = aes256-sha256
    }

    pools = IkeVPN-site-ipv4, IkeVPN-site-ipv6
    proposals = aes256-sha256-prfsha256-modp2048
  }

其他一切都与我的初始配置一样。

iphone strongswan apple-ios ikev2
  • 1 个回答
  • 1319 Views
Martin Hope
Lasse Michael Mølgaard
Asked: 2021-06-02 02:06:33 +0800 CST

当来自 Windows VPN 客户端时,半径身份验证在 Strongswan 中不起作用?

  • 0

我的 strongswan VPN 服务器正在针对本地 Freeradius 服务器对 VPN 客户端进行身份验证。

所有用户日志都被代理到远程 radius 服务器,该服务器根据 Samba Active Directory 服务器验证用户。

但是我遇到了一些问题。

以下部分适用于使用 Strongswan VPN 客户端的 Android 用户:

connections
{
  rw-eap {
    local_addrs = SERVER_PUBLIC_IPV4, SERVER_PUBLIC_IPV6

    local {
      auth = pubkey
      certs = example-ecdsa.cer
      id = vpn.example.com
    }
    remote-android {
      auth = eap-radius
      id = *@example.com
    }
  }
}

监视 Freeradius 的输出显示如下内容:

(5) Received Access-Request Id 135 from 192.168.200.1:47851 to 192.168.200.1:1812 length 193
(5)   User-Name = "[email protected]"
(5)   NAS-Port-Type = Virtual
(5)   Service-Type = Framed-User
(5)   NAS-Port = 4
(5)   NAS-Port-Id = "rw-eap"
(5)   NAS-IP-Address = SERVER_PUBLIC_IPV4
(5)   Called-Station-Id = "SERVER_PUBLIC_IPV4[4500]"
(5)   Calling-Station-Id = "CLIENT_IPV4[3988]"

来自 Strongswan 的日志给出:

06[IKE] IKE_SA rw-eap[6] established between SERVER_PUBLIC_IPV4[vpn.example.com]...CLIENT_IPV4[[email protected]]

但是,当尝试从 Windows 客户端连接到服务器时,除非我在 Strongswan 中使用以下配置,否则它几乎是死在水中:

connections
{
  rw-windows {
    local_addrs = SERVER_PUBLIC_IPV4, SERVER_PUBLIC_IPV6

    local {
      auth = pubkey
      certs = example-ecdsa.cer
      id = vpn.example.com
    }

    remote-windows {
      auth = eap-radius

      # Don't use *@example.com here - as windows does not pass username as id, 
      # so this config will not match in that case.
      id = %any
    }
  }
}

使用此配置,我至少可以让 Strongswan 启动 Radius 身份验证,但我没有比这更进一步。

Freeradius 的输出给了我类似的东西:

(21) Received Access-Request Id 151 from 192.168.200.1:47851 to 192.168.200.1:1812 length 306
(21)   User-Name = "\300\250\000d"
(21)   NAS-Port-Type = Virtual
(21)   Service-Type = Framed-User
(21)   NAS-Port = 7
(21)   NAS-Port-Id = "rw-windows"
(21)   NAS-IP-Address = SERVER_PUBLIC_IPV4
(21)   Called-Station-Id = "SERVER_PUBLIC_IPV4[4500]"
(21)   Calling-Station-Id = "CLIENT_PUBLIC_IPV4[3989]"

这导致 Strongswan 日志中出现以下条目:

06[CFG] looking for peer configs matching SERVER_PUBLIC_IPV4[%any]...CLIENT_PUBLIC_IPV4[CLIENT_PRIVATE_IPV4]

这导致了我的几个问题,例如:

  • 第一:为什么Windows VPN客户端不像Strongswan那样将用户名作为ID传递?

  • 第二:为什么将用户名从 Strongswan 传递给 Freeradius "\300\250\000d"?

在 Windows 客户端上进行更多调试:

上面的示例是在使用 MS-CHAP v2 的客户端上使用 EAP-TTLS 时生成的。

当使用 MS-CHAP 时,Freeradius 确实会使用正确的用户名调用,但是当请求被代理时,用户名/密码身份验证失败。

我想 MS-CHAP 登录需要封装或其他什么,因为身份验证请求的编码与 Android 用户连接时的编码不同?

strongswan freeradius2 eap
  • 1 个回答
  • 421 Views
Martin Hope
Lasse Michael Mølgaard
Asked: 2021-05-23 15:27:48 +0800 CST

如何设置代理半径服务器 (FreeRadius 3)

  • 0

我正在尝试设置一个代理 Freeradius 服务器,将所有请求转发到另一个 Freeradius 服务器。

参考如下图:

通过 VPN 的代理半径服务器

此设置的原因是我希望用户通过 VPN 连接到本地 LAN,但由于 ISP 的 NAT 实施,本地站点无法访问。

但是,我能够建立从本地 LAN 到 VPN 服务器的 site2site VPN 连接,因此我希望用户能够通过公共 VPN 服务器与本地网络建立 VPN 连接,前提是他们是本地网络上的有效用户.

我有一个在本地 LAN 上运行的 Freeradius 服务器,可以根据数据库验证用户 - 这部分工作正常。

配置VPN服务器端

据我了解,我唯一需要在服务器上修改的是文件proxy.conf。

假设登录 VPN 的用户名在表单上,[email protected]​​那么我只需将以下条目添加到proxy.conf:

realm example.com {
    type = radius
    secret = VeryS3cretPassw0rd

    authhost = local-radius.example.com:1812
    accthost = local-radius.example.com:1813

    nostrip
}

该nostrip条目确保代理请求不会@从用户名中删除 -postfix。

我还需要将以下内容添加到/etc/hosts:

   # VPN Address of local-radius.example.com
 
   192.168.100.2   local-radius.example.com

配置本地radius服务器端

在本地半径服务器上,我需要更新client.conf,以便对本地半径服务器和源自 VPN ip 地址的任何查询都是允许的。比如这个条目:

client vpn-net {

        # Allow requests originating from VPN subnet.

        ipaddr          = 192.168.100.0/24
        secret          = VeryS3cretPassw0rd
}

在 VPN 服务器上运行以下命令按预期工作:

radtest -t mschap [email protected] SecretPassword local-radius.example.com:1812 0 VeryS3cretPassw0rd

我收到以下回复:

Sent Access-Request Id 108 from 0.0.0.0:47466 to 192.168.100.2:1812 length 148
        User-Name = "[email protected]"
        MS-CHAP-Password = "SecretPassword "
        NAS-IP-Address = 127.0.1.1
        NAS-Port = 0
        Message-Authenticator = 0x00
        Cleartext-Password = "SecretPassword"
        MS-CHAP-Challenge = ....
        MS-CHAP-Response = ...
Received Access-Accept Id 108 from 192.168.100.2:1812 to 192.168.100.1:47466 length 84
        MS-CHAP-MPPE-Keys = ...
        MS-MPPE-Encryption-Policy = Encryption-Required
        MS-MPPE-Encryption-Types = 4

但是在 VPN 服务器上运行以下命令失败:

radtest -t mschap [email protected] SecretPassword localhost:18120 0 testing123

该命令的输出是:

Sent Access-Request Id 104 from 0.0.0.0:39558 to 127.0.0.1:18120 length 148
        User-Name = "[email protected]"
        MS-CHAP-Password = "SecretPassword"
        NAS-IP-Address = 127.0.1.1
        NAS-Port = 0
        Message-Authenticator = 0x00
        Cleartext-Password = "SecretPassword"
        MS-CHAP-Challenge = ...
        MS-CHAP-Response = ...
Received Access-Reject Id 104 from 127.0.0.1:18120 to 127.0.0.1:39558 length 20
(0) -: Expected Access-Accept got Access-Reject

在 VPN 服务器上运行命令freeradius -X会给出以下输出:

(0) mschap: Found MS-CHAP attributes.  Setting 'Auth-Type  = mschap'
(0)     [mschap] = ok
(0) suffix: Checking for suffix after "@"
(0) suffix: Looking up realm "example.com" for User-Name = "[email protected]"
(0) suffix: Found realm "example.com"
(0) suffix: Adding Realm = "example.com"
(0) suffix: Proxying request from user [email protected] to realm example.com
(0) suffix: Preparing to proxy authentication request to realm "example.com"
(0)     [suffix] = updated
(0) ntdomain: Request already has destination realm set.  Ignoring
(0)     [ntdomain] = noop
(0) eap: No EAP-Message, not doing EAP
(0)     [eap] = noop
(0)     [files] = noop
(0)     [expiration] = noop
(0)     [logintime] = noop
(0)     [pap] = noop
(0)   } # authorize = updated
(0) There was no response configured: rejecting request

在本地网络上监视 freeradius 表明从未从 vpn 服务器调用该服务器,所以我错过了什么?

proxy freeradius freeradius2
  • 1 个回答
  • 3035 Views
Martin Hope
Lasse Michael Mølgaard
Asked: 2021-03-27 13:47:48 +0800 CST

Bind9:禁用每个区域的 DNSSEC 验证?

  • 1

我正在尝试使用 Bind9 制作一个仅缓存/转发 DNS 服务器,并默认启用 DNSSEC 验证。

假设您从我的配置文件中获得以下信息:

acl "home-net"
{
    127.0.0.1;
    ::1;
    192.168.1.0/24;
    2000:db8:cafe:100::/64;
};

options
{
    forwarders
    {
       # Use Google DNS either by IPv6 or IPv4 is fine.
       2001:4860:4860::8888;
       2001:4860:4860::8844;

       8.8.8.8;
       8.8.4.4;
    };

   dnssec-enable yes;
   dnssec-validation auto;

   allow-query { any; };
   allow-query-cache { home-net; };
   allow-recursion { home-net; };
};

zone "subdomain.example.net" {
    type forward;
    forward only;

    forwarders 
    { 
       # SAMBA PDC1 (Active Directory)
       2000:db8:cafe:100::1;
    
       # SAMBA PDC2 (Active Directory)
       2000:db8:cafe:100::2;    
    };
};

据我所理解:

每当我想查找在子域中注册的主机时subdomain.example.net,名称服务器就会联系我在区域配置的转发器部分中列出的两个 SAMBA PDC 之一。

域名服务器将依次进行 DNSSEC 验证,以确保这两个 SAMBA PDC 实际上被授权回复对域的请求subdomain.example.net。

如果来自 SAMBA PDC 的回复无法通过 DNSSEC 验证,则名称服务器将转向 Google DNS 并询问他们是否可以提供经过 DNSSEC 验证的响应。

现在问题来了:

据我了解,无论是通过使用 SAMBA INTERNAL_DNS 还是通过 BIND9_DLZ,在 SAMBA 中都没有 DNSSEC 支持,因此您永远无法对 SAMBA 维护的任何区域进行 DNSSEC 验证。

据我了解有3个选项:

  • 全局禁用 DNSSEC 验证。
  • 使用负信任锚。
  • 使用“验证除外”选项。

我会一一处理。

禁用 DNSSEC

在我的书中,这不是一个真正的选择。它基本上将您的设置减少到“在全球范围内工作”......除了您在世界的某个小角落,所以最好一起禁用它。

只需将dnssec-enable和的值更改为dnssec-validation即可no。

在我可以再次激活 DNSSEC 之前,我只会将其用作临时修复。

使用负信任锚

起初我的兴趣达到了顶峰。这个想法是您注册一个特殊的加密密钥,rndc然后它不会对您想要的域进行任何 DNSSEC 验证。

然而,这是一个临时修复,因为密钥的生命周期最多为一周。

这意味着您必须执行与 Let's Encrypt 中的证书相同类型的资源 - 只是必须更频繁地触发 cron 作业。

使用 'validate-except' 选项

从理论上讲,这应该是所有解决方案中最简单的。

我只需要添加一个新部分即可options调用validate-except。

像这样:

options
{

   dnssec-enable yes;
   dnssec-validation auto;

   validate-except
   {
       "subdomain.example.net";
       "another.example.net";
   };
};

听起来很简单——对吧?:-)

...除了我的名称服务器由于“未知选项 - 验证除外”而没有启动。

编辑:原来 Raspberry OS 使用 Bind 版本 9.11 而该validate-except选项仅在 Bind 版本 9.13 中实现。

作为参考,用于 Raspberry 的 Ubuntu 20.04 使用 Bind 版本 9.16。


那么有没有人有关于 DNSSEC 的混合模式设置的经验?

...或者最简单的解决方案是承认失败并安装 Ubuntu 20.04?:-)

bind dnssec raspbian
  • 1 个回答
  • 4179 Views
Martin Hope
Lasse Michael Mølgaard
Asked: 2020-03-25 17:37:14 +0800 CST

无法启动带有 Bind9 和 BIND_DLZ 的动态 DNS?

  • 2

我有一个使用 BIND_DLZ 作为后端运行 Samba 作为 Active Directory 域控制器的设备。

最重要的是,我正在运行一个辅助设备,该设备也配置为 Active Directory 域控制器,也使用 BIND_DLZ 作为后端以实现冗余目的。

IP 地址由 ISC DHCP 服务器分配,该服务器能够使用加密密钥 (TSIG) 更新 DNS 资源记录。

无论如何:关于我的问题。

这是我目前的设置

命名.conf.options:

options 
{
     directory "/var/cache/bind";

     forwarders {
            2001:4860:4860::8888;
            2001:4860:4860::8844;
            8.8.8.8;
            8.8.4.4;
     };

     auth-nxdomain no;    # conform to RFC1035
     listen-on-v6 { any; };

     listen-on port 53 { 192.168.1.240; };
     listen-on port 5353 { 127.0.0.1; }; <-- Used for Netflix IPv6 filter only.

     tkey-gssapi-keytab "/var/lib/samba/bind-dns/dns.keytab";
     minimal-responses yes;
     recursion yes;
};

acl "home-net"
{
    127.0.0.1;
    192.168.1.0/24;
    2001:db8:cafe:beef::/56; # <-- I am using a IPv6 range from Tunnelbroker in real life.
};

view "normal"
{
    include "/etc/bind/named.conf.default-zones";
    include "/etc/bind/named.conf.internal";

    # Netflix really dislike Tunnelbroker IPv6, so I am dropping any Netflix AAAA ressources records.
    include "/etc/bind/netflix-ipv6-blackhole.conf";  

    match-clients
    {
        home-net; # <-- Only respond to queries originating from my own network.
    };

    dnssec-enable yes;
    dnssec-validation auto;

    allow-query { any; };
    allow-query-cache { home-net; };
    allow-recursion { home-net; };

    forwarders {
      8.8.8.8;
      8.8.4.4;
      2001:4860:4860::8888;
      2001:4860:4860::8844;
   };
};

命名的.conf.internal:

zone "1.168.192.in-addr.arpa"
{
    type master;
    file "/etc/bind/db.192.168.1.rev";
    notify yes;

    allow-query { any; };
    allow-transfer { xfer; };

    # If allow-update is enabled instead of the include named.conf.update line, 
    # then Dynamic DNS works fine due to ISC DHCP can update the ressource records. 
    #
    # Sadly you can't have both lines enabled. It is either / or.

    // allow-update { key ddns-key; };

    include "/var/lib/samba/bind-dns/named.conf.update"; # <-- Having issues with THIS line only.
};

include "/var/lib/samba/bind-dns/named.conf";

/var/lib/samba/bind-dns/named.conf:

dlz "AD DNS Zone" {
    # For BIND 9.11.x
    database "dlopen /usr/lib/arm-linux-gnueabihf/samba/bind9/dlz_bind9_11.so";
};

/var/lib/samba/bind-dns/named.conf.update:

/* this file is auto-generated - do not edit */
update-policy {
        grant EXAMPLE.COM ms-self * A AAAA;
        grant [email protected] wildcard * A AAAA SRV CNAME;

        # Main Active Directory Domain Controller
        grant [email protected] wildcard * A AAAA SRV CNAME;

        # Backup Active Directory Domain Controller
        grant [email protected] wildcard * A AAAA SRV CNAME;
};

如果我尝试使用此配置开始绑定,我会得到一个我无法弄清楚的相当奇怪的错误:

/var/lib/samba/bind-dns/named.conf.update:3: name field not set to placeholder value '.'

有没有人可以告诉我named.conf.update有什么问题?

active-directory samba bind dynamic-dns
  • 1 个回答
  • 1500 Views
Martin Hope
Lasse Michael Mølgaard
Asked: 2019-11-24 10:35:07 +0800 CST

OpenVPN 网关不回复 IPv6 ping,但转发包

  • 0

我正在尝试调试我的 IPv6 网络并遇到了一个我无法理解的问题。

我使用 OpenVPN 作为我的 VPN 服务器,下面是设置的简图:

具有双宿主 VPN 服务器的 IPv6 网络 当我尝试从 VPN Client ( 2001:470:7875:1::2) ping 到 VPN Server ( 2001:470:7875:1::1) 时,所有包都被丢弃了,但奇怪的是:

我可以通过 IPv6 ping 任何其他主机(如 Google)或通过 IPv6 连接到同一 VPN 服务器的任何其他 VPN 客户端。

我还可以在其本地 IPv6 接口 ( ens3) 上 ping 我的 VPN 服务器。只有 VPN 服务器接口 ( tun0) 在直接 ping 时不响应。

因此,我想知道发生了什么?

由于我有两个 IPv6 链接到互联网的 IPv6 版本,我必须做基于策略的路由。规则非常简单。

  • 只有源自 VPN 服务器本身的 IPv6 包才允许通过本机 IPv6 链接发送。
  • 所有其他 IPv6 包必须由 Hurricane Electric IPv6 隧道处理。

这导致我在 VPN 服务器上的以下路由表:

该命令ip -6 rule show具有以下设置:

0:      from all lookup local
32000:  from 2001:470:7875::/48 lookup openvpn
32766:  from all lookup main

表local:

local ::1 dev lo proto kernel metric 0 pref medium
anycast 2001:470:1f14:2c7:: dev he-ipv6 proto kernel metric 0 pref medium
local 2001:470:1f14:2c7::2 dev he-ipv6 proto kernel metric 0 pref medium
anycast 2001:470:7875:1:: dev tun0 proto kernel metric 0 pref medium
local 2001:470:7875:1::1 dev tun0 proto kernel metric 0 pref medium
anycast 2a01:xxx:xxxx:: dev ens3 proto kernel metric 0 pref medium
local 2a01:xxx:xxxx:xxx::1 dev ens3 proto kernel metric 0 pref medium
anycast fe80:: dev ens3 proto kernel metric 0 pref medium
anycast fe80:: dev tun0 proto kernel metric 0 pref medium
anycast fe80:: dev he-ipv6 proto kernel metric 0 pref medium
local fe80::95d2:9e6b dev he-ipv6 proto kernel metric 0 pref medium
local fe80::5054:ff:fe66:f97f dev ens3 proto kernel metric 0 pref medium
local fe80::af96:f1e3:dbf3:96a7 dev tun0 proto kernel metric 0 pref medium
ff00::/8 dev ens3 metric 256 pref medium
ff00::/8 dev tun0 metric 256 pref medium
ff00::/8 dev he-ipv6 metric 256 pref medium

表main:

local ::1 dev lo proto kernel metric 256 pref medium
2001:470:1f14:2c7::/64 dev he-ipv6 proto kernel metric 256 pref medium
2001:470:7875:1::/64 dev tun0 proto kernel metric 256 pref medium
unreachable 2001:470:7875::/48 dev lo metric 1024 error -113 pref medium
2xxx:xxx:xxxx::/48 dev ens3 proto kernel metric 256 pref medium
fe80::/64 dev ens3 proto kernel metric 256 pref medium
fe80::/64 dev tun0 proto kernel metric 256 pref medium
fe80::/64 dev he-ipv6 proto kernel metric 256 pref medium
default via 2a01:xxx:xxxx::1 dev ens3 metric 1024 pref medium

表openvpn:

unreachable 2001:470:7875::/48 dev lo metric 1024 error -113 pref medium
default via 2001:470:1f14:2c7::1 dev he-ipv6 metric 1024 pref medium

有谁能给我指点一下吗?:-)


快速回顾一下路由表中无法到达的线路

2001:470:1f14:2c7::/64 dev he-ipv6 proto kernel metric 256 pref medium
2001:470:7875:1::/64 dev tun0 proto kernel metric 256 pref medium
unreachable 2001:470:7875::/48 dev lo metric 1024 error -113 pref medium

的范围2001:470:7875::/48是从2001:470:7875:0:0:0:0:0到2001:470:7875:ffff:ffff:ffff:ffff:ffff。

我已将子网分配2001:470:7875:1::/64给 VPN 隧道。

  • 2001:470:7875:1::/64是2001:470:7875::/48子网的一部分,这可能会导致路由表中的冲突。
  • 2001:470:1f14:2c7::/64不是子网的一部分,因此不会2001:470:7875::/48与路由表冲突。

没有其他 IP 范围正在使用,但将在未确定的以后日期。

记住最长前缀获胜给我们以下行为:

  • 子网的任何 IP 包2001:470:1f14:2c7::/64都将由 he-ipv6 接口处理。
  • 子网的任何 IP 包2001:470:7875:1::/64都将由 tun0 接口处理。
  • 2001:470:7875::/48 子网的所有其他IP 包将被回复为无法访问。
ipv6
  • 1 个回答
  • 229 Views
Martin Hope
Lasse Michael Mølgaard
Asked: 2019-10-07 12:29:52 +0800 CST

从 Z-push 接收时,Postfix 不会将邮件传递给 Amavis

  • 2

对于如何让 ActiveSync 与我的邮件服务器正常工作,我有点盯着自己看,所以也许这里的任何人都有一个想法?

交易是邮件服务器托管四个域,我希望所有发送的邮件都具有 DKIM 签名。

通过 SMTP 发送时我已经让它工作了,但是当客户端使用 ActiveSync 发送电子邮件时它签名失败。

无论如何,这里是关于它如何用于 SMTP 的图表:

Postfix 与 Amavis 一起处理邮件的流程图

Postfix 决定如何识别来自经过身份验证的用户发送的邮件(属于我的托管域之一)与来自 Internet 上某处的邮件的大部分魔法来自以下行/etc/postfix/main.cf:

smtpd_sender_restrictions = 
    check_sender_access regexp:/etc/postfix/tag_as_originating.re, 
    permit_mynetworks, 
    permit_sasl_authenticated, 
    check_sender_access mysql:/etc/postfix/mysql-virtual_sender.cf, 
    check_sender_access regexp:/etc/postfix/tag_as_foreign.re

content_filter = amavis:[127.0.0.1]:10024

的内容/etc/postfix/tag_as_foreign.re:

/^/ FILTER amavis:[127.0.0.1]:10024

Amavis 使用端口 10025 将结果发送回 Postfix,由/etc/postfix/master.cf以下配置处理:

127.0.0.1:10025 inet n - n - - smtpd
    -o content_filter=
    -o local_recipient_maps=
    -o relay_recipient_maps=
    -o smtpd_restriction_classes=
    -o smtpd_client_restrictions=
    -o smtpd_helo_restrictions=
    -o smtpd_sender_restrictions=
    -o smtpd_recipient_restrictions=permit_mynetworks, reject
    -o mynetworks=127.0.0.0/8
    -o strict_rfc821_envelopes=yes
    -o receive_override_options=no_unknown_recipient_checks, no_header_body_checks
    -o smtp_send_xforward_command=yes
    -o disable_dns_lookups=yes

的内容/etc/postfix/tag_as_originating.re:

/^/ FILTER amavis:[127.0.0.1]:10026

结果使用端口 10027 发送回 Postfix,并由以下代码处理/etc/postfix/master.cf:

127.0.0.1:10027 inet n - n - - smtpd
    -o content_filter=
    -o local_recipient_maps=
    -o relay_recipient_maps=
    -o smtpd_restriction_classes=
    -o smtpd_client_restrictions=
    -o smtpd_helo_restrictions=
    -o smtpd_sender_restrictions=
    -o smtpd_recipient_restrictions=permit_mynetworks, reject
    -o mynetworks=127.0.0.0/8
    -o strict_rfc821_envelopes=yes
    -o receive_override_options=no_unknown_recipient_checks, no_header_body_checks
    -o smtp_send_xforward_command=yes
    -o milter_default_action=accept
    -o milter_macro_daemon_name=ORIGINATING
    -o disable_dns_lookups=yes

最后,这里是master.cf关于如何将邮件首先引入 Postfix 的相关行:

smtp      inet  n       -       y       -       -       smtpd

pickup    unix  n       -       y       60      1       pickup

submission inet n       -       y       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated, reject

smtps     inet  n       -       y       -       -       smtpd
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated, reject

我正在使用Z-push通过 ActiveSync 处理连接,但我的问题如下:

我在 mail.log 中注意到,即使在 z-push 配置文件中声明它应该通过 SMTP 将传入的邮件传递给 postfix,它仍然坚持将传入的邮件直接放入 maildrop 目录,该目录又由 Postfix 拾取守护进程处理。

从那里,邮件或者直接转发到目的地地址,甚至没有经过 Amavis 的 DKIM 签名。

问题是:如何让 Postfix 将邮件从取件守护程序传递到 Amavis,以便在转发到目的地之前获得 DKIM 签名?

pickup是否就像在master.cf文本下方插入一行一样简单:

-o content_filter = amavis:[127.0.0.1]:10026

...还是与现有设置冲突?:-)

postfix
  • 1 个回答
  • 753 Views
Martin Hope
Lasse Michael Mølgaard
Asked: 2013-06-03 07:50:01 +0800 CST

OpenVPN 上的 IPv6 路由

  • 4

试图了解 IPv6 如何与 OpenVPN 一起工作,所以我想设置以下方案。

我有一个 VPS 服务器 (Ubuntu),它被分配了一个 /48 子网。

ISP ipv6 gateway is XXXX:XXXX:XXXX::1
Server ipv6 address is XXXX:XXXX:XXXX:39::1

这个想法是任何连接到服务器的客户端都在 XXXX:XXXX:XXXX:39:2::/64 子网上获得一个 IP 地址。

服务器配置文件基于 OpenVPN 的示例配置,并添加了以下内容:

dev tun
tun-ipv6
server-ipv6 XXXX:XXXX:XXXX:39:2::/64
push "route-ipv6 XXXX:XXXX:XXXX:39::/48"

重新启动 OpenVPN 服务器没有问题。

服务器分配了以下 ip 地址:

eth0: XXXX:XXXX:XXXX:39::1/48
tun0: XXXX:XXXX:XXXX:39::2/64

客户被分配:

OpenVPN 点击:XXXX:XXXX:XXXX:39:2:0:1:0,我可以 ping XXXX:XXXX:XXXX:39::1 就好了。但是,从客户端 ping ISP 网关会使连接超时。

我可以从服务器 ping ISP ipv6 网关。

我在 Ubuntu 防火墙中允许来自 XXXX:XXXX:XXXX:39:2::/64 的流量。

我错过了什么?

我应该提到服务器正在运行 OpenVPN 版本 2.2.1 - 这是抱怨的原因吗?

routing
  • 1 个回答
  • 3725 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve