ã¯ããã«
è©¦ç¨æéãç¡äºã«ä¹ãè¶ãã
ãä¹ ãã¶ãã§ããä»å¹´ã®7æãããããã¤ã³ã¿ã¼ãããã§åãå§ãã¦ããã¾ããã
å
æã§è©¦ç¨æéãçµããã仿ããæ£å¼æ¡ç¨ã¨ãªãã¾ããã
ç¡äºã«è©¦ç¨æéãä¹ãåãã¦ä¸å®å¿ã§ãã
æ 彿¥åã¯?
æå±é¨ç½²ã¯ããã¾ã§éãSRE室ã§ãã
ãã¹ã§ããkazeburoãããã¯ããé ¼ãããååãã¡ã«å²ã¾ãã¦æ¯æ¥æ¥½ããä»äºãã¦ããã¾ãã
ãããªä¸ã§ã®ç§ã®æ¥åã¯ã¨ããã¨ãå¼ãç¶ãUsacloudãTerraformãããã¤ãã¼ã¨ãã£ãOSSã®éçºããã¤ã¤SREã¨ãã¦ã®æ¥åãæ å½ãã¦ãã¾ãã
Embedded SRE/Enabling SREã¨ãã¦ãéçº/éç¨ã®ä¸¡è ãå ±éã®ã´ã¼ã«ããã£ã¦ãéç¨æ§ã«åªããã½ããã¦ã§ã¢ãéçºãã¹ããã¾ãã¾ãªåãçµã¿ããã¦ãã¾ãã
仿¥ã¯æè¿ã®SREã¨ãã¦ã®åãçµã¿ã®ä¸ããããããã¤ã®èªååã«ã¾ã¤ãã話ãç´¹ä»ããã¦ããã ãã¾ãã
æ¬é¡: wireproxyã§Dockerã³ã³ããå ããWireGuard VPNã«ç¹ã
SREã¨ãã¦ã®åãçµã¿ã®ä¸ç°ã¨ãã¦ãããã¾ã§æåã§è¡ããã¦ããã¨ããã¢ããªã±ã¼ã·ã§ã³ã®ãããã¤ä½æ¥ãèªååãã¾ããã
CI/CDã¨ããåãçµã¿ã¯æ¢ã«ä¸è¬çã«åºã¾ã£ã¦ãããç§èªèº«ããã¾ã§ä½åº¦ããããã¤ã®èªååãè¡ãªã£ã¦ãã¾ããã
ä»å対象ã«ããã¢ããªã±ã¼ã·ã§ã³ã¯æ¯è¼çå°è¦æ¨¡ã§åç´ãªGo製ã®ã¢ããªã±ã¼ã·ã§ã³ã§ããã®ã§ãå²ã¨ãããªãã¨èªååã§ããã ããã¨æã£ã¦ããã®ã§ããå°ã
å¼ã£ãããç¹ãããã¾ããã
ã¨ããã®ããä»åã®ãããã¤å¯¾è±¡ãµã¼ãã¸ã¯WireGuard VPNãçµç±ãã¦æ¥ç¶ããå¿ è¦ããããããã«ãããã¤ã«ç¨ãã¦ããDroneä¸ã§èµ·åãããDockerã³ã³ãããããããè¡ãå¿ è¦ãããã¨ããã®ãé£ç¹ã§ããã
wireproxyã¨ãããã¼ã«ãä½µç¨ãããã¨ã§ãã®åé¡ã解決ãã¾ããã®ã§ä»¥ä¸ã§ä»åã®ã·ã¹ãã æ§æãä½¿ãæ¹ã¾ã§å«ãã¦ç´¹ä»ãã¾ãã
ä»åã®ã·ã¹ãã æ§æ
ä»åã®æ§æã¯ä»¥ä¸ã®éãã§ãã
- ã½ã¼ã¹ã³ã¼ã管ç: GitHub Enterprise(GHE)
- CI/CD: Drone
- VPN: WireGuard
ã¢ããªã±ã¼ã·ã§ã³ã®ã½ã¼ã¹ã³ã¼ãã¯ç¤¾å
ãããã¯ã¼ã¯ä¸ã®GHEã«ç½®ããã¦ãããCI/CDã«ã¯åãã社å
ãããã¯ã¼ã¯ä¸ã«ãããDroneãå©ç¨ãã¦ãã¾ãã
Droneã§ã¯Dockerãã¤ãã©ã¤ã³ãå©ç¨ãã¦ãã¾ãã
ä»åãããã¤å¯¾è±¡ã®ã·ã¹ãã ã¯ãããã®ã¯ã©ã¦ãã«ç½®ãã¦ãããVPCã«ã¼ã¿ãç¨ãã¦VPCãæ§ç¯ããã®ä¸ã«ãµã¼ããè¤æ°å°ç½®ãã¨ããæ§æã§ãã
VPCã«ã¼ã¿ã®WireGuardãµã¼ãæ©è½ã§VPNãæ§ç¯ãã¦ãã
ä»åã®æ§æã§ã¯VPNã®ããã«VPCã«ã¼ã¿ã®WireGuardãµã¼ãæ©è½ãå©ç¨ãã¦ãã¾ãã VPCã®ä¸ã®ãµã¼ãã«ã¯å¤é¨ããç´æ¥SSHæ¥ç¶åºæ¥ãªãããã«ãã¦ãããVPCã«ã¼ã¿ã¨WireGuardã§VPNæ¥ç¶ãã¦ãããµã¼ãã«æ¥ç¶ããå½¢ã¨ãªã£ã¦ãã¾ãã
ãµã¼ãä¸ã§åããã¢ããªã±ã¼ã·ã§ã³ã¯Web APIãæä¾ãããã®ã§ãã¯ã©ã¤ã¢ã³ãããã®ã¢ã¯ã»ã¹çµè·¯ã¯å¥é確ä¿ããå¿ è¦ãããã¾ãããä»åã®ãããã¤ã®è©±ã«ã¯é¢ä¿ãªãã®ã§è¨è¼ãçç¥ãã¾ããã
åé¡: Dockerããã©ããã£ã¦WireGuard VPNã«ç¹ã?
æ®éã«docker run
ããã¨ã¨ã©ã¼ã«ãªã
ä¸è¨ã®éããVPCã®ä¸ã®ãµã¼ãã«SSHæ¥ç¶ããã«ã¯ã¾ãWireGuardã§VPNæ¥ç¶ããå¿
è¦ãããã¾ãã
ãããDroneã®Dockerãã¤ãã©ã¤ã³ãããããã¨ããã¨ã¨ã©ã¼ã«ãªã£ã¦ãã¾ãã¾ãã
以ä¸ã¯æå ã§ã¨ã©ã¼ãåç¾ãã¦ã¿ããã®ã§ãã
# docker run -it --rm ubuntu:22.04 # å¿ è¦ãªãã®ãã¤ã³ã¹ãã¼ã« $ apt-get update; apt-get install -y iproute2 wireguard # ã¤ã³ã¿ã¼ãã§ã¼ã¹ä½æ $ ip link add dev wg0 type wireguard RTNETLINK answers: Operation not permitted
RTNETLINK answers: Operation not permitted
ã£ã¦æããã¦ãã¾ãã¾ããã
権éãè¶³ããªã -> --cap-add NET_ADMIN
or --privileged
ã§å®è¡ã§ãã
ããã¯æ¨©éãè¶³ããªãããã§ãdocker run
ããæã«--cap-add NET_ADMIN
ãæå®ãããã¨ã§å®è¡ã§ããããã«ãªãã¾ãã
åè: Docker run ãªãã¡ã¬ã³ã¹ - Linuxã±ã¤ãããªãã£
--privileged
ã§ãè¯ãã§ãããä¸è¦ãªæ¨©éã¯ä¸ããªãæ¹ãè¯ãã§ãããã
Dockerã®ããã¥ã¡ã³ãã«ã以ä¸ã®ããã«æ¸ããã¦ã¾ãã
ãããã¯ã¼ã¯ã»ã¹ã¿ãã¯ã¨ããã¨ãããã«ã¯ã --privileged ãä½¿ãæ¿ããã«ããããã¯ã¼ã¯ã»ã¤ã³ã¿ã¼ãã§ã¼ã¹ã®å¤æ´ã«ã¯ --cap-add=NET_ADMIN ã使ãã¹ãã§ãããã
Dockerã¯OKãæ¬¡ã«Droneã§ã¯ã©ãããã°ãã?
Droneã--cap-addç¸å½ã®ãã¨ãã§ããè¨å®ãããã°ããããã§ãã
ãããããã¥ã¡ã³ããè¦ãéãã©ãã--cap-add
ã¯åºæ¥ãªãããã§ãã
代ããã«--privileged
ã§ããã°æå®ã§ãã¾ãããDroneä¸ã§è©²å½ãªãã¸ããªãTrustedã¨ãã¦ãã¼ã¯ããå¿
è¦ãããã¾ãã
(åãªãã¸ããªã®Settings
ããè¨å®å¯è½ã§ã)
ããã§ä¸å¿å¯¾å¿åºæ¥ãã¨ã¯ãããããã¤ã®ããã«ã³ã³ããã¸ç¹æ¨©ãä¸ããããªãã§ãã
ã¨ãããã¨ã§å¥ã®æ¹æ³ãæ¢ãã¾ãã
å¥ã®æ¹æ³: wireproxyã使ã
ãã®ä»¶ã«ã¤ãã¦SREå®¤ã®æä¼(æ¥åå 容ã®å ±æã ã£ããéè«ãããããä¼)ã§è©±é¡ã«åºããã¨ãããkazeburoãããããwireproxyã¨ããã®ãããããã¨æãã¦ããã ãã¾ããã
wireproxyã¨ã¯
READMEã«ã¯wireproxy is a completely userspace application that connects to a wireguard peer, and exposes a socks5 proxy
ã¨æ¸ããã¦ãã¾ãã
ã©ãå®è£
ããã¦ããã®ã§ãããã?
ãã£ã¨è¦ãã¨ãã以ä¸ã®ãã®ã使ã£ã¦ã¦ã¼ã¶ã¼ã¹ãã¼ã¹ã§ã®å®è£ ãå®ç¾ãã¦ããããã§ãã
- tunããã¤ã¹: wireguard-go/tun/netstack -> gVisorã®TCP/IPã¹ã¿ãã¯ãç¨ããtunã®å®è£
- WireGuardãããã³ã«ã®å®è£ : wireguard-go
wireguard-go/tun/netstackã«ã¤ãã¦ã¯ãã¡ãã®è¨äºã§ã触ãããã¦ãã¾ããã
0x6b.github.io
ãããªã--cap-add NET_ADMIN
ããªãã¦ã大ä¸å¤«ããã§ãã
ã¡ãªã¿ã«SOCKS5ãããã·ã®å®è£ ã«ã¯ãã¡ãã使ããã¦ãã¾ãã
- SOCKS5ãããã·: github.com/armon/go-socks5
ã¨ãããã¨ã§æ©é試ãã¦ã¿ã¾ãã
wireproxyãæå ãã試ãã¦ã¿ã
WireGuardã®ã¯ã©ã¤ã¢ã³ãè¨å®ãã¡ã¤ã«ãç¨æãã
wireproxyã¯WireGuardã¯ã©ã¤ã¢ã³ãè¨å®ãã¡ã¤ã«ãèªã¿è¾¼ãã¾ãã®ã§ãã¾ãã¯åãã¯ã©ã¤ã¢ã³ãè¨å®ãã¡ã¤ã«ãç¨æããä¸ã§wireproxyã®è¨å®ã¨ããæé ã§é²ãã¾ãã ã¾ãWireGuardã¯ã©ã¤ã¢ã³ãè¨å®ãã¡ã¤ã«ãç¨æãããã®è¨å®ã§WireGuardã«ç¹ãããã¨ã確èªãã¾ãã
ä»åã¯ä»¥ä¸ã®ãããªæãã§ç¨æãã¾ããã
$ vi wg0.conf [Interface] PrivateKey = xxx Address = 192.168.0.11/32 [Peer] PublicKey = xxx AllowedIPs = 192.168.0.0/24 Endpoint = 192.0.2.1:51820 PersistentKeepalive = 25
ããã§ç¹ãããDockerã§è©¦ãã¦ã¿ã¾ãã--cap-add NET_ADMIN
ãã¤ããã®ãå¿ããªãããã«ãã¾ãã
# wg0.confãç½®ãããã£ã¬ã¯ããªã§å®è¡ $ docker run -it --rm --cap-add NET_ADMIN -v $PWD:/etc/wireguard -v ~/.ssh:/root/.ssh ubuntu:latest # å¿ è¦ãªãã®ãã¤ã³ã¹ãã¼ã« $ apt-get update; apt-get install -y iproute2 wireguard openssh-client # WireGuardã§VPNæ¥ç¶ãã¦ã¿ã $ wg-quick up wg0 # 確èª: VPCå ã®ãµã¼ãã¸SSHãã¦ã¿ã $ ssh user@192.168.0.x
è¨å®ãæ£ãããã°ç¹ããã¯ãã§ãã
WireGuardã¯ã©ã¤ã¢ã³ãè¨å®ãã¡ã¤ã«ãåç §ããããã«wireproxyã®è¨å®ãã¡ã¤ã«ã使
次ã«å
ã»ã©åä½ç¢ºèªããWireGuardã¯ã©ã¤ã¢ã³ãè¨å®ãã¡ã¤ã«ãåç
§ãããããªå½¢ã§wireproxyã®è¨å®ãã¡ã¤ã«ã使ãã¾ãã
ä»åã®wireproxyã®è¨å®ãã¡ã¤ã«ã¯ä»¥ä¸ã®ãããªæ§æã¨ãªãã¾ãã
# WireGuardã®ã¯ã©ã¤ã¢ã³ãè¨å®ãã¡ã¤ã«ã¸ã®ãã¹ WGConfig = /path/to/wg0.conf # 以ä¸ã§wireproxyã®è¨å® [Socks5] BindAddress = 127.0.0.1:1080
wireproxyã«ã¯TCPClientTunnel
ã¨TCPServerTunnel
ãSocks5
ã¨ããè¨å®é
ç®ãããã¾ãããä»åã¯Socks5
ãå©ç¨ãã¾ãã
Socks5
ãå©ç¨ããã¨ãæå®ããã¢ãã¬ã¹ã§ãªãã¹ã³ããSOCKS5ãããã·ãèµ·åãã¦ããã¾ãã
sshã³ãã³ãããã¯ProxyCommand='nc -X 5 -x 127.0.0.1:1080 %h %p'
ã®ããã«æå®ãããã¨ã§SOCKS5ãããã·ãå©ç¨ã§ãã¾ãã
ã¨ãããã¨ã§åä½ç¢ºèªãã¦ã¿ã¾ããããä»åº¦ã¯--cap-add
ä¸è¦ã§ãã
# wg0.confãç½®ãããã£ã¬ã¯ããªã§å®è¡ $ docker run -it --rm -v $PWD:/etc/wireguard -v ~/.ssh:/root/.ssh ubuntu:latest # å¿ è¦ãªãã®ãã¤ã³ã¹ãã¼ã« $ apt-get update; apt-get install -y iproute2 wireguard openssh-client curl netcat # wireproxyããã¦ã³ãã¼ã&ã¤ã³ã¹ãã¼ã« $ curl -LO https://github.com/octeep/wireproxy/releases/download/v1.0.5/wireproxy_linux_amd64.tar.gz $ tar zxvf wireproxy_linux_amd64.tar.gz && rm wireproxy_linux_amd64.tar.gz $ install wireproxy /usr/local/bin # wireproxyç¨ã®è¨å®ãã¡ã¤ã«ã使 $ vi proxy.conf WGConfig = /path/to/wg0.conf [Socks5] BindAddress = 127.0.0.1:1080 # wireproxyããã¼ã¢ã³ã¢ã¼ãã§èµ·å $ wireproxy -d -c proxy.conf # SSHæ¥ç¶ãã¦ã¿ã $ ssh -o ProxyCommand='nc -X 5 -x 127.0.0.1:1080 %h %p' user@192.168.0.x
ããã§ãã¾ãåãã¾ããããããªãDroneä¸ã§Trustedã«ãããprivileged: true
ã«ãããããªãã¦ãåãããã§ãã
Droneãã使ããããã«Dockerfile使
Droneãã使ãããã®ã§Dockerfileãä½ã£ã¦ããã¾ããããããã«ããã¦ã¬ã¸ã¹ããªã«ããã·ã¥ãã¦ããã¾ãã
$ vi Dockerfile FROM ubuntu:latest ENV DEBIAN_FRONTEND noninteractive RUN apt-get update \ && apt-get -y install \ iproute2 \ wireguard \ openssh-client \ curl \ netcat \ && apt-get clean \ && rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/* \ && curl -LO https://github.com/octeep/wireproxy/releases/download/v1.0.5/wireproxy_linux_amd64.tar.gz \ && tar zxvf wireproxy_linux_amd64.tar.gz \ && rm wireproxy_linux_amd64.tar.gz \ && install wireproxy /usr/local/bin ADD deploy.sh /deploy.sh
deploy.shã¯ä»¥ä¸ã®å¤ãç°å¢å¤æ°ã§åãåãå½¢ã«ãã¾ããã
- WG_CONF: WireGuardã¯ã©ã¤ã¢ã³ãè¨å®ãã¡ã¤ã«ã®å 容
- SSH_USER_NAME: SSHæ¥ç¶æã®ã¦ã¼ã¶ã¼å
- SSH_PRIVATE_KEY: SSHããã®ç§å¯éµ
- TARGET_HOSTS: 対象ãã¹ã(ã¹ãã¼ã¹åºåã)
ä»åã¯scp/sshã³ãã³ãããã¿æ¸ããã¦ã¾ããããã®è¾ºãæ¸ãç´ãã°ããå°ãæ±ç¨çã«ä½¿ããã¯ãã§ãã
#!/bin/sh set -e if [ -z "$WG_CONF" ]; then echo "\$WG_CONF is required" exit 1 fi if [ -z "$SSH_USER_NAME" ]; then echo "\$SSH_USER_NAME is required" exit 1 fi if [ -z "$SSH_PRIVATE_KEY" ]; then echo "\$SSH_PRIVATE_KEY is required" exit 1 fi if [ -z "$TARGET_HOSTS" ]; then echo "\$TARGET_HOSTS is required" exit 1 fi # å種ãã¡ã¤ã«ãçæ echo "$WG_CONF" > wg0.conf echo "$SSH_PRIVATE_KEY" > /deploy_key; chmod 0600 /deploy_key cat << EOL > proxy.conf WGConfig = wg0.conf [Socks5] BindAddress = 127.0.0.1:1080 EOL # wireproxyèµ·å wireproxy -d -c proxy.conf # æ¥ç¶å®äºããã¾ã§æ°ç§å¾ 㤠sleep 5 for host in $TARGET_HOSTS; do # scpã§ãã¡ã¤ã«ãéãè¾¼ãã ã scp -i /deploy_key -o StrictHostKeyChecking=no -o ProxyCommand='nc -X 5 -x 127.0.0.1:1080 %h %p' ./your-application-file ${SSH_USER_NAME}@${host}:/path/to/your/application # sshã§ä½ãããã ssh -i /deploy_key -o StrictHostKeyChecking=no -o ProxyCommand='nc -X 5 -x 127.0.0.1:1080 %h %p' ${SSH_USER_NAME}@${host} : do something done
Droneã®è¨å®
æå¾ã«Droneã§ãã®Dockerã¤ã¡ã¼ã¸ã使ã£ã¦ãããã¤ããããã«è¨å®ãã¾ãã
$ vi .drone.yml --- kind: pipeline type: docker name: deploy # ã¿ã°ãããªã¬ã¼ã¨ãã trigger: ref: - refs/tags/** steps: # ...ä¸ç¥... - name: deploy image: your-image:tags environment: WG_CONF: from_secret: WG_CONF SSH_USER_NAME: from_secret: SSH_USER_NAME SSH_PRIVATE_KEY: from_secret: SSH_PRIVATE_KEY TARGET_HOSTS: from_secret: TARGET_HOSTS
ããã§GHEã«ã¿ã°ãpushããã¨WireGuardçµç±ã§ãããã¤ãè¡ããããã«ãªãã¾ããã
çµããã«
ã¨ãããã¨ã§wireproxyã使ã£ã¦Dockerãã--cap-add
ãªãã§WireGuard VPNã«ç¹ãã§ãããã¤ããããã«ãã話ãç´¹ä»ãã¾ããã
Droneç¹æã®å¦çã¯ãªãã®ã§GitHub Actionsãªã©ãããåæ§ã®æ¹æ³ãåããã¯ãã§ãã
ã¾ã ã¾ã æ¹åã®ä½å°ã¯å¤ã
ããã¾ãã®ã§ä»å¾ãç¶ç¶ãã¦æ¹åãã¦ããã¾ãã
ã¾ããä»åã¯ç´¹ä»ãã¾ããã§ããããããã¤ã®èªååã®å段éã¨ãã¦E2Eãã¹ãã®å°å
¥ã¨ãã£ãããå®å¿ãã¦ä½æ¥ã§ããç°å¢ã¥ãããªã©ãè¡ãã¾ããã
ãããã®åãçµã¿ã¯æ©ä¼ãããã°æ¹ãã¦ãç´¹ä»ããã¦ããã ãã¾ãã
以ä¸ã§ãã
åèæç®
WireGuardã«ã¤ãã¦
- ã¤ã³ã¿ã¼ãããVPNã®é¸æè¢ã« WireGuardã¯ãããã§ãã?: WireGuardã®å ¥éè¨äº
- ä½ã£ã¦çè§£ããWireGuard: WireGuardã®è©³ç´°è§£èª¬
ã¦ã¼ã¶ã¼ã¹ãã¼ã¹ã§ã®WireGuardå®è£ é¢é£
- Userspace networking mode (for containers): tailscale/tailscaledã®Userspace networking mode(SOCKS5ãããã·)
- cloudflare/boringtun: ã¦ã¼ã¶ã¼ã¹ãã¼ã¹ã§ã®WireGuardãããã³ã«ã®å®è£ (Rust)
- Fadis/userspace_wireguard: WireGuardãããã³ã«ã®ã¦ã¼ã¶ã¼ã¹ãã¼ã¹å®è£ (C++)
- soratun ãæ¹é ã㦠AWS Lambda ããç°¡åã« SORACOM Arc ã使ã£ã¦ã¿ã¾ãã: wireproxyã¨åããwireguard-goãç¨ããã¦ã¼ã¶ã¼ã¹ãã¼ã¹å®è£ (Go)