Damus
linux_privacy profile picture
linux_privacy
@linux_privacy

Privacy, Cypherpunk, #bitcoin #nostr на русском. и немного философии...
Love Qubes OS & Graphene OS 😎

Добавьте себе эти дополнительные реле и увидите намного больше контента в nostr:
wss://nostr.data.haus
wss://relay.ditto.pub
wss://relay.momostr.pink

Relays (4)
  • wss://nos.lol/ – read & write
  • wss://relay.damus.io/ – read & write
  • wss://relay.momostr.pink/ – read
  • wss://nostr.data.haus/ – read

Recent Notes

linux_privacy · 4d
Droidian - более мобильный аналог Mobian. https://droidian.org/ Если Mobian - это чистый дебиан на телефоне, то droidian - это дебиан с ...
linux_privacy profile picture
Установка pam-duress на Droidian, чтобы создавать ложные пинкоды / пароли, которые уничтожат все опасные файлы и приложения при разблокировке телефона

sudo apt-get update
sudo apt-get install -y build-essential libpam0g-dev libssl-dev


git clone https://github.com/nuvious/pam-duress.git
cd pam-duress
make
sudo make install
make clean


mkdir -p ~/.duress
sudo mkdir -p /etc/duress.d

# сюда пишем аварийные команды для удаления / изменения
cat > ~/.duress/remove_test.sh << 'EOF'
#!/bin/sh
rm -rf /home/droidian/test
EOF


chmod 500 ~/.duress/remove_test.sh

duress_sign ~/.duress/remove_test.sh

chmod 400 ~/.duress/remove_test.sh.sha256

# проверка
ls -la ~/.duress/

# меняем полностью /etc/pam.d/common-auth
sudo nano /etc/pam.d/common-auth


# here are the per-package modules (the "Primary" block)
auth [success=2 default=ignore] pam_unix.so nullok
auth [success=1 default=ignore] pam_duress.so
# here's the fallback if no module succeeds
auth requisite pam_deny.so
# prime the stack with a positive return value if there isn't one already;
# this avoids us returning an error just because nothing sets a success code
# since the modules above will each just jump around
auth required pam_permit.so
# and here are more per-package modules (the "Additional" block)
auth optional pam_cap.so
# end of pam-auth-update config


# проверка
mkdir -p /home/droidian/test
touch /home/user/test/test_file.txt
linux_privacy · 4d
Дополнительный зашифрованный swap на 4 гига - для старых телефонов свопов много не бывает. Работать будет вмест...
linux_privacy profile picture
допольнительные тулзы для помощи RAM от перегрева.

# OOM-менеджер: earlyoom
sudo apt update
sudo apt install earlyoom
sudo systemctl enable --now earlyoom

Настройка в /etc/default/earlyoom:
EARLYOOM_ARGS="-m 8,8 -s 15,15 --prefer '(Web Content|Isolated Web|brave-browser|brave|firefox|firefox-esr|chromium|chromium-browser|waydroid|waydroid-full-ui)' --avoid '(phosh|phoc|systemd|ofono|NetworkManager|pulseaudio|lxc@android|gnome-session|dbus)' -r 3600"


# Скрипт периодического сброса кэша под давлением:

sudo nano /usr/local/bin/droidian-memory-guard.sh

#!/bin/bash
THRESHOLD=85
COOLDOWN=600

while true; do
MEM_USED=$(free | awk '/Mem:/ {printf "%.0f", ($2-$7)/$2*100}')
if [ "$MEM_USED" -gt "$THRESHOLD" ]; then
NOW=$(date +%s)
LAST=$(cat /run/droidian-memguard.last 2>/dev/null || echo 0)
if [ $((NOW - LAST)) -gt "$COOLDOWN" ]; then
sync
echo 3 > /proc/sys/vm/drop_caches
echo "$NOW" > /run/droidian-memguard.last
logger -t droidian-memguard "Caches dropped at ${MEM_USED}%"
fi
fi
sleep 60
done

sudo chmod +x /usr/local/bin/droidian-memory-guard.sh
sudo nano /etc/systemd/system/droidian-memguard.service

[Unit]
Description=Droidian Memory Guard
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/droidian-memory-guard.sh
Restart=always

[Install]
WantedBy=multi-user.target

sudo systemctl enable --now droidian-memguard

# Вырубим анимацию в Phosh

gsettings set org.gnome.desktop.interface enable-animations false

# Еще можно установить предел памяти для waydroid:

sudo nano /var/lib/waydroid/lxc/waydroid/config

lxc.cgroup.memory.limit_in_bytes = 900M

# Eсли хотите увеличить размер zram0, то:

sudo su
swapoff /dev/zram0
echo 1 > /sys/block/zram0/reset
echo 2500M > /sys/block/zram0/disksize
mkswap /dev/zram0
swapon /dev/zram0 -p 50 # или ставьте 100, если надо, чтобы zram0 работал на пределе без помощи swapfile
linux_privacy · 4d
Droidian - более мобильный аналог Mobian. https://droidian.org/ Если Mobian - это чистый дебиан на телефоне, то droidian - это дебиан с ...
linux_privacy profile picture
Режим работы в памяти уже отличается сильно от мобиан - не получится просто так засунуть скрипт в initramfs, чтобы система, как в tails, запускалась в памяти при запуске. Поэтому будем пользоваться этим режимом в уже запущенной системе, создав переключатель, в котором надо будет просто ввести команду sudo overlay on. в скрипте в TARGET_DIRS можно указать либо весь корень, либо отдельные папки. Корень лучше не указывать, иначе swapfile не будет работать и напряг памяти увеличится. создайте скрипт в /usr/local/bin/overlay:

