分类: Docker

Armbian使用Docker安装IPsec VPN 服务器

项目地址:https://github.com/hwdsl2/setup-ipsec-vpn
首先获取镜像

docker pull hwdsl2/ipsec-vpn-server

创建配置文件config.env

# Note: All the variables to this image are optional.
# See README for more information.
# To use, uncomment and replace with your own values.

# Define IPsec PSK, VPN username and password
# - DO NOT put "" or '' around values, or add space around =
# - DO NOT use these special characters within values: \ " '
VPN_IPSEC_PSK=密钥
VPN_USER=账号
VPN_PASSWORD=密码

# Define additional VPN users
# - DO NOT put "" or '' around values, or add space around =
# - DO NOT use these special characters within values: \ " '
# - Usernames and passwords must be separated by spaces
# VPN_ADDL_USERS=additional_username_1 additional_username_2
# VPN_ADDL_PASSWORDS=additional_password_1 additional_password_2

# Use a DNS name for the VPN server
# - The DNS name must be a fully qualified domain name (FQDN)
# VPN_DNS_NAME=vpn.example.com

# Specify a name for the first IKEv2 client
# - Use one word only, no special characters except '-' and '_'
# - The default is 'vpnclient' if not specified
# VPN_CLIENT_NAME=your_client_name

# Use alternative DNS servers
# - By default, clients are set to use Google Public DNS
# - Example below shows Cloudflare's DNS service
# VPN_DNS_SRV1=1.1.1.1
# VPN_DNS_SRV2=1.0.0.1

# Protect IKEv2 client config files using a password
# - By default, no password is required when importing IKEv2 client configuration
# - Uncomment if you want to protect these files using a random password
# VPN_PROTECT_CONFIG=yes

运行镜像

docker run -d \
    -p 500:500/udp \
    -p 4500:4500/udp \
    --privileged=true \ # 特权模式运行
    --restart=always \  # 开启自启动
    --name ipsec-vpn-server \
    --env-file /home/iuu/Software/Docker/ipsec-vpn-server/config.env \ # 加载配置文件
    -v /home/iuu/Software/Docker/ipsec-vpn-server/ikev2-vpn-data:/etc/ipsec.d \
    -v /lib/modules:/lib/modules:ro \ # 挂载运行库目录 但是只有只读权限
    hwdsl2/ipsec-vpn-server

启动容器后查看容器状态
防火墙开4500 500 UDP端口
如果是内网穿透,路由器也得做对应的端口转发

Docker的三种网络代理配置

众所周知的原因,Docker最近需要使用代理。
Docker的代理配置,略显复杂,因为有三种场景。 但基本原理都是一致的,都是利用Linux的http_proxy等环境变量。

Dockerd 代理

在执行docker pull时,是由守护进程dockerd来执行。 因此,代理需要配在dockerd的环境中。 而这个环境,则是受systemd所管控,因此实际是systemd的配置。
修改docker 的docker.service文件
Service节点下新增代理环境变量配置
我的文件位置是:/lib/systemd/system/docker.service

[Service]
Environment="HTTP_PROXY=http://127.0.0.1:1080"
Environment="HTTPS_PROXY=http://127.0.0.1:1080"

dockerd代理的修改比较特殊,它实际上是改systemd的配置,因此需要重载systemd并重启dockerd才能生效。

systemctl daemon-reload
systemctl restart docker.service

Container 代理

在容器运行阶段,如果需要代理上网,则需要配置~/.docker/config.json。 以下配置,只在Docker 17.07及以上版本生效。

{
 "proxies":
 {
   "default":
   {
     "httpProxy": "http://proxy.example.com:8080",
     "httpsProxy": "http://proxy.example.com:8080",
     "noProxy": "localhost,127.0.0.1,.example.com"
   }
 }
}

这个是用户级的配置,除了proxies,docker login等相关信息也会在其中。 而且还可以配置信息展示的格式、插件参数等。
此外,容器的网络代理,也可以直接在其运行时通过-e注入http_proxy等环境变量。 这两种方法分别适合不同场景。 config.json非常方便,默认在所有配置修改后启动的容器生效,适合个人开发环境。 在CI/CD的自动构建环境、或者实际上线运行的环境中,这种方法就不太合适,用-e注入这种显式配置会更好,减轻对构建、部署环境的依赖。 当然,在这些环境中,最好用良好的设计避免配置代理上网。

docker build代理

