Edited at

Docker compose内のVPNServer(Pritunl)でLocalDNSを解決する


前提

docker-compose内で各種コンテナWebサービスを運用している. nginxのリバースプロキシで各種コンテナWebサービスにURIを割り当てている. VPN接続した際に各種コンテナの各種URIをDNS解決できるように環境を構築してみた.


環境


ネットワーク構成

- ルータ: ポートフォワード: WANIPAddress:12345/udp -> 192.168.0.250:12345/udp

- Local network: 192.168.0.0/24
- Docker host server: 192.168.0.250/24

- Docker network: 192.168.1.0/24
- dnsmasq: 192.168.1.250/24
- Pritunl: 192.168.1.249/24

- Pritunl private network: 192.168.2.0/24
- Pritunl VPN server: 192.168.2.1/24:12345


  • 物理・仮想のネットワークの3階層


    • Local network: 物理ネットワーク

    • Docker network: docker-composeが構築する仮想ネットワーク

    • Pritunl private network: VPN接続に割当てられる, Pritunlが構築する仮想ネットワーク



※自身の環境にあわせてIP・Portは変更してください.


各種ミドルウェア設定


ブロードバンドルータのポートフォワード設定

WAN
LAN

xxx.xxx.xxx.xxx:12345/udp
192.168.0.250:12345/udp


docker-compose.ymlでの各種コンテナ設定


docker-compose.yml

version: '2'

services:
dnsmasq:
image: andyshinn/dnsmasq
container_name: dnsmasq
hostname: dnsmasq
ports:
- 53:53/udp
- 53:53/tcp
volumes:
- ./volumes/dnsmasq/etc/dnsmasq.conf:/etc/dnsmasq.conf:ro
- ./volumes/dnsmasq/etc/hosts:/etc/hosts:ro
- ./volumes/dnsmasq/etc/resolv.conf:/etc/resolv.conf:ro
networks:
default:
ipv4_address: 192.168.1.250
restart: always
cap_add:
- NET_ADMIN

nginx:
image: nginx
container_name: nginx
hostname: nginx
ports:
- 80:80/tcp
- 443:443/tcp
volumes:
- ./volumes/nginx/etc/nginx/nginx.conf:/etc/nginx/nginx.conf:ro
- ./volumes/nginx/etc/nginx/conf.d/proxy.conf:/etc/nginx/conf.d/proxy.conf:ro
- /etc/localtime:/etc/localtime:ro
restart: always

pritunl:
image: jippi/pritunl
container_name: pritunl
hostname: pritunl
ports:
- Webコンソールポート:Webコンソールポート/tcp
- 1194:1194/tcp
- 12345:12345/udp ※PritunlのVPNサーバのPort
volumes:
- /etc/localtime:/etc/localtime:ro
networks:
default:
ipv4_address: 192.168.1.249
privileged: true
restart: always

###########################
# 色々なコンテナ定義

networks:
default:
ipam:
config:
- subnet: 192.168.1.0/24



  • dnsmasqでDNSを定義する

  • nginxでリバースプロキシを定義する


Pritunl Server Setting

項目

備考

Name
xxxxxx
任意

Port
12345
任意

Protocol
UDP
任意

DNS Server
192.168.1.250
dockerネットワーク内のDNSサーバ

Virtual Network
192.168.2.0/24
任意

項目

備考

Route
192.168.0.0/16
任意


所感

PritunlのPrivateNetworkからLocalNetworkのDNSサーバ(docker container)へ接続できなかったので, PritunelのPrivateNetworkからDockerNetworkのDNSサーバへ接続を試みると成功した. とりあえず, 外出先でも自宅同様に作業できる環境ができた. DockerNetwork, PritunlのPrivateNetworkの通信周りの理解が曖昧なので, そろそろ書籍などで体系的に勉強していこう.


参考文献