#!/bin/bash
# Toggle overlay mode for /etc and /var

UPPER_BASE="/mnt/overlay-persistent" # Change to tmpfs path for ephemeral
STATE_FILE="/run/overlay-active"
TARGET_DIRS="/etc /var /home /root /usr /opt"

toggle_on() {
[ -f "$STATE_FILE" ] && { echo "Already active"; exit 1; }

mkdir -p "$UPPER_BASE"
mount -t tmpfs -o size=50% tmpfs "$UPPER_BASE"

for dir in $TARGET_DIRS; do
local name=$(echo "$dir" | tr '/' '-')
local upper="$UPPER_BASE/$name-upper"
local work="$UPPER_BASE/$name-work"
local lower="$UPPER_BASE/$name-lower"

mkdir -p "$upper" "$work" "$lower"

# Bind-mount original to preserve access
mount --bind "$dir" "$lower"
mount --make-private "$lower"

# Mount overlay
mount -t overlay -o "lowerdir=$lower,upperdir=$upper,workdir=$work" overlay "$dir"

echo "Overlay active: $dir"
done

touch "$STATE_FILE"
echo "Overlay mode ON"
}

toggle_off() {
[ ! -f "$STATE_FILE" ] && { echo "Not active"; exit 1; }

for dir in $TARGET_DIRS; do
umount "$dir" 2>/dev/null || true
done

# Clean up bind mounts
for mnt in $(mount | grep "$UPPER_BASE" | awk '{print $3}' | tac); do
umount "$mnt" 2>/dev/null || true
done

rm -f "$STATE_FILE"
echo "Overlay mode OFF"
sync
reboot
}

show_status() {
if [ -f "$STATE_FILE" ]; then
echo "Overlay: ACTIVE"
echo "Upperdir location: $UPPER_BASE"
echo "Changes are stored on: $(df -T "$UPPER_BASE" | tail -1 | awk '{print $2}')"
else
echo "Overlay: INACTIVE"
fi
}

case "$1" in
on) toggle_on ;;
off) toggle_off ;;
status) show_status ;;
*) echo "Usage: $0 {on|off|status}" ;;
esac
linux_privacy · 4d
Droidian - более мобильный аналог Mobian. https://droidian.org/ Если Mobian - это чистый дебиан на телефоне, то droidian - это дебиан с ...
linux_privacy profile picture
Дополнительный зашифрованный swap на 4 гига - для старых телефонов свопов много не бывает. Работать будет вместо с zram0:

#!/bin/bash
set -e

SWAP_SIZE="4G" # Reduced for eMMC longevity

echo "[*] Creating ${SWAP_SIZE} swap file..."

# Use dd instead of fallocate for better compatibility with encrypted filesystems
# fallocate may create holes that don't work well with encryption
dd if=/dev/zero of=/swapfile bs=1M count=4096 status=progress
chmod 600 /swapfile

echo "[*] Creating encrypted swap script..."

cat > /usr/local/bin/encrypted-swap.sh <<'SCRIPT'
#!/bin/bash
set -e

# Ждём, пока zram будет создан
for i in {1..30}; do
if [ -b /dev/zram0 ]; then
break
fi
sleep 1
done

# Отключаем существующие swap
swapoff /dev/zram0 2>/dev/null || true
swapoff /dev/mapper/swapfile 2>/dev/null || true
cryptsetup close swapfile 2>/dev/null || true
losetup -D 2>/dev/null || true
rm -f /run/encrypted-swap.loop

# Настраиваем loop для swapfile
LOOPDEV=$(losetup -f --show /swapfile)
echo "$LOOPDEV" > /run/encrypted-swap.loop

# Открываем с шифрованием
cryptsetup open --type plain \
--key-file /dev/urandom \
--cipher aes-xts-plain64 \
--key-size 256 \
"$LOOPDEV" swapfile

mkswap -f /dev/mapper/swapfile

# Активируем ОБА swap с ОДИНАКОВЫМ приоритетом
swapon -p 50 /dev/zram0
swapon -p 50 /dev/mapper/swapfile
SCRIPT

chmod +x /usr/local/bin/encrypted-swap.sh

echo "[*] Creating systemd service..."

cat > /etc/systemd/system/encrypted-swap.service <<'SERVICE'
[Unit]
Description=Encrypted Swap
After=local-fs.target
# Start after zram so we can set lower priority
After=zramswap.service
Wants=zramswap.service

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/local/bin/encrypted-swap.sh
ExecStop=/bin/bash -c 'swapoff /dev/mapper/swapfile 2>/dev/null; cryptsetup close swapfile 2>/dev/null; LOOPDEV=$(cat /run/encrypted-swap.loop 2>/dev/null) && losetup -d $LOOPDEV 2>/dev/null || true; rm -f /run/encrypted-swap.loop'

