version: "3.7" services: # EncFS for /onion sf-encfs-www: build: encfs image: sf-encfs restart: ${SF_RESTART:-on-failure} cap_add: - SYS_ADMIN security_opt: - apparmor:unconfined environment: - SF_SEED - SF_DEBUG command: ["/mount.sh", "server", "www"] network_mode: none devices: - "/dev/fuse:/dev/fuse" volumes: - "${SF_BASEDIR:-.}/config/etc/seed:/config/etc/seed" - "${SF_BASEDIR:-.}/data/www-root:/raw" - "${SF_SHMDIR:-/dev/shm/sf}/encfs-sec/www-root:/sec:shared" # EncFS for /everyone # This needs to be separated so that a compromise of ngingx does not # allow the attacker to see /everyone of everyone. sf-encfs-everyone: build: encfs image: sf-encfs restart: ${SF_RESTART:-on-failure} cap_add: - SYS_ADMIN security_opt: - apparmor:unconfined environment: - SF_SEED - SF_DEBUG command: ["/mount.sh", "server", "everyone"] network_mode: none devices: - "/dev/fuse:/dev/fuse" volumes: - "${SF_BASEDIR:-.}/config/etc/seed:/config/etc/seed" - "${SF_BASEDIR:-.}/data/everyone-root:/raw" - "${SF_SHMDIR:-/dev/shm/sf}/encfs-sec/everyone-root:/sec:shared" dns-doh: image: crazymax/cloudflared restart: ${SF_RESTART:-on-failure} networks: dns-doh-net: ipv4_address: 172.23.0.2 dnsmasq: image: 4km3/dnsmasq:2.85-r2 cap_add: - NET_ADMIN command: ["--no-resolv", "--domain-needed", "--server=172.23.0.2#5053", "--server=/onion/172.20.0.111#5353"] networks: vpn-net: ipv4_address: 172.20.0.252 dns-doh-net: ipv4_address: 172.23.0.252 guest-net: ipv4_address: 10.11.255.252 access-net: ipv4_address: 172.22.0.252 restart: ${SF_RESTART:-on-failure} depends_on: - dns-doh nordlynx: # image: ghcr.io/bubuntux/nordlynx build: nordvpn image: sf-nordvpn depends_on: - dnsmasq dns: 172.20.0.252 cap_add: - NET_ADMIN #required environment: - PRIVATE_KEY=${SF_NORDVPN_PRIVATE_KEY:-} - POST_UP=/sf/bin/vpn_wg2status.sh /sf/run/vpn/status-nordlynx.log post_up %i - POST_DOWN=/sf/bin/vpn_wg2status.sh /sf/run/vpn/status-nordlynx.log post_down %i - RECONNECT=604800 # Re-Connect every 7 days networks: vpn-net: ipv4_address: 172.20.0.254 # dns-doh-net: # ipv4_address: 172.23.0.254 sysctls: - net.ipv6.conf.all.disable_ipv6=1 # - net.ipv4.conf.all.src_valid_mark=1 - net.ipv4.ip_forward=1 restart: ${SF_RESTART:-on-failure} volumes: - "${SF_SHMDIR:-/dev/shm/sf}/run/vpn:/sf/run/vpn" # Between all VPNs - "${SF_SHMDIR:-/dev/shm/sf}/config-for-guest:/config/guest" # vpn_status to guest router: build: router image: sf-router depends_on: - router-fix-network networks: incoming-net: ipv4_address: 172.28.0.2 vpn-net: ipv4_address: 172.20.0.2 guest-net: ipv4_address: 10.11.255.253 # Will be replaced by init.sh with 10.11.0.1 access-net: ipv4_address: 172.22.0.254 dmz-net: ipv4_address: 172.20.1.254 cap_add: - NET_ADMIN sysctls: - net.ipv4.conf.all.src_valid_mark=1 # SNAT ports: - "${SF_SSH_PORT:-22}:22" environment: - SF_DEBUG - SF_MAXOUT - SF_MAXIN restart: ${SF_RESTART:-on-failure} volumes: - "${SF_SHMDIR:-/dev/shm/sf}/run/vpn:/sf/run/vpn" - "${SF_BASEDIR:-.}/config/etc/tc:/config/tc:ro" entrypoint: ["/init.sh"] router-fix-network: build: router image: sf-router network_mode: host # host's stack cap_add: - NET_ADMIN environment: - SF_DEBUG restart: ${SF_RESTART:-on-failure}:1 entrypoint: ["/fix-network.sh"] tor: build: tor image: sf-tor networks: vpn-net: ipv4_address: 172.20.0.111 cap_add: - NET_ADMIN restart: ${SF_RESTART:-on-failure} dns: 172.20.0.252 depends_on: - dnsmasq - nginx volumes: - "${SF_BASEDIR:-.}/config/${SF_FQDN:-SF_FQDN-NOT-SET.hack.segfault.net}/tor/hidden:/var/lib/tor/hidden" - "${SF_BASEDIR:-.}/config/etc/tor:/config/tor:ro" - "${SF_SHMDIR:-/dev/shm/sf}/config-for-guest:/config/guest" gsnc: build: gsnc image: sf-gsnc networks: access-net: ipv4_address: 172.22.0.21 dns: 172.22.0.252 cap_add: - NET_ADMIN # need to set default route depends_on: - dnsmasq - router restart: ${SF_RESTART:-on-failure} environment: - SF_SSH_PORT=${SF_SSH_PORT:-22} - SF_FQDN=${SF_FQDN:-SF_FQDN-NOT-SET.hack.segfault.net} - SF_DEBUG - SF_SEED volumes: - "${SF_SHMDIR:-/dev/shm/sf}/config-for-guest:/config/guest" - "${SF_BASEDIR:-.}/config/etc/seed:/config/etc/seed" entrypoint: ["/sf-gsnc.sh", "172.22.0.22"] segfault: build: host image: sf-host # /bin/segfaultsh need to know the container name; set it to sf-host statically container_name: sf-host networks: access-net: ipv4_address: 172.22.0.22 dns: 172.22.0.252 cap_add: - NET_ADMIN # need to set default route depends_on: - dnsmasq - router - sf-encfs-everyone restart: ${SF_RESTART:-on-failure} init: true # SSHD clears all environment variables before spwaning a shell (segfaultsh). # Add any variables to docker_sshd.sh as well. environment: - SF_DNS=10.11.255.252 - SF_TOR=172.20.0.111 - SF_BASEDIR=${SF_BASEDIR} - SF_SHMDIR=${SF_SHMDIR:-/dev/shm/sf} - SF_USER=${SF_USER:-root} - SF_USER_PASSWORD=${SF_USER_PASSWORD:-segfault} - SF_FQDN=${SF_FQDN:-SF_FQDN-NOT-SET.hack.segfault.net} - SF_SEED - SF_DEBUG volumes: - "${SF_BASEDIR:-.}/config:/config" - "${SF_BASEDIR:-.}/sfbin/wait_semaphore.sh:/sf/bin/wait_semaphore.sh:ro" - "${SF_SHMDIR:-/dev/shm/sf}/encfs-sec/www-root:/sec/www-root:slave" - "${SF_SHMDIR:-/dev/shm/sf}/config-for-guest:/config/guest" - "/var/run/docker.sock:/var/run/docker.sock" nginx: image: nginx restart: ${SF_RESTART:-on-failure} depends_on: - sf-encfs-www entrypoint: ["/sf/bin/wait_semaphore.sh", "/sec/.IS-ENCRYPTED", "nginx", "-g", "daemon off;"] networks: dmz-net: ipv4_address: 172.20.1.80 dns: 255.255.255.255 cap_add: - NET_ADMIN # need to set default route volumes: - "${SF_BASEDIR:-.}/sfbin/wait_semaphore.sh:/sf/bin/wait_semaphore.sh:ro" - "${SF_SHMDIR:-/dev/shm/sf}/encfs-sec/www-root:/sec:slave,ro" - "${SF_BASEDIR:-.}/config/etc/nginx/nginx.conf:/etc/nginx/nginx.conf:ro" networks: vpn-net: name: sf-vpn driver: bridge ipam: driver: default config: - subnet: 172.20.0.0/24 incoming-net: driver: bridge ipam: driver: default config: - subnet: 172.28.0.0/24 access-net: name: sf-access driver: bridge ipam: driver: default config: - subnet: 172.22.0.0/24 dmz-net: name: sf-dmz driver: bridge ipam: config: - subnet: 172.20.1.0/24 dns-doh-net: name: sf-dns-doh driver: bridge ipam: config: - subnet: 172.23.0.0/24 # User's shell guest-net: name: sf-guest driver: bridge ipam: driver: default config: - subnet: 10.11.0.0/16 # default gw is always 10.11.0.1 and is the host side of the bridge (?)