虽然docker build的本质,也是启动一个容器,但是环境会略有不同,用户级配置无效。 在构建时,需要注入http_proxy等参数。

docker build . \
    --build-arg "HTTP_PROXY=http://proxy.example.com:8080/" \
    --build-arg "HTTPS_PROXY=http://proxy.example.com:8080/" \
    --build-arg "NO_PROXY=localhost,127.0.0.1,.example.com" \
    -t your/image:tag

注意:无论是docker run还是docker build,默认是网络隔绝的。 如果代理使用的是 localhost:3128 这类,则会无效。 这类仅限本地的代理,必须加上--network host才能正常使用。 而一般则需要配置代理的外部IP,而且代理本身要开启gateway模式。

代理配置完成后,reboot重启当然可以生效,但不重启也行。

docker build代理是在执行前设置的,所以修改后,下次执行立即生效。
Container代理的修改也是立即生效的,但是只针对以后启动的Container,对已经启动的Container无效。

在 Linux 上使用 Docker 安装 Portainer CE

首先,创建 Portainer Server 用于存储其数据库的卷:

docker volume create portainer_data

然后,下载并安装 Portainer Server 容器:

docker pull portainer/portainer-ce

启动容器

docker run -d \
-p 8000:8000 \
-p 9000:9000 \
-p 9443:9443 \
--name portainer \
--restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \ # Dockeer的套接字映射
-v portainer_data:/data \ # 存贮卷映射
portainer/portainer-ce:latest

容器启动后浏览器访问 http://IP:9000 即可

Docker网络的学习

  • 用户是使用Docker Client与 Docker Daemon建立通信,并发送请求给后者
  • Docker Daemon作为Docker架构中主体部分,首先提供Docker Server的功能使其可以接受Docker Client的请求
  • Docker Engine执行Docker内部的一系列工作,每一项工作都是以Job的形式存在
  • Job的运行过程中,当需要容器镜像时则从Docker Registry中下载镜像,并通过镜像管理驱动Graph driver将下载镜像以Graph的形式存储
  • 当需要为Docker创建网络环境时,通过网络管理驱动Network driver 创建并配置Docker容器网络环境
  • 当需要限制Docker容器运行资源或执行用户指令等操作时,则通过Exec driver来完成
  • Libcontainer是一项独立的容器管理包,Network driver以及Exec driver都是通过Libcontainer来实现具体对容器进行的操作

操作系统本身网络

  • 桥接模式 - 直接连接物理网络
  • NAT模式 - 用于共享主机的IP地址
  • 仅主机模式 - 与主机共享的专用网络
  • 用户自定义模式 - 特定的虚拟网络

docker 不启动 默认网络情况

docker 启动后 网络情况
docker 启动后会产生一个名为docker0的虚拟网桥

ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        inet6 fe80::42:e9ff:fee5:668a  prefixlen 64  scopeid 0x20<link>
        ether 02:42:e9:e5:66:8a  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 3  bytes 266 (266.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Docker 网络的常用命令

默认创建3大网络模式
bridge 网桥模式
host  主机网络
none 无网络
还有两种:
容器模式
自定义模式
共计5种

docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
f14cce59440e   bridge    bridge    local
b171456906be   host      host      local
73342418fb83   none      null      local

查看命令帮助
docker network --help 
创建网络
docker network create a_network
删除网络 
docker network rm a_network
查看网络数据源
docker network inspect bridge

Docker 网络能干啥

容器间的互联和通信以及端口映射
容器IP变动的时候可以通过服务名直接网络通信而不收到影响

Docker 网络模式

默认三大网络模式 共计5种
bridge 网桥模式
host 主机网络
none 无网络
容器模式
自定义模式

bridge

为每个容器分配、设置IP等,并将容器连接到一个docker0的虚拟网桥,默认为该模式
bridge模式:使用--network bridge 指定,默认使用docker0

host

容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口
host模式:使用--network host 指定

none

容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配veth pair和网桥连接,IP等
none模式:使用--network none指定

container

新创建的容器不会创建自己的网卡和配置自己的IP,而是和一个指定的容器共享IP、端口范围等。
container模式:使用--network container:NAME或者容器ID指定

自定义模式

Docker虚悬镜像

虚悬镜像就是仓库名、标签都是的镜像,俗称dangling image
查看系统的虚悬镜像

docker image ls -f dangling=true

虚悬镜像已经失去存在价值,可以删除

docker image prune
1 2