[Install]
WantedBy=multi-user.target
SERVICE

echo "[*] Cleaning up crypttab and fstab..."
sed -i '/swap/d' /etc/crypttab 2>/dev/null || true
sed -i '/swap/d' /etc/fstab 2>/dev/null || true

echo "[*] Configuring swap preferences..."

# Moderate swappiness - let kernel decide, but prefer zram
cat > /etc/sysctl.d/99-swap.conf <<'EOF'
# Prefer zram over disk swap
vm.swappiness=100
vm.vfs_cache_pressure=200
EOF

echo "[*] Enabling encrypted swap service..."
systemctl daemon-reload
systemctl enable encrypted-swap.service

echo "[*] Activating encrypted swap..."
/usr/local/bin/encrypted-swap.sh

echo ""
echo "[*] Verification:"
swapon --show
cryptsetup status swapfile 2>/dev/null || echo "cryptsetup status failed, checking lsblk:"
lsblk | grep -i swap || true
free -h | grep -i swap

echo ""
echo "[*] Encrypted swap setup complete."
echo "[*] New random key generated at each boot."
echo "[*] Swap data is unrecoverable after shutdown."
echo "[*] WARNING: Disk swap on eMMC wears storage. Consider larger zram instead."
1
linux_privacy · 4d
допольнительные тулзы для помощи RAM от перегрева. # OOM-менеджер: earlyoom sudo apt update sudo apt install earlyoom sudo systemctl enable --now earlyoom Настройка в /etc/default/earlyoom: EARLYOOM_ARGS="-m 8,8 -s 15,15 --prefer '(Web Cont...
linux_privacy · 4d
Droidian - более мобильный аналог Mobian. https://droidian.org/ Если Mobian - это чистый дебиан на телефоне, то droidian - это дебиан с ...
linux_privacy profile picture
Droidian сидит на андроид-ядре, поэтому там, в отличие от мобиан, iptables. значит запуск всего трафика через тор будет по этому скрипту (у waydroid будет свой трафик и туда можно амнезию поставить):

#!/bin/bash

# Flush ALL iptables rules completely (be careful if remote!)
sudo iptables -F
sudo iptables -X
sudo iptables -t nat -F
sudo iptables -t nat -X
sudo iptables -t mangle -F
sudo iptables -t mangle -X
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT

# Verify clean state
sudo iptables -L -v

echo "[*] Installing Tor..."
sudo apt update
sudo apt install -y tor

echo "[*] Configuring Tor..."

# Backup original torrc
sudo cp /etc/tor/torrc /etc/tor/torrc.backup

# Configure Tor for transparent proxy
sudo tee /etc/tor/torrc > /dev/null << 'EOF'
SocksPort 127.0.0.1:9050
TransPort 127.0.0.1:9040
DNSPort 127.0.0.1:9053
VirtualAddrNetworkIPv4 10.192.0.0/10
AutomapHostsOnResolve 1
RunAsDaemon 1
EOF

echo "[*] Restarting Tor..."
sudo systemctl restart tor
sleep 2

echo "[*] Checking Tor ports..."
sudo ss -tlnp | grep -E ':(9050|9040|9053)'

echo "[*] Setting up iptables rules..."

# IMPORTANT: First check if rules already exist to avoid duplicates
# Flush existing rules in our custom chains (or create them)
sudo iptables -t nat -F 2>/dev/null || true

# Create new chain for Tor (or flush if exists)
sudo iptables -t nat -N TOR_REDIRECT 2>/dev/null || sudo iptables -t nat -F TOR_REDIRECT

# Redirect DNS to Tor DNSPort
sudo iptables -t nat -A OUTPUT -p udp --dport 53 -j REDIRECT --to-ports 9053

# Redirect TCP traffic to Tor TransPort (except Tor itself)
sudo iptables -t nat -A OUTPUT -p tcp --syn -m owner ! --uid-owner debian-tor -j REDIRECT --to-ports 9040

# Allow loopback
sudo iptables -t nat -A OUTPUT -o lo -j RETURN

# Don't redirect local/private networks (optional - adjust as needed)
sudo iptables -t nat -A OUTPUT -d 127.0.0.0/8 -j RETURN
sudo iptables -t nat -A OUTPUT -d 192.168.0.0/16 -j RETURN
sudo iptables -t nat -A OUTPUT -d 10.0.0.0/8 -j RETURN

echo "[*] Current iptables nat rules:"
sudo iptables -t nat -L -v

echo "[*] Tor transparent proxy is now active"
echo "[*] Test with: curl --socks5 127.0.0.1:9050 https://check.torproject.org"

echo "[*] Saving iptables rules..."
sudo mkdir -p /etc/iptables
sudo iptables-save > /etc/iptables/rules.v4

echo "[*] Creating systemd service for autostart..."

sudo tee /etc/systemd/system/tor-firewall.service > /dev/null << 'EOF'
[Unit]
Description=Tor Transparent Proxy Firewall
After=network.target tor.service
Wants=tor.service

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/sbin/iptables-restore /etc/iptables/rules.v4
ExecStop=/sbin/iptables -F; /sbin/iptables -t nat -F; /sbin/iptables -t mangle -F

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable tor-firewall.service

