shadowsocks on azure containers from scratch

create a new cloud shell instance (to use azure cli)

https://portal.azure.com/#cloudshell/

create azure resource group if not present

az group create --name e6lsocks --location eastus

create azure container registry

az acr create --sku Basic -g e6lsocks -n e6lacr

create acr user, give owner perms

ACR_NAME=e6lacr
SERVICE_PRINCIPAL_NAME=acruser
ACR_REGISTRY_ID=$(az acr show --name $ACR_NAME --query "id" --output tsv)
PASSWORD=$(az ad sp create-for-rbac --name $SERVICE_PRINCIPAL_NAME --scopes $ACR_REGISTRY_ID --role owner --query "password" --output tsv)
USER_NAME=$(az ad sp list --display-name $SERVICE_PRINCIPAL_NAME --query "[].appId" --output tsv)
echo "Service principal ID: $USER_NAME"
echo "Service principal password: $PASSWORD"

pull and push container image (client-side, not cloud shell)

docker pull ghcr.io/akafeng/shadowsocks-rust
docker login e6lacr.azurecr.io
(login using service principal id and password)
docker tag ghcr.io/akafeng/shadowsocks-rust e6lacr.azurecr.io/shado
docker push e6lacr.azurecr.io/shado

run container

az container create -g e6lsocks --name e6lshado --image e6lacr.azurecr.io/shado --ip-address public --ports 443 --environment-variables 'SERVER_PORT'='443'
(login using service principal id and password)
az container logs -n e6lshado -g e6lsocks

test test

connect

connect using shadowsocks-rust, grab a copy from https://github.com/shadowsocks/shadowsocks-rust/releases.
then connect executing the following command:

sslocal.exe -s 20.246.230.113:443 -k 'KQXkc3lbB6EC3u434yRu56qQ/GoMgrP8y7kTw0zap9U=' --encrypt-method aes-256-gcm -b 127.0.0.1:1081 -v

test

set up your new socks proxy running at localhost:1081 into a supported application (e.g firefox)
test
test