我一直得到这个(Ubuntu 16.04 LTS):
$ docker pull nginx
Using default tag: latest
Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: TLS handshake timeout
Run Code Online (Sandbox Code Playgroud)
但是 curl TLS 工作正常(除了身份验证错误):
$ curl https://registry-1.docker.io/v2/
{"errors":[{"code":"UNAUTHORIZED","message":"authentication required","detail":null}]}
Run Code Online (Sandbox Code Playgroud)
甚至一个小的 golang 程序(模仿 docker)也能正常工作:
package main
import (
"fmt"
"io/ioutil"
"net/http"
)
func main() {
resp, err := http.Get("https://registry-1.docker.io/v2/")
if err != nil {
panic(err)
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
panic(err)
}
fmt.Println("Got: ", string(body))
}
Run Code Online (Sandbox Code Playgroud)
docker TLS 超时请求的 pcap:
reading from file …Run Code Online (Sandbox Code Playgroud) 更成熟的配置管理 (CM) 系统(如 Puppet 和 Chef)使用基于拉取的方法:客户端定期轮询集中主节点以获取更新。其中一些也提供了一种无主方法(因此,基于推送),但声明它“不适用于生产”(Saltstack)或“可扩展性较差”(Puppet)。我所知道的唯一一个从一开始就基于推送的系统是亚军 Ansible。
基于拉的系统的具体可扩展性优势是什么?为什么据说添加更多 pull-masters 比 push-agents 更容易?
例如,agiletesting.blogspot.nl写道:
在“拉”系统中,客户端相互独立地联系服务器,因此整个系统比“推”系统更具可扩展性
另一方面,Rackspace 证明他们可以使用基于推送的模型处理 15K 系统。
我们发誓使用拉式方法来维护基础架构,使用 SUP、CVSup、rsync 服务器或 cfengine 等工具。不是将更改推送给客户端,每个单独的客户端计算机都需要负责在启动时轮询黄金服务器,并在之后定期轮询,以保持自己的 rev 级别。在采用这个观点之前,我们开发了大量基于 ssh、rsh、rcp 和 rdist 的基于推送的脚本。我们在 r-commands(或 ssh)中发现的问题是:当您运行基于 r-command 的脚本将更改推送到您的目标机器时,很可能如果您有 30 多个目标主机,其中一个将在任何给定的时间下来。维护委托机器的列表变成了一场噩梦。在编写代码来纠正这个问题的过程中,你最终会得到精心设计的包装器代码来处理:死主机超时;记录和重试死主机;分叉并运行并行作业以尝试在合理的时间内访问许多主机;最后检测并防止在所有出站 rsh 会话中耗尽源计算机上所有可用 TCP 套接字的情况。然后,您仍然面临着将您刚才所做的所有内容放入安装映像中的问题,以便将来安装所有新主机,以及为任何已死且明天必须重建的主机重复此操作。在我们为实现基于 r-command 的复制而遇到的麻烦之后,我们发现它只是不值得。我们不打算再次使用 r-commands 或任何其他推送机制来管理基础设施。它们的扩展性不如基于拉动的方法。分叉并运行并行作业以尝试在合理的时间内访问许多主机;最后检测并防止在所有出站 rsh 会话中耗尽源计算机上所有可用 TCP 套接字的情况。然后,您仍然面临着将您刚才所做的所有内容放入安装映像中的问题,以便将来安装所有新主机,以及为任何已死且明天必须重建的主机重复此操作。在我们实现基于 r-command 的复制遇到麻烦之后,我们发现它不值得。我们不打算再次使用 r-commands 或任何其他推送机制来管理基础设施。它们的扩展性不如基于拉动的方法。分叉并运行并行作业以尝试在合理的时间内访问许多主机;最后检测并防止在所有出站 rsh 会话中耗尽源计算机上所有可用 TCP 套接字的情况。然后,您仍然面临着将您刚才所做的所有内容放入安装映像中的问题,以便将来安装所有新主机,以及为任何已死且明天必须重建的主机重复此操作。在我们为实现基于 r-command 的复制而遇到的麻烦之后,我们发现它只是不值得。我们不打算再次使用 r-commands 或任何其他推送机制来管理基础设施。它们的扩展性不如基于拉动的方法。最后检测并防止在所有出站 rsh 会话中耗尽源计算机上所有可用 TCP 套接字的情况。然后,您仍然面临着将您刚才所做的所有内容放入安装映像中的问题,以便将来安装所有新主机,以及为任何已死且明天必须重建的主机重复此操作。在我们实现基于 r-command 的复制遇到麻烦之后,我们发现它不值得。我们不打算再次使用 r-commands 或任何其他推送机制来管理基础设施。它们的扩展性不如基于拉动的方法。最后检测并防止在所有出站 rsh 会话中耗尽源计算机上所有可用 TCP 套接字的情况。然后,您仍然面临着将您刚才所做的所有内容放入安装映像中的问题,以便将来安装所有新主机,以及为任何已死且明天必须重建的主机重复此操作。在我们实现基于 r-command …
我在负载均衡器后面运行数百个网络服务器,托管许多不同的站点,其中包含大量应用程序(我无法控制其中的应用程序)。大约每月一次,其中一个网站被黑客入侵,并上传洪水脚本以攻击某些银行或政治机构。过去,这些都是 UDP 泛洪,通过阻止单个 Web 服务器上的传出 UDP 流量可以有效解决。昨天,他们开始使用许多 TCP 连接到端口 80 来从我们的服务器淹没一家大型美国银行。由于这些类型的连接对我们的应用程序完全有效,仅仅阻止它们是不可接受的解决方案。
我正在考虑以下替代方案。你会推荐哪一个?您是否实施了这些,以及如何实施?
当然,我也在寻找方法来最大限度地减少黑客进入我们托管站点的机会,但由于该机制永远不会 100% 防水,我想严格限制入侵的影响。
更新:我目前正在使用这些规则进行测试,这可以防止这种特定的攻击。你会如何建议让它们更通用?当我只对 SYN 数据包进行速率限制时,我是否错过了已知的 TCP DoS 攻击?
iptables -A OUTPUT -p tcp --syn -m limit --limit 100/min -j ACCEPT
iptables -A OUTPUT -p tcp --syn -m limit --limit 1000/min -j LOG --log-prefix "IPTables-Dropped: " --log-level 4
iptables -A OUTPUT -p tcp --syn -j REJECT --reject-with tcp-reset
Run Code Online (Sandbox Code Playgroud)
干杯!
在调试 DNS 问题(显然 UDP 数据包在网络上丢失)时,我遇到了许多(但不是全部)“ethertype Unknown”消息,如下所示。Tcpdump 使用“-n -i 任何端口 53”运行
17:34:43.826196 IP 127.0.0.1.46508 > 127.0.0.1.53: 57861+ A? collector-123.newrelic.com. (44)
17:34:43.826221 IP 127.0.0.1.46508 > 127.0.0.1.53: 20016+ AAAA? collector-123.newrelic.com. (44)
17:34:43.826314 IP 127.0.0.1.53 > 127.0.0.1.46508: 57861 1/0/0 A 50.31.164.223 (60)
17:34:43.826505 IP 82.94.181.250.38280 > 208.78.70.21.53: 4554 AAAA? collector-123.newrelic.com. (44)
17:34:43.826510 Out 00:25:90:4b:94:dc ethertype Unknown (0x0067), length 92:
0x0000: 0000 0800 4500 0048 ef3d 4000 4011 2cab ....E..H.=@.@.,.
0x0010: 525e b5fa d04e 4615 9588 0035 0034 1f02 R^...NF....5.4..
0x0020: 11ca 0000 0001 0000 …
我有 1M 静态重写规则并使用此映射配置。如何确定的最佳值map_hash_max_size和map_hash_bucket_size?我想优化内存消耗。关于这一点的文档非常少。
别人在 Nginx 论坛上问过,但没有回应。
我有 10.1.1.1 和 10.2.2.2 绑定到 eth0。
# ip address show dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 04:01:05:ff:42:01 brd ff:ff:ff:ff:ff:ff
inet 10.2.2.2/24 brd 10.2.2.255 scope global eth0
inet 10.1.1.1/32 scope global eth0
inet6 fe80::601:5ff:feff:4201/64 scope link
valid_lft forever preferred_lft forever
# ip route get 10.1.1.1
local 10.1.1.1 dev lo src 10.1.1.1
Run Code Online (Sandbox Code Playgroud)
问题A:为什么IP绑定到eth0时使用“dev lo”?
我想强制本地连接到 10.1.1.1 的源地址为 10.2.2.2。所以我尝试:
# ip route add 10.1.1.1/32 dev eth0 src 10.2.2.2
# ip route show
default via 10.2.2.1 …Run Code Online (Sandbox Code Playgroud) linux ×3
ansible ×1
chef ×1
debian ×1
docker ×1
memory-usage ×1
networking ×1
nginx ×1
performance ×1
puppet ×1
routing ×1
saltstack ×1