echo "[*] Done. Rules will persist after reboot."
linux_privacy profile picture
Droidian - более мобильный аналог Mobian.
https://droidian.org/

Если Mobian - это чистый дебиан на телефоне, то droidian - это дебиан с ограничениями, но зато с хорошо работающими функциями телефона: камера, звонки, уведомления работают отлично. Установка очень простая - через UBports просто нажав пару кнопок, но важно, чтобы телефон был сброшен до определенной версии андроида. На телефоне пиксель 3а - это андроид 9. Устанавливаем пакеты:
sudo apt install adb fastboot
Заходим на сайт flash.android.com с гугл хрома (да, это бесит, но не страшно - можно засунуть хром в контейнер и трафик с тора пустить), подключаем телефон к юсб в режиме fastboot, даем разрешения сайту на отладку и выбираем андроид 9, затем нажимаем на карандаш и убираем галочку с "заблокировать загрузчик". минут 5 ждем и готово. Затем скачиваем UBports с сайта убунты тач https://devices.ubuntu-touch.io/installer/appimage (кстати, убунту тач - фигня полная), и запускаем там установку в простом графическом интерфейсе. ждем минут 5 и телефон перезагрузится в Droidian. Пинкод будет 1234, как в мобина. По мне так это самый удобный мобильный линукс в плане работы конкретно функций телефона. После включения идите в настройки и запускайте шифрование диска - система перенесется в новый зашифрованный раздел.

5
linux_privacy · 4d
Droidian сидит на андроид-ядре, поэтому там, в отличие от мобиан, iptables. значит запуск всего трафика через тор будет по этому скрипту (у waydroid будет свой трафик и туда можно...
linux_privacy · 4d
Дополнительный зашифрованный swap на 4 гига - для старых телефонов свопов много не бывает. Работать будет вместо с zram0: #!/bin/bash set -e SWAP_SIZE="4G" # Reduced for eMMC longevity echo "[*] Creating ${...
linux_privacy · 4d
Режим работы в памяти уже отличается сильно от мобиан - не получится просто так засунуть скрипт в initramfs, чтобы система, как в tails, запускалась в памяти при запуске. По...
linux_privacy · 2d
Установка pam-duress на Droidian, чтобы создавать ложные пинкоды / пароли, которые уничтожат все опасные файлы и приложения при разблокировке телефона sudo apt-get update sudo apt-get insta...
note1zfg9m...
linux_privacy profile picture
если что-то пойдет не так, то на телефонах пиксель проще всего вернуть обычный андроид и попробовать снова. просто заходишь на сайт android flash tools и подключаешь телефон к usb. главное - перед восстановлением нажать на редактирование и убрать галочку с "заблокировать загрузчик". но там вряд ли что-то не так пойдет при установке - она слишком простая.
linux_privacy · 1w
затем устанавливаем свой вариант overlayroot в initramfs для работы в RAM и потере данных при перезагрузке из режима overlay...
linux_privacy profile picture
создаем команды для запуска и деактивации overlayroot

для выхода из overlayroot создайте в /usr/local/bin/stop-overlay:
#!/bin/sh
sudo mount -o remount,rw /live/image
sudo touch /live/image/
sudo mount -o remount,ro /live/image
sudo reboot

и затем в терминале sudo stop-overlay

после перезагрузки всё пишется снова на диск. для запуска overlayroot создайте /usr/local/bin/start-overlay:
rm /.overlayroot-disable
sudo reboot

и потом в терминале введи sudo start-overlay

p.s. естеснна, все файлы в /usr/local/bin надо делать исполняемыми sudo chmod +x
linux_privacy · 1w
Tails на телефоне. Создаем зашифрованную мобильную ОС, которая будет терять все данные после перезагрузки. Сна...
linux_privacy profile picture
затем устанавливаем свой вариант overlayroot в initramfs для работы в RAM и потере данных при перезагрузке из режима overlayroot:

sudo tee /etc/initramfs-tools/scripts/init-bottom/overlayroot >/dev/null <<EOF
#!/bin/sh
# Overlayroot initramfs hook для Debian/Mobian

case "$1" in
prereqs)
echo ""
exit 0
;;
esac

. /scripts/functions

PATH=/usr/sbin:/usr/bin:/sbin:/bin
MYTAG="overlayroot"

# === НАСТРОЙКИ ===
root_rw=/media/root-rw
root_ro=/media/root-ro
NEWROOT="${rootmnt:-/root}"
OVERLAYROOT_DEBUG=1

# === ЛОГИРОВАНИЕ ===
log() {
"log_${1}_msg" "$MYTAG: $2"
_debug "[$1]:" "$2"
}
log_fail() { log failure "$*"; }
log_success() { log success "$*"; }
log_warn() { log warning "$*"; }
fail() {
[ $# -eq 0 ] || log_fail "$@"
exit 0
}

_debug() {
if [ "${DEBUG_BUSTED:-0}" = "0" ]; then
{ echo "$@" >> "/dev/.initramfs/${MYTAG}.log"; } 2>/dev/null ||
{ DEBUG_BUSTED=1; logwarn "debug is busted"; }
fi
}

debug() {
_debug "$@"
[ "${OVERLAYROOT_DEBUG:-0}" = "0" ] && return
echo "$MYTAG:" "$@"
}

# === ПАРСИНГ КОМАНДНОЙ СТРОКИ ЯДРА ===
# Читаем /proc/cmdline и ищем параметры overlayroot*
parse_cmdline() {
local cmdline=""
read cmdline < /proc/cmdline || return 1

OVERLAY_MODE=""
OVERLAY_CHROOT=0

for tok in $cmdline; do
case "$tok" in
overlayroot=off)
OVERLAY_MODE="disabled"
;;
overlayroot=chroot)
OVERLAY_CHROOT=1
;;
overlayroot=tmpfs)
OVERLAY_MODE="tmpfs"
;;
overlayroot=*)
OVERLAY_MODE="${tok#overlayroot=}"
;;
esac
done
}

