Support ServerTransportListenAddr obfs4 Out of the box
Hi,
Any chance you could have the script detect when ServerTransportListenAddr obfs4 is in use?
So I don't have to use CONFIGURED_RELAYS.
Thank you,
Will
So, let ipv4-rules.sh and ipv6-rules.sh skip every tor config file if it contains the string ServerTransportListenAddr ?
Not skip.
Detect when it is in use, grab the port, and set up the rules for it just like you do with standard ORPort.
Can you please give config examples and mention the expected output?
On Ubuntu 24.04:
sudo apt-get install obfs4proxy
sudo setcap cap_net_bind_service=+ep /usr/bin/obfs4proxy
/etc/tor/torrc:
ORPort ServerIP:8080
ServerTransportPlugin obfs4 exec /usr/bin/obfs4proxy
ServerTransportListenAddr obfs4 ServerIP:8000
So the standard TOR port being port 8080 and using obfs4 on port 8000.
When running with:
sudo CONFIGURED_RELAYS="ServerIP :8080 ServerIP :8000" ./ipv4-rules.sh start
sudo watch -t ./ipv4-rules.sh:
0 0 ACCEPT 0 -- lo * 0.0.0.0/0 0.0.0.0/0 /* DDoS IPv4 Sun, 02 Mar 2025 15:25:52 +0000 */
0 0 DROP 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp flags:!0x17/0x02 state NEW
0 0 DROP 0 -- * * 0.0.0.0/0 0.0.0.0/0 ctstate INVALID
0 0 ACCEPT 0 -- * * 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:275 flags:0x17/0x02
0 0 ACCEPT 1 -- * * 0.0.0.0/0 0.0.0.0/0 icmptype 8 limit: avg 6/sec burst 5
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:68
0 0 ACCEPT 0 -- * * 0.0.0.0/0 0.0.0.0/0 match-set hetzner-sysmon src
0 0 ACCEPT 6 -- * * 0.0.0.0/0 ServerIP tcp flags:0x17/0x02 match-set tor-trust src
0 0 SET 6 -- * * 0.0.0.0/0 ServerIP tcp dpt:8080 limit: above 9/min burst 1 mode srcip-dstport htable-expire 120000 add-set tor-ddos-8080 src exist
0 0 DROP 6 -- * * 0.0.0.0/0 ServerIP tcp dpt:8080 match-set tor-ddos-8080 src
0 0 DROP 6 -- * * 0.0.0.0/0 ServerIP tcp dpt:8080 #conn src/32 > 9
0 0 ACCEPT 6 -- * * 0.0.0.0/0 ServerIP tcp dpt:8080 flags:0x17/0x02
0 0 SET 6 -- * * 0.0.0.0/0 ServerIP tcp dpt:8000 limit: above 9/min burst 1 mode srcip-dstport htable-expire 120000 add-set tor-ddos-8000 src exist
0 0 DROP 6 -- * * 0.0.0.0/0 ServerIP tcp dpt:8000 match-set tor-ddos-8000 src
0 0 DROP 6 -- * * 0.0.0.0/0 ServerIP tcp dpt:8000 #conn src/32 > 9
0 0 ACCEPT 6 -- * * 0.0.0.0/0 ServerIP tcp dpt:8000 flags:0x17/0x02
That's the expected and correct output when using CONFIGURED_RELAYS.
Both ports, 8080 and 8000, are protected.
If I leave off CONFIGURED_RELAYS and just run sudo ./ipv4-rules.sh start I get:
0 0 ACCEPT 0 -- lo * 0.0.0.0/0 0.0.0.0/0 /* DDoS IPv4 Mon, 03 Mar 2025 21:03:20 +0000 */
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp flags:!0x17/0x02 state NEW
0 0 ACCEPT 0 -- * * 0.0.0.0/0 0.0.0.0/0 ctstate INVALID
0 0 ACCEPT 0 -- * * 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:275 flags:0x17/0x02
0 0 ACCEPT 1 -- * * 0.0.0.0/0 0.0.0.0/0 icmptype 8 limit: avg 6/sec burst 5
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:68
0 0 ACCEPT 0 -- * * 0.0.0.0/0 0.0.0.0/0 match-set hetzner-sysmon src
0 0 ACCEPT 6 -- * * 0.0.0.0/0 ServerIP tcp flags:0x17/0x02 match-set tor-trust src
0 0 SET 6 -- * * 0.0.0.0/0 ServerIP tcp dpt:8080 limit: above 9/min burst 1 mode srcip-dstport htable-expire 120000 add-set tor-ddos-8080 src exist
0 0 ACCEPT 6 -- * * 0.0.0.0/0 ServerIP tcp dpt:8080 match-set tor-ddos-8080 src
0 0 ACCEPT 6 -- * * 0.0.0.0/0 ServerIP tcp dpt:8080 #conn src/32 > 9
0 0 ACCEPT 6 -- * * 0.0.0.0/0 ServerIP tcp dpt:8080 flags:0x17/0x02
Notice only standard port 8080 is protected.
Hhm, interesting. I never thought about preventing DDoS of a bridge (I used a reduced firewall for non-server relays: https://github.com/toralf/tor-relays/blob/main/playbooks/roles/setup_common/templates/firewall-ipv4.sh.j2) And because my bridges are configured like
BridgeRelay 1
ORPort 127.0.0.1:auto
AssumeReachable 1
ExtORPort auto
ServerTransportPlugin obfs4 exec /usr/bin/lyrebird
ServerTransportListenAddr obfs4 0.0.0.0:55832
I haven't thought about that. Ok, will try.
Does the commit above matches your needs?
When running with:
sudo CONFIGURED_RELAYS="ServerIP :8080 ServerIP :8000" ./ipv4-rules.sh start
BTW, The spaces before the colon are wrong (copy+paste error I do assume?)
Yes, correct. It's correct when I ran the command. Sorry about that.
Will test the commit this weekend.
Thank you very much.
Looks like it's reversed now:
Mon, 17 Mar 2025 18:12:07 +0000
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
1258 212K ts-input 0 -- * * 0.0.0.0/0 0.0.0.0/0
100 6500 ACCEPT 0 -- lo * 0.0.0.0/0 0.0.0.0/0
0 0 REJECT 0 -- !lo * 0.0.0.0/0 127.0.0.0/8 reject-with icmp-port-unreachable
641 179K ACCEPT 0 -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
83 3320 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
261 12688 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:10000
36 2140 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8000
2 100 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:41641
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:41641
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:3478
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:19999
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:275
12 788 ACCEPT 1 -- * * 0.0.0.0/0 0.0.0.0/0 icmptype 8
21 1208 LOG 0 -- * * 0.0.0.0/0 0.0.0.0/0 limit: avg 5/min burst 5 LOG flags 0 level 7 prefix "iptables denied: "
117 6528 REJECT 0 -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
0 0 ACCEPT 0 -- lo * 0.0.0.0/0 0.0.0.0/0 /* DDoS IPv4 Mon, 17 Mar 2025 18:10:42 +0000 */
0 0 DROP 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp flags:!0x17/0x02 state NEW
0 0 DROP 0 -- * * 0.0.0.0/0 0.0.0.0/0 ctstate INVALID
0 0 ACCEPT 0 -- * * 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
0 0 ACCEPT 6 -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:275 flags:0x17/0x02
0 0 ACCEPT 1 -- * * 0.0.0.0/0 0.0.0.0/0 icmptype 8 limit: avg 6/sec burst 5
0 0 ACCEPT 17 -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:68
0 0 ACCEPT 0 -- * * 0.0.0.0/0 0.0.0.0/0 match-set hetzner-sysmon src
0 0 ACCEPT 6 -- * * 0.0.0.0/0 ServerIP tcp flags:0x17/0x02 match-set tor-trust src
0 0 SET 6 -- * * 0.0.0.0/0 ServerIP tcp dpt:8000 limit: above 9/min burst 1 mode srcip-dstport htable-expire 120000 add-set tor-ddos-8000 src exist
0 0 DROP 6 -- * * 0.0.0.0/0 ServerIP tcp dpt:8000 match-set tor-ddos-8000 src
0 0 DROP 6 -- * * 0.0.0.0/0 ServerIP tcp dpt:8000 #conn src/32 > 9
0 0 ACCEPT 6 -- * * 0.0.0.0/0 ServerIP tcp dpt:8000 flags:0x17/0x02
Now missing the standard ORPort rules.
So I need the torrc to understood what happened. Please replace the ServerIP with 1.2.3.4 when attaching the file here.
/* DDoS IPv4 Mon, 17 Mar 2025 18:10:42 +0000 */
And I do not understood the rules above this one. Do you added additional code to the script?
/* DDoS IPv4 Mon, 17 Mar 2025 18:10:42 +0000 */
And I do not understood the rules above this one. Do you added additional code to the script?
Those are my normal iptables rules. Yeah I have to comment out clearRules on Lines 208, 284, 295 so my rules stay put.
So I need the torrc to understood what happened. Please replace the ServerIP with
1.2.3.4when attaching the file here.
Here you go.
## Configuration file for a typical Tor user
## Last updated 9 October 2013 for Tor 0.2.5.2-alpha.
## (may or may not work for much older or much newer versions of Tor.)
##
## Lines that begin with "## " try to explain what's going on. Lines
## that begin with just "#" are disabled commands: you can enable them
## by removing the "#" symbol.
##
## See 'man tor', or https://www.torproject.org/docs/tor-manual.html,
## for more options you can use in this file.
##
## Tor will look for this file in various places based on your platform:
## https://www.torproject.org/docs/faq#torrc
## Tor opens a socks proxy on port 9050 by default -- even if you don't
## configure one below. Set "SocksPort 0" if you plan to run Tor only
## as a relay, and not make any local application connections yourself.
#SocksPort 9050 # Default: Bind to localhost:9050 for local connections.
#SocksPort 192.168.0.1:9100 # Bind to this address:port too.
## Entry policies to allow/deny SOCKS requests based on IP address.
## First entry that matches wins. If no SocksPolicy is set, we accept
## all (and only) requests that reach a SocksPort. Untrusted users who
## can access your SocksPort may be able to learn about the connections
## you make.
#SocksPolicy accept 192.168.0.0/16
#SocksPolicy reject *
## Logs go to stdout at level "notice" unless redirected by something
## else, like one of the below lines. You can have as many Log lines as
## you want.
##
## We advise using "notice" in most cases, since anything more verbose
## may provide sensitive information to an attacker who obtains the logs.
##
## Send all messages of level 'notice' or higher to /var/log/tor/notices.log
Log notice file /var/log/tor/notices.log
## Send every possible message to /var/log/tor/debug.log
#Log debug file /var/log/tor/debug.log
## Use the system log instead of Tor's logfiles
#Log notice syslog
## To send all messages to stderr:
#Log debug stderr
## Uncomment this to start the process in the background... or use
## --runasdaemon 1 on the command line. This is ignored on Windows;
## see the FAQ entry if you want Tor to run as an NT service.
RunAsDaemon 1
## The directory for keeping all the keys/etc. By default, we store
## things in $HOME/.tor on Unix, and in Application Data\tor on Windows.
#DataDirectory /var/lib/tor
## The port on which Tor will listen for local connections from Tor
## controller applications, as documented in control-spec.txt.
ControlPort 9051
## If you enable the controlport, be sure to enable one of these
## authentication methods, to prevent attackers from accessing it.
#HashedControlPassword 16:872860B76453A77D60CA2BB8C1A7042072093276A3D701AD684053EC4C
HashedControlPassword 16:MyHashOfMyPassword
#CookieAuthentication 1
############### This section is just for location-hidden services ###
## Once you have configured a hidden service, you can look at the
## contents of the file ".../hidden_service/hostname" for the address
## to tell people.
##
## HiddenServicePort x y:z says to redirect requests on port x to the
## address y:z.
#HiddenServiceDir /var/lib/tor/hidden_service/
#HiddenServicePort 80 127.0.0.1:80
#HiddenServiceDir /var/lib/tor/other_hidden_service/
#HiddenServicePort 80 127.0.0.1:80
#HiddenServicePort 22 127.0.0.1:22
################ This section is just for relays #####################
#
## See https://www.torproject.org/docs/tor-doc-relay for details.
## Required: what port to advertise for incoming Tor connections.
ORPort 1.2.3.4:8080
## If you want to listen on a port other than the one advertised in
## ORPort (e.g. to advertise 443 but bind to 9090), you can do it as
## follows. You'll need to do ipchains or other port forwarding
## yourself to make this work.
#ORPort 443 NoListen
#ORPort 127.0.0.1:9090 NoAdvertise
## The IP address or full DNS name for incoming connections to your
## relay. Leave commented out and Tor will guess.
#Address noname.example.com
## If you have multiple network interfaces, you can specify one for
## outgoing traffic to use.
# OutboundBindAddress 10.0.0.5
## A handle for your relay, so people don't have to refer to it by key.
#Nickname ididnteditheconfig
## Define these to limit how much relayed traffic you will allow. Your
## own traffic is still unthrottled. Note that RelayBandwidthRate must
## be at least 20 KB.
## Note that units for these config options are bytes per second, not bits
## per second, and that prefixes are binary prefixes, i.e. 2^10, 2^20, etc.
#RelayBandwidthRate 100 KB # Throttle traffic to 100KB/s (800Kbps)
#RelayBandwidthBurst 200 KB # But allow bursts up to 200KB/s (1600Kbps)
RelayBandwidthRate 20480 KB # Throttle traffic to 20MB/s
RelayBandwidthBurst 25600 KB # But allow bursts up to 25MB/s
## Use these to restrict the maximum traffic per day, week, or month.
## Note that this threshold applies separately to sent and received bytes,
## not to their sum: setting "4 GB" may allow up to 8 GB total before
## hibernating.
##
## Set a maximum of 4 gigabytes each way per period.
#AccountingMax 4 GB
AccountingMax 25 GB
## Each period starts daily at midnight (AccountingMax is per day)
AccountingStart day 00:00
## Each period starts on the 3rd of the month at 15:00 (AccountingMax
## is per month)
#AccountingStart month 3 15:00
## Administrative contact information for this relay or bridge. This line
## can be used to contact you if your relay or bridge is misconfigured or
## something else goes wrong. Note that we archive and publish all
## descriptors containing these lines and that Google indexes them, so
## spammers might also collect them. You may want to obscure the fact that
## it's an email address and/or generate a new address for this purpose.
#ContactInfo Random Person <nobody AT example dot com>
## You might also include your PGP or GPG fingerprint if you have one:
#ContactInfo 0xFFFFFFFF Random Person <nobody AT example dot com>
ContactInfo <friends know how to contact me>
## Uncomment this to mirror directory information for others. Please do
## if you have enough bandwidth.
#DirPort 9030 # what port to advertise for directory connections
## If you want to listen on a port other than the one advertised in
## DirPort (e.g. to advertise 80 but bind to 9091), you can do it as
## follows. below too. You'll need to do ipchains or other port
## forwarding yourself to make this work.
#DirPort 80 NoListen
#DirPort 127.0.0.1:9091 NoAdvertise
## Uncomment to return an arbitrary blob of html on your DirPort. Now you
## can explain what Tor is if anybody wonders why your IP address is
## contacting them. See contrib/tor-exit-notice.html in Tor's source
## distribution for a sample.
#DirPortFrontPage /etc/tor/tor-exit-notice.html
## Uncomment this if you run more than one Tor relay, and add the identity
## key fingerprint of each Tor relay you control, even if they're on
## different networks. You declare it here so Tor clients can avoid
## using more than one of your relays in a single circuit. See
## https://www.torproject.org/docs/faq#MultipleRelays
## However, you should never include a bridge's fingerprint here, as it would
## break its concealability and potentionally reveal its IP/TCP address.
#MyFamily $keyid,$keyid,...
## A comma-separated list of exit policies. They're considered first
## to last, and the first match wins. If you want to _replace_
## the default exit policy, end this with either a reject *:* or an
## accept *:*. Otherwise, you're _augmenting_ (prepending to) the
## default exit policy. Leave commented to just use the default, which is
## described in the man page or at
## https://www.torproject.org/documentation.html
##
## Look at https://www.torproject.org/faq-abuse.html#TypicalAbuses
## for issues you might encounter if you use the default exit policy.
##
## If certain IPs and ports are blocked externally, e.g. by your firewall,
## you should update your exit policy to reflect this -- otherwise Tor
## users will be told that those destinations are down.
##
## For security, by default Tor rejects connections to private (local)
## networks, including to your public IP address. See the man page entry
## for ExitPolicyRejectPrivate if you want to allow "exit enclaving".
##
#ExitPolicy accept *:6660-6667,reject *:* # allow irc ports but no more
#ExitPolicy accept *:119 # accept nntp as well as default exit policy
#ExitPolicy reject *:* # no exits allowed
#ExitPolicy accept *:53 # DNS
#ExitPolicy accept *:80 # HTTP
#ExitPolicy accept *:443 # HTTPS
ExitPolicy reject *:*
## Bridge relays (or "bridges") are Tor relays that aren't listed in the
## main directory. Since there is no complete public list of them, even an
## ISP that filters connections to all the known Tor relays probably
## won't be able to block all the bridges. Also, websites won't treat you
## differently because they won't know you're running Tor. If you can
## be a real relay, please do; but if not, be a bridge!
BridgeRelay 1
## By default, Tor will advertise your bridge to users through various
## mechanisms like https://bridges.torproject.org/. If you want to run
## a private bridge, for example because you'll give out your bridge
## address manually to your friends, uncomment this line:
#PublishServerDescriptor 0
#ServerTransportPlugin
ServerTransportPlugin obfs4 exec /usr/bin/obfs4proxy
# Replace "TODO" with an obfs4 port of your choice. This port must be externally reachable.
# Avoid port 9001 because it's commonly associated with Tor and censors may be scanning the Internet for this port.
ServerTransportListenAddr obfs4 1.2.3.4:8000
# Local communication port between Tor and obfs4. Always set this to "auto".
# "Ext" means "extended", not "external". Don't try to set a specific port number, nor listen on 0.0.0.0.
ExtORPort auto
#Enable IPv6
ORPort IP6Addrss:9001
IPv6Exit 1
Basically:
Log notice file /var/log/tor/notices.log
RunAsDaemon 1
ControlPort 9051
HashedControlPassword 16:MyHashOfMyPassword
ORPort 1.2.3.4:8080
AccountingMax 25 GB
AccountingStart day 00:00
ContactInfo <friends know how to contact me>
ExitPolicy reject *:*
BridgeRelay 1
ServerTransportPlugin obfs4 exec /usr/bin/obfs4proxy
ServerTransportListenAddr obfs4 1.2.3.4:8000
ExtORPort auto
ORPort IP6Addrss:9001
IPv6Exit 1
You should never run a Bridge at the same address where you configured Tor to be a (visible) relay. Either configure Tor as a bridge, as a non-Exit relay or as an Exit.
The above does not work for an Exit because you missed ExitRelay 1.
But don't do that if you want to run a bridge.
The Torproject forum has a lot of helpful articles about that for you.
Beside that:
IP6Addrss is in [..] format?
I do not see other issue. So I dunno why the current script does not work as expected at your system. Can you try an unmodified version of the ddos script?
fixed behaviour by 64e24ee91