我正在创建一个仅限 SFTP 的Docker容器,该容器将由多人使用,其唯一目的是在他们自己的chrooted 环境中上传和管理文件。
从理论上讲,它非常安全:我将禁用所有形式的bash登录,并且不会在其中运行任何其他进程。但是,我想再加强一点:
我想阻止这个容器从内部访问 Internet,除了它作为 SFTP 服务器的目的。
澄清一下:我知道如何防止外部世界访问我的容器——我可以设置传入iptables规则,并且我只能在我的 docker run 命令中公开 SFTP 端口。
但是,当在容器内运行时,我想让以下命令(作为示例)失败:
curl google.com
Run Code Online (Sandbox Code Playgroud)
我的目的是减少被黑容器可能造成的损害(不能用于发送垃圾邮件等)。
我有一个 docker 容器运行如下:
docker run --name some_container_1 -p 8080:80 -d some_image
Run Code Online (Sandbox Code Playgroud)
哪个工作正常。容器将它的端口 80 公开到 8080,并且可以从本地主机访问。
然而,出于某种原因,它完全忽略了 INPUT iptables 规则,并且也可以从外部访问。
如何限制对我的 Docker 容器的访问,只允许 ie IP 123.456.789.0 从外部访问它?
谢谢。
须藤 iptables -L -n -v --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
2 365 23380 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
3 0 0 ACCEPT tcp -- * …Run Code Online (Sandbox Code Playgroud) 我的具体情况如下。我使用特定的cpuset启动一个docker容器:
docker run --cpuset-cpus="0-2" # ...
Run Code Online (Sandbox Code Playgroud)
在该容器内,我运行一个 shell 脚本作为入口点,该 shell 脚本将make在某个时候运行。我想弄清楚有多少工作(-j)。我当然可以通过环境传递已分配 CPU 的数量,但更喜欢自动检测它的方法。
我知道我可以使用taskset -c -p $$或cat /proc/self/status | grep Cpus_allowed_list检索Cpus_allowed当前进程的 ,但我不知道如何检索允许的 CPU 的实际数量。我想避免解析这些命令的输出或摆弄Cpus_allowed掩码,但会在没有选项时这样做。
背景资料
我有一个带有两个运行 Docker 的网络接口的服务器。Docker 和一些虚拟化工具一样,创建了一个名为docker0. 默认情况下,此接口配置了一个 IP,172.17.42.1所有 Docker 容器都使用此接口作为网关进行通信,并分配了相同/16范围内的IP 地址。据我了解,所有进出容器的网络流量都经过 NAT,因此出站流量似乎来自172.17.42.1,入站流量则发送到172.17.42.1.
我的设置看起来像这样:
+------------+ /
| | |
+-------------+ Gateway 1 +-------
| | 10.1.1.1 | /
+------+-------+ +------------+ |
| eth0 | /
| 10.1.1.2 | |
| | |
| DOCKER HOST | |
| | | Internet
| docker0 | |
| (bridge) | |
| 172.17.42.1 | |
| | |
| eth1 | |
| 192.168.1.2 …Run Code Online (Sandbox Code Playgroud) 我正在尝试查看是否可以在 docker 容器(在容器中运行 arch linux)中运行 systemd。
我启动 docker 的所有功能,并在 cgroups 中绑定 mount:
docker run -it --rm --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro ..
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试运行 systemd 二进制文件:
Trying to run as user instance, but the system has not been booted with systemd.
Run Code Online (Sandbox Code Playgroud)
试图找出如何正确地将东西初始化到 systemd 开始。
我有一个 Dockerfile:
ENTRYPOINT ["uwsgi", "--ini /home/docker/app/uwsgi_app.ini"]
Run Code Online (Sandbox Code Playgroud)
(没有CMD)
当我运行时 uwsgi 正确地抱怨:
uWSGI running as root, you can use --uid/--gid/--chroot options
*** WARNING: you are running uWSGI as root !!! (use the --uid flag) ***
Run Code Online (Sandbox Code Playgroud)
现在,我认为我可以通过docker run如下方式将参数附加到入口点:
$ docker run -itP uwsgi_app:0.1 --uid=docker
Run Code Online (Sandbox Code Playgroud)
然而 uwsgi 仍然抱怨同样的错误,似乎没有附加 arg。
如果我覆盖入口点,则添加 arg:
$ docker run -itP --entrypoint bash uwsgi_app:0.1 --uid=docker
bash: --uid=docker: invalid option
Run Code Online (Sandbox Code Playgroud)
...我想知道这是否是 uwsgi--ini忽略其他参数的选项,但事实并非如此:
$ docker run -itP --entrypoint bash uwsgi_app:0.1
[ root@88941de25b1f:/home/docker ]$ uwsgi --ini /home/docker/app/uwsgi_app.ini …Run Code Online (Sandbox Code Playgroud) 我在 Bash 中运行以下命令:
DEBIAN_FRONTEND=noninteractive apt-get update -qq \
&& apt-get install -y build-essential git libncurses5-dev openssl \
libssl-dev fop xsltproc unixodbc-dev curl
Run Code Online (Sandbox Code Playgroud)
它运行,但在中间失败:
Get:96 http://security.debian.org/ jessie/updates/main linux-libc-dev amd64 3.16.7-ckt9-3~deb8u1 [991 kB]
Get:97 http://security.debian.org/ jessie/updates/main curl amd64 7.38.0-4+deb8u2 [200 kB]
Get:98 http://security.debian.org/ jessie/updates/main openjdk-7-jre amd64 7u79-2.5.5-1~deb8u1 [176 kB]
Get:99 http://http.debian.net/debian/ jessie/main libgtk2.0-0 amd64 2.24.25-3 [2301 kB]
Err http://http.debian.net/debian/ jessie/main dpkg-dev all 1.17.25
Error reading from server. Remote end closed connection [IP: 176.9.184.93 80]
Get:100 http://http.debian.net/debian/ jessie/main libatk-wrapper-java all 0.30.5-1 [30.3 kB] …Run Code Online (Sandbox Code Playgroud) 我在 docker 中启用 IPv6 时遇到了严重的问题。
但是,我无法从容器内访问外部世界!使用以下参数重新启动 docker 后,我的 docker0 网桥没有 IPv6 地址。也没有路由,也没有网关(没有 ipv6 地址就没有意义)。
我的 Docker 设置:Docker 是使用 DOCKER_OPTS 中的这些参数启动的
DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 --ipv6 --fixed-cidr-v6=w:x:y:z:a::/80"
Run Code Online (Sandbox Code Playgroud)
一些 ipv6 主机配置参数:
net.ipv6.conf.all.forwarding = 1
net.ipv6.conf.default.forwarding = 1
Run Code Online (Sandbox Code Playgroud)
这是我自己创建的网络之一:
root@wopr:~# docker network inspect wopr6
[
{
"Name": "wopr6",
"Id": "ddc192d4af2a8edc809975e84cf3e4cb82c24d4cfe970dd8e3fc7d6ff31e20ee",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": true,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": …Run Code Online (Sandbox Code Playgroud) 我无法完全理解我的 AWS ECS Docker Hub 映像的映像[registry-url]/[namespace]/[image]:[tag]URL 。
使用 Docker 客户端,它只是docker run -it hendry/count.
那么 Docker Hub 的镜像 URL 是什么?
docker ×10
debian ×2
amazon-ecs ×1
arch-linux ×1
bridge ×1
gateway ×1
iptables ×1
ipv6 ×1
linux ×1
networking ×1
route ×1
scheduling ×1
security ×1
sftp ×1
source ×1
ssh ×1
systemd ×1
windows ×1