# === ПРОВЕРКА ФЛАГОВ В ОРИГИНАЛЬНОМ КОРНЕ ===
check_disable_flags() {
# Проверяем флаг-файл в оригинальном корне (до overlay)
if [ -f "$NEWROOT/.overlayroot-disable" ]; then
log_success "found .overlayroot-disable flag, disabling overlay"
rm -f "$NEWROOT/.overlayroot-disable"
return 0
fi

# Проверяем флаг-файл для одноразового chroot
if [ -f "$NEWROOT/.overlayroot-chroot" ]; then
log_success "found .overlayroot-chroot flag, enabling chroot mode"
OVERLAY_CHROOT=1
rm -f "$NEWROOT/.overlayroot-chroot"
return 1
fi

return 1
}

# === МОНТИРОВАНИЕ TMPFS ДЛЯ OVERLAY ===
mount_overlay_tmpfs() {
local size="${1:-50%}"

mkdir -p "$root_rw" || fail "failed to create $root_rw"
mount -t tmpfs -o mode=0755,size=80% tmpfs-root "$root_rw" ||
fail "failed to mount tmpfs on $root_rw"

mkdir -p "$root_rw/overlay" "$root_rw/work" ||
fail "failed to create overlay dirs on tmpfs"
}

# === МОНТИРОВАНИЕ ОРИГИНАЛЬНОГО КОРНЯ ===
mount_original_root() {
mkdir -p "$root_ro" || fail "failed to create $root_ro"

# Если корень уже примонтирован в NEWROOT — биндим его
if [ -d "$NEWROOT/bin" ]; then
mount --bind "$NEWROOT" "$root_ro" ||
fail "failed to bind $NEWROOT to $root_ro"
else
fail "$NEWROOT is not mounted"
fi
}

# === МОНТИРОВАНИЕ OVERLAY ===
mount_overlay() {
local lowerdir="$1"
local upperdir="$2"
local workdir="$3"
local target="$4"

mkdir -p "$target" || fail "failed to create $target"

# Проверяем версию ядра для workdir
local mount_opts="lowerdir=$lowerdir,upperdir=$upperdir"
case "$(uname -r)" in
2*|3.1[01234567]*|3.[0-9].*)
# Старые ядра не требуют workdir
;;
*)
mount_opts="$mount_opts,workdir=$workdir"
;;
esac

mount -t overlay -o "$mount_opts" overlayroot "$target" ||
fail "failed to mount overlay on $target"
}

# === ПЕРЕМЕЩЕНИЕ MOUNTPOINT'ОВ ===
move_mounts() {
local source="$1"
local dest="$2"

# Переносим все дочерние mountpoint'ы (кроме самого source)
local mounts=""
mounts=$(awk -v mnt="$source" '$2 ~ "^"mnt && $2 != mnt {print $2}' /proc/mounts | sort)

for mp in $mounts; do
local rel="${mp#$source}"
[ -z "$rel" ] && continue

mkdir -p "$dest$rel" || log_warn "failed to create $dest$rel"
mount --move "$mp" "$dest$rel" ||
log_warn "failed to move $mp to $dest$rel"
done
}

# === ОБНОВЛЕНИЕ FSTAB ===
update_fstab() {
local root_ro="$1"
local root_rw="$2"

[ -f "${NEWROOT}/etc/fstab" ] || return 0

# Сохраняем оригинальный fstab
cp "${NEWROOT}/etc/fstab" "${NEWROOT}/etc/fstab.orig" 2>/dev/null || true

cat <<EOF >"${NEWROOT}/etc/fstab"
# This fstab is in an overlayfs.
# The real one can be found at ${root_ro}/etc/fstab
# To permanently modify files, chroot into writable view:
# sudo mount -o remount,rw ${root_ro}
# sudo chroot ${root_ro}
#
EOF

# Копируем оригинальные записи с изменёнными путями
while read spec file vfstype opts pass freq; do
# Пропускаем комментарии и пустые строки
case "$spec" in
\#*|""|swap) continue ;;
esac

# Корневую ФС заменяем на overlay
if [ "$file" = "/" ]; then
echo "overlayroot / overlay defaults 0 0"
echo "${root_ro} ${root_ro} none bind,ro 0 0"
echo "${root_rw} ${root_rw} none bind,rw 0 0"
continue
fi

# Виртуальные ФС пропускаем
case "$vfstype" in
proc|sys|tmpfs|devtmpfs|devpts|overlay) continue ;;
esac

