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-537128

TRW's questions

Martin Hope
TRW
Asked: 2024-11-05 15:48:35 +0800 CST

Nginx 关闭连接

  • 4

我在 Debian Bookworm 上运行默认的 nginx 包。通常我只使用 HTTPS 连接该服务,一切正常。HTTP 端口 80 的默认重定向到 HTTPS 协议。

server {
  listen 80 default_server;
  listen [::]:80 default_server;
  server_tokens off;

  return 301 https://$host$request_uri;

  access_log /var/log/nginx/access.log;
  error_log /var/log/nginx/error.log error;
}

// vhosts with listen 443 configs omited here, they work

我有一个不支持 HTTPS 的 IoT 客户端。因此,我将其配置为使用 HTTP 将传感器数据发送到 Nginx 服务器上的挂钩 URL。我为该本地域 xyz 添加了 VHost,它不会将请求转发到 HTTPS,而是使用纯 HTTP 进行处理。

server {
  listen 80;
  listen [::]:80;
  server_name xyz;
  server_tokens off;

  location / {
    root /var/www/html/;
  }

  access_log /var/log/nginx/access.log;
  error_log /var/log/nginx/error.log error;
}

// vhosts with listen 443 configs omited here, they work

但是该请求从未被 Nginx 处理。

使用curl,我得到了这个回应

