Files
tor-guard-relay/templates/tor-exit-notice/tor-exit-notice (r3bo0tbx1).html
rE-Bo0t.bx1 dd598ca1f9 ♻️ refactor(ops): optimize workflows, docker setup and relay configs
Refactors the repository configuration to streamline CI/CD processes and tune Tor relay settings.

**CI & Build:**
- 👷 Enhance `cleanup.yml` with clearer cache deletion and logging.
- 🐳 Update `.dockerignore` to streamline CI builds.
- 🔧 Simplify `.gitattributes` and prune `.hadolint.yaml` comments.

**Tor Configuration:**
- 🛡️ Tune `relay-guard.conf` for performance and remove noise.
- 🌉 Update `relay-bridge.conf` ORPort/ServerTransport settings.
-  Refine `relay-exit.conf` exit policies and bandwidth limits.

**Misc & Cleanup:**
- 💄 Improve startup banner aesthetics in `docker-entrypoint.sh`.
- 📝 Add JS execution warnings to `tor-exit-notice` HTML template.
- 🔥 Remove obsolete `examples/.env` file.
2025-12-07 22:20:45 +08:00

599 lines
18 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Tor Exit Router Notice</title>
<meta name="robots" content="noindex, nofollow">
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml,%3Csvg
xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' stroke='%239955B3' fill='none' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z'/%3E%3C/svg%3E">
<style>
:root {
--bg-color: #050505;
--card-bg: rgba(22, 27, 34, 0.7);
--card-border: rgba(48, 54, 61, 0.6);
--text-main: #e6edf3;
--text-muted: #7d8590;
--tor-purple: #9955B3;
--tor-glow: rgba(153, 85, 179, 0.25);
--danger: #ff7b72;
--safe: #238636;
--link: #58a6ff;
--code-bg: rgba(110, 118, 129, 0.15);
}
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
background-color: var(--bg-color);
background-image:
radial-gradient(circle at 15% 25%, rgba(125, 70, 152, 0.08) 0%, transparent 25%),
radial-gradient(circle at 85% 75%, rgba(35, 134, 54, 0.08) 0%, transparent 25%),
linear-gradient(rgba(255, 255, 255, 0.03) 1px, transparent 1px),
linear-gradient(90deg, rgba(255, 255, 255, 0.03) 1px, transparent 1px);
background-size: 100% 100%, 100% 100%, 30px 30px, 30px 30px;
background-position: 0 0, 0 0, center center, center center;
color: var(--text-main);
line-height: 1.6;
padding: 40px 20px;
display: flex;
justify-content: center;
min-height: 100vh;
}
::selection {
background: var(--tor-purple);
color: white;
}
.container {
max-width: 900px;
width: 100%;
}
header {
text-align: center;
margin-bottom: 50px;
}
h1 {
font-weight: 800;
font-size: 2.5rem;
color: #ffffff;
margin-bottom: 12px;
letter-spacing: -1px;
text-shadow: 0 0 20px rgba(255, 255, 255, 0.1);
}
.status-pill {
display: inline-flex;
align-items: center;
background: rgba(35, 134, 54, 0.1);
border: 1px solid rgba(35, 134, 54, 0.4);
color: #3fb950;
padding: 6px 16px;
border-radius: 100px;
font-size: 0.8rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.5px;
backdrop-filter: blur(4px);
}
.status-pill::before {
content: '';
display: block;
width: 8px;
height: 8px;
background-color: #3fb950;
border-radius: 50%;
margin-right: 8px;
box-shadow: 0 0 10px #3fb950;
animation: blink 2s infinite;
}
.status-pill.danger {
color: var(--danger);
border-color: rgba(255, 123, 114, 0.4);
background: rgba(255, 123, 114, 0.1);
}
.status-pill.danger::before {
background-color: var(--danger);
box-shadow: 0 0 10px var(--danger);
}
.card {
background-color: var(--card-bg);
border: 1px solid var(--card-border);
border-radius: 16px;
padding: 35px;
margin-bottom: 30px;
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);
}
h2 {
color: #ffffff;
margin-bottom: 20px;
font-size: 1.3rem;
display: flex;
align-items: center;
gap: 12px;
border-bottom: 1px solid var(--card-border);
padding-bottom: 15px;
}
p {
margin-bottom: 16px;
color: var(--text-muted);
font-size: 1.05rem;
}
a {
color: var(--link);
text-decoration: none;
transition: all 0.2s;
}
a:hover {
color: #8dbdff;
text-decoration: underline;
}
code {
font-family: 'SF Mono', 'Segoe UI Mono', 'Roboto Mono', monospace;
background: var(--code-bg);
padding: 2px 6px;
border-radius: 4px;
color: #e6edf3;
font-size: 0.9em;
border: 1px solid rgba(255, 255, 255, 0.1);
}
.diagram-wrapper {
background: rgba(0, 0, 0, 0.3);
border: 1px solid var(--card-border);
border-radius: 12px;
padding: 40px 20px;
margin: 30px 0;
position: relative;
}
.flow-container {
display: flex;
justify-content: space-between;
align-items: center;
position: relative;
z-index: 2;
}
.step {
display: flex;
flex-direction: column;
align-items: center;
text-align: center;
width: 120px;
z-index: 5;
}
.icon-box {
width: 70px;
height: 70px;
background: #1c2128;
border: 2px solid var(--card-border);
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 15px;
transition: all 0.3s ease;
position: relative;
}
.icon-box svg {
width: 30px;
height: 30px;
fill: var(--text-muted);
transition: fill 0.3s;
}
.label {
font-size: 0.9rem;
font-weight: 600;
color: var(--text-main);
}
.sub-label {
font-size: 0.75rem;
color: var(--text-muted);
margin-top: 4px;
}
.step.active .icon-box {
border-color: var(--tor-purple);
box-shadow: 0 0 25px var(--tor-glow);
background: rgba(125, 70, 152, 0.1);
}
.step.active .icon-box::after {
content: '';
position: absolute;
top: -4px;
left: -4px;
right: -4px;
bottom: -4px;
border-radius: 50%;
border: 2px solid var(--tor-purple);
opacity: 0;
animation: pulse-ring 2.5s cubic-bezier(0.215, 0.61, 0.355, 1) infinite;
}
.step.active .icon-box svg {
fill: var(--tor-purple);
}
.connector {
flex-grow: 1;
height: 3px;
background: #30363d;
position: relative;
margin: 0 10px;
margin-bottom: 35px;
border-radius: 2px;
overflow: hidden;
}
.connector::after {
content: '';
position: absolute;
top: 0;
left: 0;
bottom: 0;
width: 100%;
background: repeating-linear-gradient(90deg,
transparent,
transparent 5px,
rgba(255, 255, 255, 0.4) 5px,
rgba(255, 255, 255, 0.8) 15px);
animation: flow-horizontal 1.5s linear infinite;
}
.connector.encrypted {
background: rgba(125, 70, 152, 0.3);
}
.connector.encrypted::after {
background: repeating-linear-gradient(90deg, transparent, transparent 10px, var(--tor-purple) 10px, var(--tor-purple) 25px);
}
.connector.plain {
background: rgba(248, 81, 73, 0.3);
}
.connector.plain::after {
background: repeating-linear-gradient(90deg, transparent, transparent 10px, var(--danger) 10px, var(--danger) 25px);
}
.conn-label {
position: absolute;
top: 12px;
left: 50%;
transform: translateX(-50%);
font-size: 0.65rem;
letter-spacing: 1px;
font-weight: 700;
text-transform: uppercase;
}
.encrypted .conn-label {
color: var(--tor-purple);
}
.plain .conn-label {
color: var(--danger);
}
.contact-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 15px;
margin-top: 20px;
}
.contact-box {
background: rgba(255, 255, 255, 0.03);
border: 1px solid var(--card-border);
padding: 20px;
border-radius: 8px;
display: flex;
flex-direction: column;
gap: 5px;
transition: background 0.2s;
}
.contact-box:hover {
background: rgba(255, 255, 255, 0.06);
}
.contact-label {
font-size: 0.75rem;
color: var(--text-muted);
font-weight: bold;
text-transform: uppercase;
}
.contact-value {
font-family: monospace;
font-size: 1rem;
color: var(--text-main);
}
footer {
text-align: center;
font-size: 0.85rem;
color: var(--text-muted);
margin-top: 40px;
border-top: 1px solid var(--card-border);
padding-top: 20px;
}
@keyframes pulse-ring {
0% {
transform: scale(0.8);
opacity: 0.8;
}
100% {
transform: scale(1.4);
opacity: 0;
}
}
@keyframes blink {
0% {
opacity: 1;
}
50% {
opacity: 0.5;
}
100% {
opacity: 1;
}
}
@keyframes flow-horizontal {
from {
transform: translateX(-25px);
}
to {
transform: translateX(0);
}
}
@keyframes flow-vertical {
from {
transform: translateY(-25px);
}
to {
transform: translateY(0);
}
}
@media (max-width: 768px) {
.flow-container {
flex-direction: column;
gap: 0;
}
.step {
width: 100%;
padding: 10px 0;
}
.icon-box {
margin: 0 auto 10px auto;
width: 60px;
height: 60px;
}
.icon-box svg {
width: 24px;
height: 24px;
}
.connector {
width: 3px;
height: 80px;
margin: 0 auto;
margin-bottom: 0;
}
.conn-label {
top: 50%;
left: 15px;
transform: translateY(-50%);
text-align: left;
width: 150px;
}
.connector::after {
background: repeating-linear-gradient(0deg,
transparent,
transparent 5px,
rgba(255, 255, 255, 0.4) 5px,
rgba(255, 255, 255, 0.8) 15px);
animation: flow-vertical 1.5s linear infinite;
}
.connector.encrypted::after {
background: repeating-linear-gradient(180deg, transparent, transparent 10px, var(--tor-purple) 10px, var(--tor-purple) 25px);
}
.connector.plain::after {
background: repeating-linear-gradient(180deg, transparent, transparent 10px, var(--danger) 10px, var(--danger) 25px);
}
}
@media print {
body {
background: white;
color: black;
display: block;
}
.card {
border: 1px solid #ccc;
box-shadow: none;
background: none;
color: black;
}
h1,
h2,
p,
a {
color: black !important;
text-shadow: none !important;
}
.diagram-wrapper {
display: none;
}
.contact-box {
border: 1px solid #ccc;
}
a {
text-decoration: underline;
}
}
</style>
</head>
<body>
<div class="container">
<header>
<h1>Tor Exit Router</h1>
<div class="status-pill">System Operational</div>
<div style="margin-top: 10px;">
<noscript>
<div class="status-pill"> JavaScript: Disabled (Safe) </div>
</noscript>
<div id="js-warning" class="status-pill danger" style="display: none;"> JavaScript: Enabled </div>
</div>
<script>
document.getElementById('js-warning').style.display = 'inline-flex';
</script>
</header>
<section class="card">
<h2>
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<circle cx="12" cy="12" r="10"></circle>
<line x1="12" y1="16" x2="12" y2="12"></line>
<line x1="12" y1="8" x2="12.01" y2="8"></line>
</svg> Information
</h2>
<p> You are visiting this page because the IP address <code>YOUR.EXIT.IP.ADDRESS</code> likely appeared in your server logs. </p>
<p> This server is a <strong>Tor Exit Node</strong>. It is part of the <a href="http://2gzyxa5ihm7nsggfxnu52rck2vv4rvmdlkiu3zzui5du4xyclen53wid.onion/" target="_blank">Tor Anonymity Network</a>. The traffic you observed <strong>did not originate from this machine</strong>; it originated from an anonymous user somewhere else in the world, and was merely routed through this server to reach the open internet. </p>
</section>
<section class="card">
<h2>
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<rect x="2" y="2" width="20" height="8" rx="2" ry="2"></rect>
<rect x="2" y="14" width="20" height="8" rx="2" ry="2"></rect>
<line x1="6" y1="6" x2="6" y2="6"></line>
<line x1="6" y1="18" x2="6" y2="18"></line>
</svg> Traffic Analysis
</h2>
<div class="diagram-wrapper">
<div class="flow-container">
<div class="step">
<div class="icon-box">
<svg viewBox="0 0 24 24" fill="currentColor">
<path d="M12 12c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm0 2c-2.67 0-8 1.34-8 4v2h16v-2c0-2.66-5.33-4-8-4z" />
</svg>
</div>
<div class="label">User</div>
<div class="sub-label">Hidden Origin</div>
</div>
<div class="connector encrypted">
<span class="conn-label">Encrypted</span>
</div>
<div class="step">
<div class="icon-box">
<svg viewBox="0 0 24 24" fill="currentColor">
<path d="M19.35 10.04C18.67 6.59 15.64 4 12 4 9.11 4 6.6 5.64 5.35 8.04 2.34 8.36 0 10.91 0 14c0 3.31 2.69 6 6 6h13c2.76 0 5-2.24 5-5 0-2.64-2.05-4.78-4.65-4.96z" />
</svg>
</div>
<div class="label">Tor Network</div>
<div class="sub-label">Relays</div>
</div>
<div class="connector encrypted">
<span class="conn-label">Encrypted</span>
</div>
<div class="step active">
<div class="icon-box">
<svg viewBox="0 0 24 24" fill="currentColor">
<path d="M4 1h16c1.1 0 2 .9 2 2v4c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V3c0-1.1.9-2 2-2zm0 4h16V3H4v2zm16 4H4v2h16V9zm-2-4h-2V4h2v1zm0 14h-2v-1h2v1zM4 11h16c1.1 0 2 .9 2 2v4c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2v-4c0-1.1.9-2 2-2zm0 4h16v-2H4v2z" />
</svg>
</div>
<div class="label">This Server</div>
<div class="sub-label">Exit Node</div>
</div>
<div class="connector plain">
<span class="conn-label">Unencrypted</span>
</div>
<div class="step">
<div class="icon-box">
<svg viewBox="0 0 24 24" fill="currentColor">
<path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-1 17.93c-3.95-.49-7-3.85-7-7.93 0-.62.08-1.21.21-1.79L9 15v1c0 1.1.9 2 2 2v1.93zm6.9-2.54c-.26-.81-1-1.39-1.9-1.39h-1v-3c0-.55-.45-1-1-1H8v-2h2c.55 0 1-.45 1-1V7h2c1.1 0 2-.9 2-2v-.41c2.93 1.19 5 4.06 5 7.41 0 2.08-.8 3.97-2.1 5.39z" />
</svg>
</div>
<div class="label">Your Server</div>
<div class="sub-label">Destination</div>
</div>
</div>
</div>
<p style="font-size: 0.9em; text-align: center; color: var(--text-muted);"> Traffic is encrypted within Tor. It only becomes visible when it leaves this exit node. </p>
</section>
<section class="card">
<h2>
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"></path>
</svg> Abuse Resolution
</h2>
<p> This machine is a common carrier. We do not host content. If you are investigating a DMCA violation or abuse originating from this IP, please contact the maintainer below. </p>
<div class="contact-grid">
<div class="contact-box">
<span class="contact-label">Maintainer Email</span>
<a href="mailto:user@domain.tld" class="contact-value">user@domain.tld</a>
</div>
<div class="contact-box">
<span class="contact-label">P2P Policy</span>
<span class="contact-value" style="color: var(--danger);">Blocked</span>
</div>
<div class="contact-box">
<span class="contact-label">Logs</span>
<span class="contact-value">None Stored</span>
</div>
</div>
<p style="margin-top: 25px; font-size: 0.9em; opacity: 0.8;"> Network administrators may block this IP using the <a href="https://check.torproject.org/torbulkexitlist" target="_blank">Tor Bulk Exit List</a>. </p>
</section>
<footer>
<p> Node Operated by "User" • <a href="http://hctxrvjzfpvmzh2jllqhgvvkoepxb4kfzdjm6h7egcwlumggtktiftid.onion/" target="_blank">Tor Metrics</a><a href="http://rzuwtpc4wb3xdzrj3yeajsvm3fkq4vbeubm2tdxaqruzzzgs5dwemlad.onion/" target="_blank">Tor Support</a>
</p>
</footer>
</div>
</body>
</html>