# Остальные монтируем в ro-слой
echo "$spec ${root_ro}${file} $vfstype ro,$opts $pass $freq"
done < "${NEWROOT}/etc/fstab.orig" >> "${NEWROOT}/etc/fstab"
}

# === СОЗДАНИЕ ТОЧЕК ДОСТУПА /live/* ===
create_live_access() {
local root_ro="$1"
local root_rw="$2"

# Создаём /live/image (доступ к оригинальному ro корню)
mkdir -p "${NEWROOT}/live/image" || log_warn "failed to create /live/image"
mount --bind "$root_ro" "${NEWROOT}/live/image" ||
log_warn "failed to bind $root_ro to /live/image"

# Создаём /live/cow (доступ к rw слою)
mkdir -p "${NEWROOT}/live/cow" || log_warn "failed to create /live/cow"
mount --bind "$root_rw" "${NEWROOT}/live/cow" ||
log_warn "failed to bind $root_rw to /live/cow"
}

# === ОСНОВНАЯ ЛОГИКА ===

# 1. Парсим командную строку ядра
parse_cmdline

# 2. Проверяем флаги отключения
check_disable_flags
if [ $? -eq 0 ]; then
OVERLAY_MODE="disabled"
fi

# 3. Если overlay отключён — выходим
case "${OVERLAY_MODE:-enabled}" in
disabled|off|no)
log_success "overlayroot disabled, booting normal root"
exit 0
;;
esac

# 4. Проверяем что корень смонтирован
if [ ! -d "$NEWROOT/bin" ]; then
log_fail "$NEWROOT is not mounted"
exit 0
fi

# 5. Создаём временные директории в RAM
mkdir -p /run/overlay
mount -t tmpfs -o mode=0755,size=100% tmpfs /run/overlay ||
fail "failed to mount tmpfs on /run/overlay"

# 6. Монтируем оригинальный корень в ro-слой
mount_original_root

# 7. Монтируем tmpfs для rw-слоя
mount_overlay_tmpfs

# 8. Если запрошен chroot-режим — монтируем overlay отдельно
if [ "$OVERLAY_CHROOT" = "1" ]; then
log_warn "chroot mode requested, overlay will be available at /overlay"

# Монтируем overlay в /overlay внутри нового корня
mkdir -p "${NEWROOT}/overlay"
mount_overlay "$root_ro" "$root_rw/overlay" "$root_rw/work" "${NEWROOT}/overlay"

# Создаём точки доступа
create_live_access "$root_ro" "$root_rw"

# Переносим дочерние mountpoint'ы
move_mounts "$NEWROOT" "${NEWROOT}/overlay"

# Обновляем fstab
update_fstab "$root_ro" "$root_rw"

log_success "chroot overlay configured at /overlay"
exit 0
fi

# 9. Обычный режим: перемещаем корень в ro-слой, монтируем overlay на его место
# Перемещаем оригинальный корень
mount --move "$NEWROOT" "$root_ro" ||
fail "failed to move $NEWROOT to $root_ro"

# Монтируем overlay на место оригинального корня
mount_overlay "$root_ro" "$root_rw/overlay" "$root_rw/work" "$NEWROOT"

# 10. Переносим mountpoint'ы внутрь overlay
move_mounts "$root_ro" "$NEWROOT"

# 11. Перемещаем ro и rw слои внутрь overlay (чтобы были доступны из системы)
mkdir -p "${NEWROOT}${root_ro}" "${NEWROOT}${root_rw}"
mount --move "$root_ro" "${NEWROOT}${root_ro}" ||
log_warn "failed to move $root_ro into overlay"
mount --move "$root_rw" "${NEWROOT}${root_rw}" ||
log_warn "failed to move $root_rw into overlay"

# 12. Создаём точки доступа /live/*
create_live_access "${NEWROOT}${root_ro}" "${NEWROOT}${root_rw}"

# 13. Обновляем fstab
update_fstab "$root_ro" "$root_rw"

# 14. Если ядро просило ro — перемонтируем
read cmdline < /proc/cmdline
case " $cmdline " in
*\ ro\ *)
mount -o remount,ro "$NEWROOT" ||
log_warn "failed to remount overlay read-only"
;;
esac

log_success "overlayroot configured with /live/image and /live/cow access"
exit 0
EOF

sudo chmod 755 /etc/initramfs-tools/scripts/init-bottom/overlayroot

echo "overlay" | sudo tee -a /etc/initramfs-tools/modules

sudo update-initramfs -u -k all