# curl -v http://localhost/
*   Trying 127.0.0.1:80...
* Connected to localhost (127.0.0.1) port 80 (#0)
> GET / HTTP/1.1
> Host: localhost
> User-Agent: curl/7.88.1
> Accept: */*
> 
* Received HTTP/0.9 when not allowed
* Closing connection 0
curl: (1) Received HTTP/0.9 when not allowed

(信息:Nginx 正在监听所有设备,没有防火墙处于活动状态,当我停止服务时,Linux 中的端口被关闭...)。

journald 中、nginx 访问或错误日志中都没有错误日志消息。

然后我尝试硬核telnet访问 80 端口,得到了更奇怪的结果:

# telnet localhost 80
Trying ::1...
Connected to localhost.
Escape character is '^]'.
GET / HTTP/1.1
Connection closed by foreign host.

需要说明的是,我输入时GET / HTTP/1.1\n没有第二个空行,只有一个“enter”。当我输入不符合 HTTP 规范的内容(例如随机字符串)时,服务器会响应??。

因此,在第一行之后,Nginx 就关闭了连接(HTTP/0.9 响应来自 curl 本身)。

因为我无法Host:在 telnet 请求中设置标头,所以此请求从未检查任何虚拟主机配置,我推测 curl 客户端也有同样的问题。它尝试将所有标头发送到套接字,但 Nginx 响应已经存在。

我不知道哪里出了问题。服务器至少应该等待 Host-header 才能关闭连接。/etc/nginx/nginx.conf没有改变。

根据nginx -t配置,服务器在 上响应正常curl -v https://localhost/。SSL 配置等这里就省略了。它正在工作。

nginx
  • 1 个回答
  • 140 Views
Martin Hope
TRW
Asked: 2021-07-30 08:53:20 +0800 CST

带移动办公的 Wireguard Site2Site

  • 0

我必须连接到与 Wireguard 连接的网络。

Lan1:
  10.240.0.0/24
  via 10.100.1.1/32 on public static ip A.B.C.D/32

Lan2:
  192.168.0.0/24
  via 10.100.1.6/32 on dynamic ip from provider

10.240.0.0 网络是多台公共服务器上的有线保护网络 (wg0),其中一台服务器是“网关”,具有与 10.100.1.1 的特殊 wg1 接口。所以我可以从网关访问 192.168.0.0 网络中的所有节点。在 Lan2 上,它是一个带有一些服务器的经典本地网络。同样在那个对等点上,我可以到达 Lan1 后面的所有节点。

现在我想在“狂野”的某个地方添加一个新的对等点——移动办公室。用户应该可以同时访问 Lan1 和 Lan2,例如访问 10.240.0.0/24 和 192.168.0.0/24。对端本身就是一个手机,以 Wireguard 客户端为例。

Lan1 网关 wg1.conf

[Interface]
Address = 10.100.1.1/32
...

PostUp   = iptables  -A FORWARD -i %i -j ACCEPT; iptables  -A FORWARD -o %i -j ACCEPT; iptables  -t nat -A POSTROUTING -o eth0 -j MASQUERADE;
PostDown = iptables  -D FORWARD -i %i -j ACCEPT; iptables  -D FORWARD -o %i -j ACCEPT; iptables  -t nat -D POSTROUTING -o eth0 -j MASQUERADE;

# road-warrior
[Peer]
PublicKey = ...
AllowedIps = 10.100.1.2/32

# Lan2 gateway
[Peer]
PublicKey = ...
AllowedIps = 10.100.1.6/32, 192.168.0.0/24

和 Lan2 主机

[Interface]
Address = 10.100.1.6/32
...

PostUp   = iptables  -A FORWARD -i %i -j ACCEPT; iptables  -A FORWARD -o %i -j ACCEPT; iptables  -t nat -A POSTROUTING -o ens18 -j MASQUERADE
PostDown = iptables  -D FORWARD -i %i -j ACCEPT; iptables  -D FORWARD -o %i -j ACCEPT; iptables  -t nat -D POSTROUTING -o ens18 -j MASQUERADE

# lan1_gate
[Peer]
PublicKey = ...
EndPoint = fqdn:port
AllowedIPs = 10.100.1.1/32, 10.240.0.0/24

我只能在该手机上定义(据我所知)lan1 网关的对等方,因为我无权访问 lan2_gateway 但我想通过 lan1_gateway 将所有流量 von 192.168.0.0 路由到 lan2_gateway

[Interface]
Address = 10.100.1.2/32
...

[Peer]
PublicKey = ...
EndPoint = fqdn:port
AllowedIPs = 10.100.1.1/32, 192.168.0.0/24, 10.240.0.0/24

当我用lan1连接公路战士时,我可以到达10.240.0.0/24但不能到达192.168.0.0。怎么了?我是否需要 lan1_gate 上的另一个转发规则将 192.168.0.0 的流量转发到 10.100.1.6?那应该已经完成​​了。

#> ip r s
default via 172.31.1.1 dev eth0 onlink
...
10.100.1.2 dev wg1 scope link 
10.100.1.6 dev wg1 scope link 
...
10.240.0.4 dev wg0 scope link 
10.240.0.5 dev wg0 scope link 
...
172.31.1.1 dev eth0 proto kernel scope link src A.B.C.D 
192.168.10.0/24 dev wg1 scope link 

有任何想法吗?

wireguard
  • 1 个回答
  • 64 Views
Martin Hope
TRW
Asked: 2021-02-02 01:44:35 +0800 CST

带有 Lua 的 Dovecot 代理还是?

  • 1

我已经构建了一个 Dovecot 代理,可以根据用户的域将用户发送到特定的后端。域 A 到服务器 A,域 B 到服务器 B,等等。域列表不是静态的,但变化不大。使用 passdb 驱动程序 sql 和一个简单的 SQL 语句,这完全可以正常工作,例如:

password_query = SELECT 
    NULL as password, 
    'y' as nopassword, 
    'y' as proxy, 
    NULL as destuser, 
    'y' as proxy_nopipelining, 
    host, 
    'y' as nodelay, 
    'y' as nologin, 
    'any-cert' as 'starttls' 
  FROM proxy_domain WHERE domain = '%d';

dovecot 配置包含:

passdb {
  args = /etc/dovecot/sql.conf
  driver = sql
}

userdb {
  args = static uid=5000 gid=5000 home=/dev/null
  driver = static
}

我的“问题”并不是真正的问题 - 但是......我只需要为这项工作安装和运行 Mysql/MariaDB 服务器,我认为,必须有一种更简单的方法来解析特定域的主机。并行 postfix 安装使用简单的传输映射来完成相同的工作。我不需要 SQL 服务器来进行简单的查找。

我考虑过Dovecot Lua passdb或static passdb但我找不到任何有用的示例来将域与带有 Lua 的主机进行匹配,或者我如何返回所有必要的参数?

所以我已经安装了 debian 包dovecot-auth-lua。

我试过:

passdb {
  driver = lua
  args = file=/etc/dovecot/passdb.lua blocking=yes
  default_fields = password=NULL nopassword=y proxy=y destuser=NULL proxy_nopipelining=y nodelay=y nologin=y starttls=any-cert
}

有必要在这里屏蔽吗?这是只读操作,还是?

Lua 脚本:

local database = "/etc/dovecot/backends"

function auth_passdb_lookup(req)
 for line in io.lines(database) do
   for domain, host in string.gmatch(line, "(.+)%s(.+)") do
     if (domain == req.domain) then
       return dovecot.auth.PASSDB_RESULT_OK, "host=" .. host
     end
   end
 end
 return dovecot.auth.PASSDB_RESULT_USER_UNKNOWN, ""
end

<domain> <host>当然还有每行的后端文件。

但我在代理上遇到错误

pam_unix(dovecot:auth): check pass; user unknown
pam_unix(dovecot:auth): authentication failure; logname= uid=0 euid=0 tty=dovecot ruser=user@domain rhost=<my-ip>
pam(user@domain,ip,<id>): pam_authenticate() failed: Authentication failure (Password mismatch?)

这是什么意思?我不确定 - 但它是吗,因为我在其中一些上返回“NULL”。当我删除这两个属性时password,destuser它具有相同的效果。

dovecot
  • 1 个回答
  • 270 Views
Martin Hope
TRW
Asked: 2020-11-10 06:36:24 +0800 CST

向 Icinga Master-Satellite-Agent 基础设施中的代理添加服务检查

  • 0

我有这样的环境:

  • 掌握
  • 一些分配给主控的卫星
  • 许多代理分配给卫星,一些代理分配给主(没有卫星)。

所有系统均已准备就绪,PKI 设置已完成。大多数默认检查(apt、disk、cpu)也在运行,我可以在主服务器上看到当前状态。现在我已经开始实施自定义检查(比如 check_eth 来监控网络流量)。我已将脚本发布到所有主机并在所有主机上定义了命令:

object CheckCommand "check_eth" {
  import "plugin-check-command"
  command = [ "/usr/bin/sudo", PluginDir + "/check_eth" ]
 
  arguments       = {
   "-w" = {
      value                     = "$eth_warning$"
      description               = "Percent free/used when to warn"
      required                  = true
    }
    "-c" = {
      value                     = "$eth_critical$"
      description               = "Percent free/used when critical"
      required                  = true
    }
    "-i" = {
      value                     = "$eth_interface$"
      description               = "Given network interface"
      required                  = true
    }
  }

  vars.eth_interface  = "enp0s31f6"
  vars.eth_warning  = "2048G"
  vars.eth_critical = "4096G"
}

我可以在所有主机上运行脚本。在 Master 上,可以看到卫星和所有直接分配给 master 的主机检查的响应。在所有具有 parent=satellite 的主机上,状态为 UNKNOWN。那是我的问题……为什么?

主机对象如下:

# master: /etc/icinga2/zones.conf

object Endpoint "monitor.domain" {
}

object Zone "master" {
  endpoints = [ "monitor.domain" ]
}

object Endpoint "satellite1.domain" {
    host = "<ip>"
    port = "<port>"
}

object Zone "satellite1.domain" {
    parent = "master"
    endpoints = [ "satellite1.domain" ]
}

卫星配置如下所示:

# master: /etc/icinga2/zones.d/satellite1.domain/hosts.conf

object Host "satellite1.domain" {
    import "generic-host"
    check_command = "hostalive"
    zone = "master"

    address = "<ipv4>"
    address6 = "<ipv6>"
    
    vars.agent_endpoint = name
    ...
}

object Host "agent1.domain" {
    import "generic-host"
    check_command = "hostalive"
    zone = "satellite1.domain"

    address = "<ipv4>"
    address6 = "<ipv6>"
    
    vars.agent_endpoint = name
    ...
}
...

该区域包括。卫星内部的端点也在主节点上定义:

# master: /etc/icinga2/zones.d/satellite1.domain/zones.conf
object Zone "agent1.domain" {
    parent = "satellite1.domain"
    endpoints = [ "agent1.domain" ]
}

object Endpoint "agent1.domain" {
    host = "<ip>"
    port = "<port>"
}

现在将命令应用于主机(也在主机上定义)

# master: /etc/icinga2/zones.d/satellite1.domain/services.conf

apply Service "Network Traffic" {
  import "generic-service"

  check_command = "check_eth"
  command_endpoint = host_name

  assign where host.name == "satellite1.domain"
}

apply Service "Network Traffic" {
  import "generic-service"

  check_command = "check_eth"
  command_endpoint = host_name

  assign where host.name == "agent1.domain"
}

我想念什么?

icinga2
  • 1 个回答
  • 350 Views
Martin Hope
TRW
Asked: 2020-10-21 06:24:20 +0800 CST

从 wg1 到 wg0 的 Wireguard 路由

  • 1

我有两个使用 Wireguard 配置的网络。wg0 用于服务器,wg1 用于 VPN 用户。当 wg1 上的 VPN 用户想要访问 wg0 网络时,数据包应该是经过 wg0 服务器之一(VPN 网关)的路由器。

VPN 网关和所有具有 wg0 接口的服务器上的 wg0.conf

[Interface]
Address = 10.1.0.15
ListenPort = 51820
PrivateKey = privatekey1

# node23
[Peer]
PublicKey = pubkey
AllowedIps = 10.1.0.23
Endpoint = node23.fqdn:51820

# node24
[Peer]
PublicKey = pubkey
AllowedIps = 10.1.0.24
Endpoint = node24:51820

# node25
[Peer]
PublicKey = pubkey
AllowedIps = 10.1.0.25
Endpoint = node25.fqdn:51820
...

VPN 网关上的 wg1.conf

[Interface]
Address = 10.100.0.1/32
ListenPort = 51810
PrivateKey = privatekey2

PostUp   = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

# user1    [Peer]
PublicKey = pubkey
AllowedIps =  10.100.0.2/32
...

这是用户 wg1.conf(实际上是 wg0,因为他们没有 10.1.0.0 地址)

[Interface]
Address = 10.100.0.2/32
ListenPort = 21841
PrivateKey = myprivatekey

[Peer]
PublicKey = pubkey
EndPoint = vpngate.fqdn:51810
AllowedIPs = 0.0.0.0/0

PersistentKeepalive = 25

因此,我可以在 VPN 网关本身上运行curl -v http://10.1.0.23/,并且在 wg0 网络中得到响应。平工作到。我可以访问网络内的所有服务器。wg1-client 和 wg1-server 也是如此。我也可以通过 VPN 网关浏览互联网。但是,当我尝试从我的 wg1-client 调用 wg0-server 时curl -v http://10.1.0.23/,应该是路由(我认为)通过 vpn-gate 并从那里通过 wg1 -> wg0 没有响应。

我想念什么?

wireguard
  • 1 个回答
  • 1106 Views
Martin Hope
TRW
Asked: 2020-08-26 07:03:00 +0800 CST

Dovecot 作为提交的代理

  • 0

在我的基础架构中,我有几个邮件服务器(mailcow)为每个实例服务不同的域。我想在他们面前建立一个邮件代理,以减少每个服务使用的 IP 数量,并允许客户在他们的客户端预设中拥有自己的域名。

SMTP 作为 MTA 的处理方式不同。通过 Postfix 传入的消息由中央服务器处理(因为客户看不到 MX 记录)。所以这不是我的问题。

所以我在 Debian Buster 上配置了一个基于 Dovecot 的邮件代理,配置如下:

ssl_cert = </etc/dovecot/ssl/default.pem
ssl_key = </etc/dovecot/ssl/default.key

# just an example for different domains via SNI
local_name mail.domain1.tld {
  ssl_cert = </etc/dovecot/ssl/mail.domain1.tld.pem
  ssl_key = </etc/dovecot/ssl/mail.domain1.tld.key
}

# just an example for different domains via SNI
local_name mail.domain2.tld {
  ssl_cert = </etc/dovecot/ssl/mail.domain2.tld.pem
  ssl_key = </etc/dovecot/ssl/mail.domain2.tld.key
}

auth_cache_size = 4 k
disable_plaintext_auth = no

passdb {
  args = /etc/dovecot/sql.conf
  driver = sql
}
protocols = "imap pop3 submission"
service auth {
  user = root
}
userdb {
  args = static uid=5000 gid=5000 home=/dev/null
  driver = static
}

而 sql.conf 是

## SQL passdb configuration
driver = mysql

# Database options
connect = host=localhost dbname=dovecot user=dovecot password=dovecot

# Query
password_query = SELECT NULL AS password, NULL AS destuser, host, 'Y' AS nologin, 'Y' AS nodelay, 'Y' AS nopassword, 'Y' AS proxy, 'any-cert' AS `ssl` FROM proxy_domain WHERE domain = '%d'
# eof

该数据库包含:

CREATE TABLE `proxy_domain` (
  `domain` varchar(255) NOT NULL,
  `host` varchar(255) NOT NULL,
  PRIMARY KEY (`domain`)
);

insert into proxy_domain (domain, host) values ('domain1.tld','mailhost1');
insert into proxy_domain (domain, host) values ('domain2.tld','mailhost2');

这或多或少是一个例子

  • 代理:https ://wiki1.dovecot.org/HowTo/ImapProxy (最后更新于 2011 年,配置参数非常旧)
  • SNI:https ://wiki.dovecot.org/SSL/DovecotConfiguration

IMAP 和 POP3 服务已启动并与

openssl s_client -connect ac-hcn0002.acoby.net:993

我可以登录,而且 SNI 工作正常。后端可通过 SSL 访问。使用 starttls (110, 143, 587) 仅提供第一个证书。这是可以接受的,因为我不会向客户推荐。

但现在提交(和后来的筛子)。

问题一:

Dovecot 能够打开 587 进行提交。这只能通过 STARTTLS 获得。但是代理随后尝试在后端系统上直接与端口 587 上的 SSL 进行通信以提交(我认为这是不正确的 - 它应该以普通方式开始并生成 STARTTLS)。我认为,发生这种情况是因为 passdb 返回全局 SSL=any-cert。这是一个错误吗?我可以为 587 覆盖该行为吗?也许有没有办法用 STARTTLS 发送正确的证书(而不是默认/第一个)?

问题2:

然后是端口 465。Dovecot 还可以在我的情况下打开提交端口 465/SSL,以便将所有经过身份验证的消息转发到后端的 465 提交端口。但是我该如何配置呢?我找不到任何例子。

我知道带有 dovecot 代理的邮件基础设施和带有后缀的解决方案 - 但我不太确定,如果使用 dovecot-socket 的答案在这种情况下有效,并且我不想安装后缀仅用于提交,当Dovecot 可以开箱即用。

reverse-proxy dovecot smtp-auth
  • 1 个回答
  • 1540 Views
Martin Hope
TRW
Asked: 2020-01-16 02:21:12 +0800 CST

使用动态和静态主机和变量管理 Ansible Inventory

  • 1

我想知道使用动态和静态主机以及变量和组的组合来管理环境的好解决方案是什么。

我正在考虑将数据中心中的物理主机与特定任务(物理数据库节点)的组合加上管理一些动态虚拟机的 Proxmox 主机,以及在某些情况下管理新虚拟机的一些云提供商,其中物理性能是还不够(外包性能窥探)。

在这种情况下 - 动态库存是一种很好的做法。当然,AWS、Hetzner 等也有一些插件。但是可以将它们与静态条目结合起来吗?

我构建了一个包含所有条目和脚本的数据库,这些条目和脚本会根据数据库中的每个请求更新云虚拟机列表。所有动态主机连同静态主机和一些组变量、主机变量都存储在数据库中。还有一个 Web 服务,它输出 Python 脚本加载的 JSON 动态清单,并在我的剧本中用作动态清单。

我的问题是——我是唯一一个有这种设置的人吗?当我想到一家拥有一些 VMWare 主机以及该主机上的动态虚拟机数量以及其他一些物理系统的公司时,很明显应该有某种“工具”或帮助进行此设置。但据我所知,有静态清单(YAML、INI)或动态清单(JSON)。但是每个管理员都开发自己的动态库存数据库吗?或者是否有给定的软件“产品”或“项目”?还是为“静态”和“动态”环境提供不同的清单是一种“更好”的做法?

ansible
  • 1 个回答
  • 616 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