systemd: get rid of nftables portforwarding;

suggest letting copyparty bind 80/443 itself because nft hard
This commit is contained in:
ed 2023-11-30 10:13:14 +00:00
parent b7723ac245
commit 0b9b8dbe72
2 changed files with 77 additions and 28 deletions

View file

@ -0,0 +1,26 @@
# not actually YAML but lets pretend:
# -*- mode: yaml -*-
# vim: ft=yaml:
# put this file in /etc/
[global]
e2dsa # enable file indexing and filesystem scanning
e2ts # and enable multimedia indexing
ansi # and colors in log messages
# i: 127.0.0.1 # only allow connections from localhost
# p: 80,443,3923 # listen on 80/443 as well (requires CAP_NET_BIND_SERVICE)
# i: 127.0.0.1 # only allow connections from localhost (reverse-proxies)
[accounts]
ed: wark # username: password
[/] # create a volume at "/" (the webroot), which will
/mnt # share the contents of the "/mnt" folder
accs:
rw: * # everyone gets read-write access, but
rwmda: ed # the user "ed" gets read-write-move-delete-admin

View file

@ -1,28 +1,25 @@
# this will start `/usr/local/bin/copyparty-sfx.py` # this will start `/usr/local/bin/copyparty-sfx.py` and
# and share '/mnt' with anonymous read+write # read copyparty config from `/etc/copyparty.conf`, for example:
# https://github.com/9001/copyparty/blob/hovudstraum/contrib/systemd/copyparty.conf
# #
# installation: # installation:
# wget https://github.com/9001/copyparty/releases/latest/download/copyparty-sfx.py -O /usr/local/bin/copyparty-sfx.py # wget https://github.com/9001/copyparty/releases/latest/download/copyparty-sfx.py -O /usr/local/bin/copyparty-sfx.py
# cp -pv copyparty.service /etc/systemd/system/ # useradd -r -s /sbin/nologin -d /var/lib/copyparty copyparty
# restorecon -vr /etc/systemd/system/copyparty.service # on fedora/rhel # firewall-cmd --permanent --add-port=3923/tcp # --zone=libvirt
# firewall-cmd --permanent --add-port={80,443,3923}/tcp # --zone=libvirt
# firewall-cmd --reload # firewall-cmd --reload
# cp -pv copyparty.service /etc/systemd/system/
# cp -pv copyparty.conf /etc/
# restorecon -vr /etc/systemd/system/copyparty.service # on fedora/rhel
# systemctl daemon-reload && systemctl enable --now copyparty # systemctl daemon-reload && systemctl enable --now copyparty
# #
# if it fails to start, first check this: systemctl status copyparty # if it fails to start, first check this: systemctl status copyparty
# then try starting it while viewing logs: journalctl -fan 100 # then try starting it while viewing logs: journalctl -fan 100
# #
# you may want to: # you may want to:
# change "User=cpp" and "/home/cpp/" to another user # - change "User=copyparty" and "/var/lib/copyparty/" to another user
# remove the nft lines to only listen on port 3923 # - edit /etc/copyparty.conf to configure copyparty
# and in the ExecStart= line: # and in the ExecStart= line:
# change '/usr/bin/python3' to another interpreter # - change '/usr/bin/python3' to another interpreter
# change '/mnt::rw' to another location or permission-set
# add '-q' to disable logging on busy servers
# add '-i 127.0.0.1' to only allow local connections
# add '-e2dsa' to enable filesystem scanning + indexing
# add '-e2ts' to enable metadata indexing
# remove '--ansi' to disable colored logs
# #
# with `Type=notify`, copyparty will signal systemd when it is ready to # with `Type=notify`, copyparty will signal systemd when it is ready to
# accept connections; correctly delaying units depending on copyparty. # accept connections; correctly delaying units depending on copyparty.
@ -34,7 +31,9 @@
# following line to allow buffering (slightly better performance): # following line to allow buffering (slightly better performance):
# Environment=PYTHONUNBUFFERED=x # Environment=PYTHONUNBUFFERED=x
# #
# keep ExecStartPre before ExecStart, at least on rhel8 ########################################################################
########################################################################
[Unit] [Unit]
Description=copyparty file server Description=copyparty file server
@ -44,23 +43,47 @@ Type=notify
SyslogIdentifier=copyparty SyslogIdentifier=copyparty
Environment=PYTHONUNBUFFERED=x Environment=PYTHONUNBUFFERED=x
ExecReload=/bin/kill -s USR1 $MAINPID ExecReload=/bin/kill -s USR1 $MAINPID
PermissionsStartOnly=true
# user to run as + where the TLS certificate is (if any) ## user to run as + where the TLS certificate is (if any)
User=cpp ##
Environment=XDG_CONFIG_HOME=/home/cpp/.config User=copyparty
Group=copyparty
WorkingDirectory=/var/lib/copyparty
Environment=XDG_CONFIG_HOME=/var/lib/copyparty/.config
# OPTIONAL: setup forwarding from ports 80 and 443 to port 3923 ## OPTIONAL: allow copyparty to listen on low ports (like 80/443);
ExecStartPre=+/bin/bash -c 'nft -n -a list table nat | awk "/ to :3923 /{print\$NF}" | xargs -rL1 nft delete rule nat prerouting handle; true' ## you need to uncomment the "p: 80,443,3923" in the config too
ExecStartPre=+nft add table ip nat ## ------------------------------------------------------------
ExecStartPre=+nft -- add chain ip nat prerouting { type nat hook prerouting priority -100 \; } ## a slightly safer alternative is to enable partyalone.service
ExecStartPre=+nft add rule ip nat prerouting tcp dport 80 redirect to :3923 ## which does portforwarding with nftables instead, but an even
ExecStartPre=+nft add rule ip nat prerouting tcp dport 443 redirect to :3923 ## better option is to use a reverse-proxy (nginx/caddy/...)
##
AmbientCapabilities=CAP_NET_BIND_SERVICE
# stop systemd-tmpfiles-clean.timer from deleting copyparty while it's running ## some quick hardening; TODO port more from the nixos package
ExecStartPre=+/bin/bash -c 'mkdir -p /run/tmpfiles.d/ && echo "x /tmp/pe-copyparty*" > /run/tmpfiles.d/copyparty.conf' ##
MemoryMax=50%
MemorySwapMax=50%
ProtectClock=true
ProtectControlGroups=true
ProtectHostname=true
ProtectKernelLogs=true
ProtectKernelModules=true
ProtectKernelTunables=true
ProtectProc=invisible
RemoveIPC=true
RestrictNamespaces=true
RestrictRealtime=true
RestrictSUIDSGID=true
# copyparty settings ## finally, start copyparty and give it the config file:
ExecStart=/usr/bin/python3 /usr/local/bin/copyparty-sfx.py --ansi -e2d -v /mnt::rw ##
ExecStart=/usr/bin/python3 /usr/local/bin/copyparty-sfx.py -c /etc/copyparty.conf
# NOTE: if you installed copyparty from an OS package repo (nice)
# then you probably want something like this instead:
#ExecStart=/usr/bin/copyparty -c /etc/copyparty.conf
[Install] [Install]
WantedBy=multi-user.target WantedBy=multi-user.target