sudo dpkg-reconfigure linux-image-$(uname -r)
1
linux_privacy · 1w
создаем команды для запуска и деактивации overlayroot для выхода из overlayroot создайте в /usr/local/bin/stop-overlay: #!/bin/sh sudo mount -o remount,rw /live/image sudo touch /live/image/ sudo mount -o remount,ro /live/image sudo reboot и...
linux_privacy · 1w
После запуска системы запускаем обновления. Затем отправляем весь трафик через Tor, запустив этот скрипт (оста...
linux_privacy profile picture
Если хотите иметь еще и VPN, например WG, то запустите его по классике и сделайте такой переключатель из тора в вг и обратно в /usr/local/bin (переключение будет через команды sudo toggle-net wg или sudo toggle-net tor):

#!/bin/bash

# Toggle between Tor transparent proxy and WireGuard VPN
# Usage: sudo ./toggle-tor-wireguard.sh [tor|wg|status]

set -e

MODE="${1:-status}"
NFT_CONF_TOR="/etc/nftables.conf"
NFT_CONF_WG="/etc/nftables.wg.conf"
WIREGUARD_CONF="/etc/wireguard/wg0.conf"

show_status() {
echo "=== Current Status ==="
echo ""
echo "--- nftables rules ---"
sudo nft list ruleset 2>/dev/null || echo "No nftables rules loaded"
echo ""
echo "--- Tor service ---"
systemctl is-active tor 2>/dev/null || echo "Tor: inactive"
echo ""
echo "--- WireGuard ---"
wg show 2>/dev/null || echo "WireGuard: no interfaces"
echo ""
echo "--- Default route ---"
ip route | grep default || true
echo ""
echo "--- Checking Tor connectivity ---"
curl -s https://check.torproject.org | grep -i "congratulations\|sorry"
}

disable_tor() {
echo "[*] Disabling Tor transparent proxy..."

# Stop Tor service
if systemctl is-active --quiet tor 2>/dev/null; then
sudo systemctl stop tor
echo " Tor service stopped"
fi

# Flush nftables (remove Tor rules)
sudo nft flush ruleset 2>/dev/null || true
echo " nftables flushed"

# Restore basic nftables or leave empty for WireGuard
sudo nft -f - <<'EOF' 2>/dev/null || true
#!/usr/sbin/nft -f

table ip filter {
chain input {
type filter hook input priority filter; policy accept;
}
chain forward {
type filter hook forward priority filter; policy accept;
}
chain output {
type filter hook output priority filter; policy accept;
}
}
EOF

echo "[*] Tor disabled. Basic firewall restored."
}

enable_wireguard() {
echo "[*] Enabling WireGuard..."

# Check if WireGuard config exists
if [ ! -f "$WIREGUARD_CONF" ]; then
echo "[!] WireGuard config not found: $WIREGUARD_CONF"
echo " Please create your WireGuard configuration first."
exit 1
fi

# Make sure Tor is stopped
disable_tor

# Enable IP forwarding (required for WireGuard)
sudo sysctl -w net.ipv4.ip_forward=1 >/dev/null

# Start WireGuard
sudo wg-quick up wg0 2>/dev/null || true

# Ensure WireGuard starts on boot
sudo systemctl enable wg-quick@wg0 2>/dev/null || true
sudo systemctl start wg-quick@wg0 2>/dev/null || true

echo "[*] WireGuard enabled on wg0"
}

enable_tor() {
echo "[*] Enabling Tor transparent proxy..."

# Stop WireGuard if active
if wg show wg0 >/dev/null 2>&1; then
echo " Stopping WireGuard..."
sudo wg-quick down wg0 2>/dev/null || true
sudo systemctl stop wg-quick@wg0 2>/dev/null || true
sudo systemctl disable wg-quick@wg0 2>/dev/null || true
fi

# Restore Tor nftables rules
if [ -f "$NFT_CONF_TOR" ]; then
sudo nft -f "$NFT_CONF_TOR"
echo " Tor nftables rules restored"
else
echo "[!] Tor nftables config not found: $NFT_CONF_TOR"
exit 1
fi

# Start Tor
sudo systemctl start tor
sudo systemctl enable tor

echo "[*] Tor transparent proxy enabled"
}

case "$MODE" in
tor|t)
enable_tor
;;
wg|wireguard|w)
enable_wireguard
;;
status|s|"")
show_status
;;
*)
echo "Usage: $0 [tor|wg|status]"
echo ""
echo " tor - Enable Tor transparent proxy, disable WireGuard"
echo " wg - Enable WireGuard VPN, disable Tor"
echo " status - Show current network status (default)"
echo ""
exit 1
;;
esac

echo ""
show_status
linux_privacy · 1w
Tails на телефоне. Создаем зашифрованную мобильную ОС, которая будет терять все данные после перезагрузки. Сна...
linux_privacy profile picture
После запуска системы запускаем обновления. Затем отправляем весь трафик через Tor, запустив этот скрипт (оставляем только дырку для Waydroid, в который для торификации установите Invizible Pro и в настройках VPN включите блокировку трафика при отключении приложения):

#!/bin/bash

set -e

TOR_UID=108

# Step 1: Install Tor
echo "[*] Installing Tor..."
sudo apt update
sudo apt install -y tor

# Step 2: Configure Tor
echo "[*] Configuring Tor..."
sudo tee /etc/tor/torrc >/dev/null <<'EOF'
TransPort 127.0.0.1:9040
DNSPort 127.0.0.1:9053
AutomapHostsOnResolve 1
VirtualAddrNetworkIPv4 10.192.0.0/10
EOF

# Step 3: Restart and enable Tor
echo "[*] Restarting and enabling Tor service..."
sudo systemctl restart tor
sudo systemctl enable tor

# Step 4: Verify Tor is listening
echo "[*] Checking Tor listening ports..."
sudo ss -tulpn | grep tor

# Step 5: Configure nftables
echo "[*] Writing nftables configuration..."
sudo tee /etc/nftables.conf >/dev/null <<EOF
#!/usr/sbin/nft -f

flush ruleset

