I use OpenVPN to tunnel iSCSI on a remote machine. Then I mount the iSCSI device using LUKS. Finally I rsync into the LUKS mount point. Encrypted, incremental, bla bla. Works pretty well. Here's the script:
zx2c4@thinkpad ~ $ cat Projects/remote-backup.sh
#!/bin/sh
cd "$(readlink -f "$(dirname "$0")")"
if [ $UID -ne 0 ]; then
echo "You must be root."
exit 1
fi
umount() {
if ! /bin/umount "$1"; then
sleep 5
if ! /bin/umount "$1"; then
sleep 10
/bin/umount "$1"
fi
fi
}
unwind() {
echo "[-] ERROR: unwinding and quitting."
sleep 3
trace sync
trace umount /mnt/mybackupserver-backup
trace cryptsetup luksClose mybackupserver-backup || { sleep 5; trace cryptsetup luksClose mybackupserver-backup; }
trace iscsiadm -m node -U all
trace kill %1
exit 1
}
trace() {
echo "[+] $@"
"$@"
}
RSYNC_OPTS="-i -rlptgoXDHxv --delete-excluded --delete --progress $RSYNC_OPTS"
trap unwind INT TERM
trace modprobe libiscsi
trace modprobe scsi_transport_iscsi
trace modprobe iscsi_tcp
iscsid -f &
sleep 1
trace iscsiadm -m discovery -t st -p mybackupserver.somehost.somewere -P 1 -l
sleep 5
trace cryptsetup --key-file /etc/dmcrypt/backup-mybackupserver-key luksOpen /dev/disk/by-uuid/10a126a2-c991-49fc-89bf-8d621a73dd36 mybackupserver-backup || unwind
trace fsck -a /dev/mapper/mybackupserver-backup || unwind
trace mount -v /dev/mapper/mybackupserver-backup /mnt/mybackupserver-backup || unwind
trace rsync $RSYNC_OPTS --exclude=/usr/portage/distfiles --exclude=/home/zx2c4/.cache --exclude=/var/tmp / /mnt/mybackupserver-backup/root || unwind
trace rsync $RSYNC_OPTS /mnt/storage/Archives/ /mnt/mybackupserver-backup/archives || unwind
trace sync
trace umount /mnt/mybackupserver-backup
trace cryptsetup luksClose mybackupserver-backup
trace iscsiadm -m node -U all
trace kill %1