define uid = ${TOR_UID}

define waydroid_net = 192.168.240.0/24

define unrouteables = {
127.0.0.0/8,
10.0.0.0/8,
172.16.0.0/12,
192.168.0.0/16,
0.0.0.0/8,
100.64.0.0/10,
169.254.0.0/16,
192.0.0.0/24,
192.0.2.0/24,
192.88.99.0/24,
198.18.0.0/15,
198.51.100.0/24,
203.0.113.0/24,
224.0.0.0/4,
240.0.0.0/4
}

table ip nat {
set unrouteables {
type ipv4_addr
flags interval
elements = \$unrouteables
}

chain prerouting {
type nat hook prerouting priority dstnat; policy accept;
}

chain postrouting {
type nat hook postrouting priority srcnat; policy accept;

oifname != "waydroid0" ip saddr \$waydroid_net counter masquerade
}

chain output {
type nat hook output priority dstnat; policy accept;

ct state established,related accept

ip daddr \$waydroid_net return
ip saddr \$waydroid_net return

meta l4proto tcp ip daddr 10.192.0.0/10 redirect to :9040

ip daddr 127.0.0.1 udp dport 53 redirect to :9053

meta skuid \$uid return

oifname "lo" return

ip daddr @unrouteables return

meta l4proto tcp redirect to :9040
}
}

table ip filter {
set unrouteables {
type ipv4_addr
flags interval
elements = \$unrouteables
}

chain input {
type filter hook input priority filter; policy drop;

ct state established,related accept
iifname "lo" accept

iifname "waydroid0" udp dport { 53, 67 } accept
iifname "waydroid0" tcp dport { 53, 67 } accept

counter log prefix "TOR-INPUT-DROP: " drop
}

chain forward {
type filter hook forward priority filter; policy drop;

ct state established,related accept

iifname "waydroid0" oifname != "waydroid0" accept
iifname != "waydroid0" oifname "waydroid0" ct state established,related accept
}

chain output {
type filter hook output priority filter; policy drop;

ct state established,related accept

oifname "lo" accept

ip daddr \$waydroid_net accept
oifname "waydroid0" accept

meta skuid \$uid accept

ip daddr @unrouteables accept

meta l4proto tcp accept

udp dport 53 accept

counter log prefix "TOR-KILLSWITCH: " drop
}
}
EOF

# Step 6: Validate and apply nftables
echo "[*] Validating nftables configuration..."
sudo nft -c -f /etc/nftables.conf

echo "[*] Applying nftables rules..."
sudo nft -f /etc/nftables.conf

# Step 7: Enable and start nftables
echo "[*] Enabling nftables service..."
sudo systemctl enable nftables
sudo systemctl start nftables

# Step 8: Show active ruleset
echo "[*] Current nftables ruleset:"
sudo nft list ruleset

# Step 9: Verify Tor connectivity
echo "[*] Checking Tor connectivity..."
curl -s https://check.torproject.org | grep -i "congratulations\|sorry"
1
linux_privacy · 1w
Если хотите иметь еще и VPN, например WG, то запустите его по классике и сделайте такой переключатель из тора в вг и обратно в /usr/local/bin (переключение будет через команды...
linux_privacy profile picture
Tails на телефоне. Создаем зашифрованную мобильную ОС, которая будет терять все данные после перезагрузки.

Сначала устанавливаем Mobian - дебиан для телефонов (проще всего на старый pixel 3a, который можно купить за 3 копейки). Для полнодискового шифрования нужно собрать ОС.
устанавливаем зависимости и клонируем репозиторий

sudo apt install debos bmap-tools xz-utils android-sdk-libsparse-utils yq mkbootimg cryptsetup

git clone https://salsa.debian.org/Mobian-team/mobian-recipes.git -b mobian-trixie
cd mobian-recipes

и запускаем сборку указав свой пароль от диска (sdm670 - это для pixel)

./build.sh -t sdm670 -c -R <password>

после сборки ставим образ в телефон
sudo apt install adb fastboot google-android-platform-tools-installer
включаем режим разработчика: Настройки → Система → Об устройстве → 7 раз нажми "Номер сборки"
включаем OEM-разблокировку: Настройки → Система → Параметры разработчика → "Разблокировка OEM"
перезагружаем в fastboot: power + volume down при выключенном устройстве.
затем вводим эти команды
fastboot flashing unlock
fastboot flash boot mobian-*-phosh-*.boot-sargo.img #название созданного boot-sargo.img
fastboot -S 100M flash userdata mobian-*-phosh-*.rootfs.img #название созданного rootfs.img
fastboot erase dtbo
fastboot oem uart enable
fastboot reboot
и вводим пароль шифрования при запуске системы. дефолтный пинкод будет 1234. система установлена, продолжение ниже.
5
linux_privacy · 1w
После запуска системы запускаем обновления. Затем отправляем весь трафик через Tor, запустив этот скрипт (оставляем только дырку для Waydroid, в который для торификации ...
linux_privacy · 1w
затем устанавливаем свой вариант overlayroot в initramfs для работы в RAM и потере данных при перезагрузке из режима overlayroot: sudo tee /etc/initramfs-tools/scripts/init-bottom/overlayroot >/dev/null <<EOF #!/bin/sh # Ov...