Init
This commit is contained in:
616
DEPLOYMENT.md
Normal file
616
DEPLOYMENT.md
Normal file
@@ -0,0 +1,616 @@
|
||||
# Deployment Guide
|
||||
|
||||
This guide walks you through deploying the VPN network on your actual servers.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- SSH access to both VDS servers
|
||||
- Root or sudo privileges
|
||||
- Basic familiarity with Linux command line
|
||||
|
||||
## Infrastructure
|
||||
|
||||
| Server | IP | Role |
|
||||
|--------|-----|------|
|
||||
| DE VDS | 194.31.173.178 | Exit node (Debian 13) |
|
||||
| RU VDS | 176.124.216.197 | Gateway (Debian 12) |
|
||||
|
||||
---
|
||||
|
||||
## Step 1: Deploy DE VDS (Exit Node)
|
||||
|
||||
### 1.1 Copy setup script to DE VDS
|
||||
|
||||
From your local machine:
|
||||
|
||||
```bash
|
||||
scp scripts/setup-de-vds.sh root@194.31.173.178:/root/
|
||||
```
|
||||
|
||||
### 1.2 Run setup script
|
||||
|
||||
SSH into DE VDS:
|
||||
|
||||
```bash
|
||||
ssh root@194.31.173.178
|
||||
```
|
||||
|
||||
Run the setup:
|
||||
|
||||
```bash
|
||||
cd /root
|
||||
chmod +x setup-de-vds.sh
|
||||
./setup-de-vds.sh
|
||||
```
|
||||
|
||||
### 1.3 Save the DE VDS public key
|
||||
|
||||
The script will output the DE VDS public key. **Copy it** - you'll need it for RU VDS.
|
||||
|
||||
Example output:
|
||||
```
|
||||
Your DE VDS public key is:
|
||||
Xabc123def456ghi789jkl012mno345pqr678stu901vwx234=
|
||||
```
|
||||
|
||||
**Do not start services yet** - we need to exchange keys first.
|
||||
|
||||
---
|
||||
|
||||
## Step 2: Deploy RU VDS (Gateway)
|
||||
|
||||
### 2.1 Copy setup script to RU VDS
|
||||
|
||||
From your local machine:
|
||||
|
||||
```bash
|
||||
scp scripts/setup-ru-vds.sh root@176.124.216.197:/root/
|
||||
```
|
||||
|
||||
### 2.2 Run setup script
|
||||
|
||||
SSH into RU VDS:
|
||||
|
||||
```bash
|
||||
ssh root@176.124.216.197
|
||||
```
|
||||
|
||||
Run the setup:
|
||||
|
||||
```bash
|
||||
cd /root
|
||||
chmod +x setup-ru-vds.sh
|
||||
./setup-ru-vds.sh
|
||||
```
|
||||
|
||||
### 2.3 Save the RU VDS keys
|
||||
|
||||
The script will output two public keys:
|
||||
|
||||
1. **Server key** - for clients (you'll use this later when adding clients)
|
||||
2. **DE tunnel key** - for DE VDS
|
||||
|
||||
Example output:
|
||||
```
|
||||
Server key (for clients):
|
||||
Yabc123def456ghi789jkl012mno345pqr678stu901vwx234=
|
||||
|
||||
DE tunnel key (for DE VDS):
|
||||
Zabc123def456ghi789jkl012mno345pqr678stu901vwx234=
|
||||
```
|
||||
|
||||
**Copy both keys** and keep them safe.
|
||||
|
||||
**Do not start services yet** - we need to configure keys first.
|
||||
|
||||
---
|
||||
|
||||
## Step 3: Exchange Keys
|
||||
|
||||
### 3.1 Configure DE VDS with RU key
|
||||
|
||||
SSH into DE VDS:
|
||||
|
||||
```bash
|
||||
ssh root@194.31.173.178
|
||||
```
|
||||
|
||||
Edit WireGuard config:
|
||||
|
||||
```bash
|
||||
nano /etc/wireguard/wg0.conf
|
||||
```
|
||||
|
||||
Replace `__RU_DE_TUNNEL_PUBLIC_KEY__` with the **RU DE tunnel key** (the second key from RU VDS).
|
||||
|
||||
Save and exit (Ctrl+X, Y, Enter).
|
||||
|
||||
### 3.2 Configure RU VDS with DE key
|
||||
|
||||
SSH into RU VDS:
|
||||
|
||||
```bash
|
||||
ssh root@176.124.216.197
|
||||
```
|
||||
|
||||
Edit WireGuard config:
|
||||
|
||||
```bash
|
||||
nano /etc/wireguard/wg1.conf
|
||||
```
|
||||
|
||||
Replace `__DE_SERVER_PUBLIC_KEY__` with the **DE VDS public key**.
|
||||
|
||||
Save and exit (Ctrl+X, Y, Enter).
|
||||
|
||||
---
|
||||
|
||||
## Step 4: Start Services
|
||||
|
||||
### 4.1 Start DE VDS services
|
||||
|
||||
SSH into DE VDS:
|
||||
|
||||
```bash
|
||||
ssh root@194.31.173.178
|
||||
```
|
||||
|
||||
Start services:
|
||||
|
||||
```bash
|
||||
systemctl start nftables
|
||||
systemctl start wg-quick@wg0
|
||||
```
|
||||
|
||||
Check status:
|
||||
|
||||
```bash
|
||||
systemctl status wg-quick@wg0
|
||||
wg show
|
||||
```
|
||||
|
||||
You should see:
|
||||
- `wg0` interface with IP `10.20.0.2/30`
|
||||
- No handshake yet (RU VDS not connected)
|
||||
|
||||
### 4.2 Start RU VDS services
|
||||
|
||||
SSH into RU VDS:
|
||||
|
||||
```bash
|
||||
ssh root@176.124.216.197
|
||||
```
|
||||
|
||||
Start services:
|
||||
|
||||
```bash
|
||||
systemctl start dnsmasq
|
||||
systemctl start wg-quick@wg1
|
||||
systemctl start wg-quick@wg0
|
||||
```
|
||||
|
||||
Check status:
|
||||
|
||||
```bash
|
||||
systemctl status wg-quick@wg1
|
||||
systemctl status wg-quick@wg0
|
||||
systemctl status dnsmasq
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Step 5: Verify Tunnel
|
||||
|
||||
### 5.1 Test from RU VDS
|
||||
|
||||
```bash
|
||||
# Ping DE VDS through tunnel
|
||||
ping -c 4 10.20.0.2
|
||||
|
||||
# Check WireGuard handshake
|
||||
wg show wg1
|
||||
```
|
||||
|
||||
You should see:
|
||||
- Successful ping responses
|
||||
- Recent handshake timestamp
|
||||
- Transfer data counters
|
||||
|
||||
### 5.2 Test from DE VDS
|
||||
|
||||
```bash
|
||||
# Check WireGuard handshake
|
||||
wg show wg0
|
||||
|
||||
# You should see recent handshake from RU VDS
|
||||
```
|
||||
|
||||
### 5.3 Check routing on RU VDS
|
||||
|
||||
```bash
|
||||
# Check routing table
|
||||
ip route show table proxy
|
||||
|
||||
# Check ipset
|
||||
ipset list direct
|
||||
|
||||
# Check policy routing rules
|
||||
ip rule show
|
||||
```
|
||||
|
||||
Expected output:
|
||||
- Routing table `proxy` should have default route via `10.20.0.2`
|
||||
- ipset `direct` should exist (empty initially)
|
||||
- Policy routing rule for `10.10.0.0/24` with fwmark `0x1`
|
||||
|
||||
---
|
||||
|
||||
## Step 6: Add First Client
|
||||
|
||||
### 6.1 Copy client management scripts to RU VDS
|
||||
|
||||
From your local machine:
|
||||
|
||||
```bash
|
||||
scp scripts/add-client.sh root@176.124.216.197:/root/
|
||||
scp scripts/list-clients.sh root@176.124.216.197:/root/
|
||||
scp scripts/disable-client.sh root@176.124.216.197:/root/
|
||||
scp scripts/enable-client.sh root@176.124.216.197:/root/
|
||||
scp scripts/remove-client.sh root@176.124.216.197:/root/
|
||||
```
|
||||
|
||||
### 6.2 Add a client
|
||||
|
||||
SSH into RU VDS:
|
||||
|
||||
```bash
|
||||
ssh root@176.124.216.197
|
||||
```
|
||||
|
||||
Add client (replace "phone" with your device name):
|
||||
|
||||
```bash
|
||||
chmod +x /root/*.sh
|
||||
/root/add-client.sh phone
|
||||
```
|
||||
|
||||
The script will:
|
||||
1. Generate client keys
|
||||
2. Assign IP address (starting from 10.10.0.2)
|
||||
3. Add peer to WireGuard
|
||||
4. Create client config file
|
||||
5. Display QR code for mobile devices
|
||||
|
||||
### 6.3 Transfer configuration to client
|
||||
|
||||
**For mobile devices:**
|
||||
- Scan the QR code with WireGuard app
|
||||
|
||||
**For desktop/laptop:**
|
||||
- Copy the configuration file from RU VDS:
|
||||
```bash
|
||||
cat /etc/wireguard/clients/phone.conf
|
||||
```
|
||||
- Save it locally as `phone.conf`
|
||||
- Import into WireGuard client
|
||||
|
||||
---
|
||||
|
||||
## Step 7: Test Client Connection
|
||||
|
||||
### 7.1 Connect from client
|
||||
|
||||
1. Open WireGuard app/client
|
||||
2. Import/scan the configuration
|
||||
3. Connect
|
||||
|
||||
### 7.2 Test basic connectivity
|
||||
|
||||
From the client device:
|
||||
|
||||
```bash
|
||||
# Test VPN gateway
|
||||
ping 10.10.0.1
|
||||
|
||||
# Test DNS
|
||||
nslookup google.com
|
||||
nslookup yandex.ru
|
||||
```
|
||||
|
||||
### 7.3 Test routing
|
||||
|
||||
From the client device:
|
||||
|
||||
```bash
|
||||
# Check external IP (should show DE VDS IP: 194.31.173.178)
|
||||
curl ifconfig.me
|
||||
|
||||
# Visit a Russian site, then check ipset on RU VDS
|
||||
```
|
||||
|
||||
On RU VDS:
|
||||
|
||||
```bash
|
||||
# After client visits .ru domains, check direct ipset
|
||||
ipset list direct
|
||||
|
||||
# Should show Russian IPs
|
||||
```
|
||||
|
||||
### 7.4 Advanced testing
|
||||
|
||||
Test that `.ru` domains go direct:
|
||||
|
||||
```bash
|
||||
# From client - visit some Russian sites
|
||||
curl -I https://yandex.ru
|
||||
curl -I https://mail.ru
|
||||
|
||||
# Then on RU VDS - check ipset
|
||||
ipset list direct
|
||||
```
|
||||
|
||||
Test that other domains go through DE:
|
||||
|
||||
```bash
|
||||
# From client
|
||||
traceroute google.com
|
||||
# Should show hop through 10.20.0.x
|
||||
|
||||
traceroute yandex.ru
|
||||
# Should NOT show 10.20.0.x hop (goes direct)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Step 8: Client Management
|
||||
|
||||
### List all clients
|
||||
|
||||
```bash
|
||||
/root/list-clients.sh
|
||||
```
|
||||
|
||||
### Add another client
|
||||
|
||||
```bash
|
||||
/root/add-client.sh laptop
|
||||
```
|
||||
|
||||
### Disable a client temporarily
|
||||
|
||||
```bash
|
||||
/root/disable-client.sh phone
|
||||
```
|
||||
|
||||
### Enable a disabled client
|
||||
|
||||
```bash
|
||||
/root/enable-client.sh phone
|
||||
```
|
||||
|
||||
### Permanently remove a client
|
||||
|
||||
```bash
|
||||
/root/remove-client.sh phone
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Tunnel not working
|
||||
|
||||
**Check WireGuard status:**
|
||||
```bash
|
||||
# On both servers
|
||||
wg show
|
||||
systemctl status wg-quick@wg0
|
||||
systemctl status wg-quick@wg1 # RU only
|
||||
```
|
||||
|
||||
**Check if ports are open:**
|
||||
```bash
|
||||
# On DE VDS
|
||||
ss -ulnp | grep 51821
|
||||
|
||||
# On RU VDS
|
||||
ss -ulnp | grep 51820
|
||||
```
|
||||
|
||||
**Check firewall:**
|
||||
```bash
|
||||
nft list ruleset
|
||||
```
|
||||
|
||||
### DNS not working
|
||||
|
||||
**Check dnsmasq:**
|
||||
```bash
|
||||
# On RU VDS
|
||||
systemctl status dnsmasq
|
||||
journalctl -u dnsmasq -n 50
|
||||
```
|
||||
|
||||
**Test DNS locally:**
|
||||
```bash
|
||||
dig @127.0.0.1 google.com
|
||||
dig @10.10.0.1 yandex.ru
|
||||
```
|
||||
|
||||
### Routing not working
|
||||
|
||||
**Check routing tables:**
|
||||
```bash
|
||||
# On RU VDS
|
||||
ip route show table proxy
|
||||
ip rule show
|
||||
```
|
||||
|
||||
**Check ipset:**
|
||||
```bash
|
||||
ipset list direct
|
||||
```
|
||||
|
||||
**Check iptables mangle:**
|
||||
```bash
|
||||
iptables -t mangle -L -v
|
||||
```
|
||||
|
||||
### Client can't connect
|
||||
|
||||
**Check client config:**
|
||||
- Correct server IP (176.124.216.197)
|
||||
- Correct port (51820)
|
||||
- Correct DNS (10.10.0.1)
|
||||
|
||||
**Check server logs:**
|
||||
```bash
|
||||
# On RU VDS
|
||||
journalctl -u wg-quick@wg0 -f
|
||||
```
|
||||
|
||||
**Check if peer is added:**
|
||||
```bash
|
||||
wg show wg0
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Maintenance
|
||||
|
||||
### View logs
|
||||
|
||||
```bash
|
||||
# WireGuard
|
||||
journalctl -u wg-quick@wg0 -f
|
||||
journalctl -u wg-quick@wg1 -f
|
||||
|
||||
# dnsmasq
|
||||
journalctl -u dnsmasq -f
|
||||
|
||||
# System
|
||||
dmesg | grep -i wireguard
|
||||
```
|
||||
|
||||
### Restart services
|
||||
|
||||
```bash
|
||||
# RU VDS
|
||||
systemctl restart wg-quick@wg0
|
||||
systemctl restart wg-quick@wg1
|
||||
systemctl restart dnsmasq
|
||||
|
||||
# DE VDS
|
||||
systemctl restart wg-quick@wg0
|
||||
```
|
||||
|
||||
### Update system packages
|
||||
|
||||
```bash
|
||||
apt update && apt upgrade -y
|
||||
```
|
||||
|
||||
### Backup configurations
|
||||
|
||||
```bash
|
||||
# On both servers
|
||||
tar -czf wireguard-backup-$(date +%Y%m%d).tar.gz /etc/wireguard/
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Security Best Practices
|
||||
|
||||
1. **Change SSH port** from default 22
|
||||
2. **Use SSH keys** instead of passwords
|
||||
3. **Enable automatic security updates:**
|
||||
```bash
|
||||
apt install unattended-upgrades
|
||||
dpkg-reconfigure -plow unattended-upgrades
|
||||
```
|
||||
4. **Monitor logs** regularly
|
||||
5. **Keep WireGuard keys secure** - never share them
|
||||
6. **Rotate client keys** periodically
|
||||
7. **Remove unused clients** promptly
|
||||
|
||||
---
|
||||
|
||||
## Performance Optimization
|
||||
|
||||
### If experiencing slow speeds:
|
||||
|
||||
1. **Check MTU settings:**
|
||||
```bash
|
||||
# Add to WireGuard config
|
||||
MTU = 1420
|
||||
```
|
||||
|
||||
2. **Enable BBR congestion control:**
|
||||
```bash
|
||||
echo "net.core.default_qdisc=fq" >> /etc/sysctl.d/99-vpn.conf
|
||||
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.d/99-vpn.conf
|
||||
sysctl -p /etc/sysctl.d/99-vpn.conf
|
||||
```
|
||||
|
||||
3. **Increase UDP buffer sizes:**
|
||||
```bash
|
||||
echo "net.core.rmem_max=2500000" >> /etc/sysctl.d/99-vpn.conf
|
||||
echo "net.core.wmem_max=2500000" >> /etc/sysctl.d/99-vpn.conf
|
||||
sysctl -p /etc/sysctl.d/99-vpn.conf
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Next Steps
|
||||
|
||||
- [ ] Deploy to production servers
|
||||
- [ ] Add first client
|
||||
- [ ] Test routing for .ru domains
|
||||
- [ ] Test routing for international domains
|
||||
- [ ] Set up monitoring (optional)
|
||||
- [ ] Document server access credentials securely
|
||||
- [ ] Schedule regular backups
|
||||
|
||||
---
|
||||
|
||||
## Quick Reference
|
||||
|
||||
### Key Files
|
||||
|
||||
**DE VDS:**
|
||||
- `/etc/wireguard/wg0.conf` - WireGuard config
|
||||
- `/etc/nftables.conf` - Firewall rules
|
||||
- `/etc/wireguard/keys/` - WireGuard keys
|
||||
|
||||
**RU VDS:**
|
||||
- `/etc/wireguard/wg0.conf` - User VPN config
|
||||
- `/etc/wireguard/wg1.conf` - DE tunnel config
|
||||
- `/etc/wireguard/postup.sh` - Routing setup
|
||||
- `/etc/wireguard/postdown.sh` - Routing cleanup
|
||||
- `/etc/dnsmasq.d/vpn-routing.conf` - DNS config
|
||||
- `/etc/nftables.conf` - Firewall rules
|
||||
- `/etc/wireguard/clients/` - Client configs
|
||||
|
||||
### Common Commands
|
||||
|
||||
```bash
|
||||
# Check WireGuard status
|
||||
wg show
|
||||
|
||||
# List clients
|
||||
/root/list-clients.sh
|
||||
|
||||
# Add client
|
||||
/root/add-client.sh <name>
|
||||
|
||||
# View logs
|
||||
journalctl -u wg-quick@wg0 -f
|
||||
|
||||
# Test tunnel
|
||||
ping 10.20.0.2
|
||||
|
||||
# Check routing
|
||||
ip route show table proxy
|
||||
ipset list direct
|
||||
```
|
||||
684
IMPLEMENTATION.md
Normal file
684
IMPLEMENTATION.md
Normal file
@@ -0,0 +1,684 @@
|
||||
# Implementation Plan
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- SSH access to both VDS servers (RU: 176.124.216.197, DE: 194.31.173.178)
|
||||
- Root or sudo privileges on both servers
|
||||
- Basic firewall rules allowing SSH access
|
||||
|
||||
---
|
||||
|
||||
## Phase 1: DE VDS Setup (Exit Node)
|
||||
|
||||
The simpler node - just accepts traffic from RU VDS and NATs it to the internet.
|
||||
|
||||
### Step 1.1: Install packages
|
||||
|
||||
```bash
|
||||
apt update && apt install -y wireguard nftables
|
||||
```
|
||||
|
||||
### Step 1.2: Enable IP forwarding
|
||||
|
||||
```bash
|
||||
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.d/99-vpn.conf
|
||||
sysctl -p /etc/sysctl.d/99-vpn.conf
|
||||
```
|
||||
|
||||
### Step 1.3: Generate WireGuard keys
|
||||
|
||||
```bash
|
||||
mkdir -p /etc/wireguard/keys
|
||||
chmod 700 /etc/wireguard/keys
|
||||
wg genkey | tee /etc/wireguard/keys/server.key | wg pubkey > /etc/wireguard/keys/server.pub
|
||||
chmod 600 /etc/wireguard/keys/*
|
||||
```
|
||||
|
||||
### Step 1.4: Create WireGuard config
|
||||
|
||||
Create `/etc/wireguard/wg0.conf`:
|
||||
|
||||
```ini
|
||||
[Interface]
|
||||
Address = 10.20.0.2/30
|
||||
ListenPort = 51821
|
||||
PrivateKey = <DE_SERVER_PRIVATE_KEY>
|
||||
PostUp = nft -f /etc/nftables.conf
|
||||
PostDown = nft flush ruleset
|
||||
|
||||
[Peer]
|
||||
# RU VDS
|
||||
PublicKey = <RU_SERVER_PUBLIC_KEY>
|
||||
AllowedIPs = 10.20.0.1/32, 10.10.0.0/24
|
||||
```
|
||||
|
||||
### Step 1.5: Configure nftables
|
||||
|
||||
Create `/etc/nftables.conf`:
|
||||
|
||||
```nft
|
||||
#!/usr/sbin/nft -f
|
||||
|
||||
flush ruleset
|
||||
|
||||
table inet filter {
|
||||
chain input {
|
||||
type filter hook input priority 0; policy drop;
|
||||
|
||||
# Allow established connections
|
||||
ct state established,related accept
|
||||
|
||||
# Allow loopback
|
||||
iif lo accept
|
||||
|
||||
# Allow SSH (adjust port if needed)
|
||||
tcp dport 22 accept
|
||||
|
||||
# Allow WireGuard from RU VDS only
|
||||
ip saddr 176.124.216.197 udp dport 51821 accept
|
||||
|
||||
# Allow ICMP
|
||||
icmp type echo-request accept
|
||||
}
|
||||
|
||||
chain forward {
|
||||
type filter hook forward priority 0; policy drop;
|
||||
|
||||
# Allow forwarding from VPN
|
||||
iifname "wg0" accept
|
||||
|
||||
# Allow established connections back
|
||||
ct state established,related accept
|
||||
}
|
||||
|
||||
chain output {
|
||||
type filter hook output priority 0; policy accept;
|
||||
}
|
||||
}
|
||||
|
||||
table inet nat {
|
||||
chain postrouting {
|
||||
type nat hook postrouting priority 100;
|
||||
|
||||
# NAT traffic from VPN to internet
|
||||
oifname != "wg0" ip saddr { 10.10.0.0/24, 10.20.0.0/30 } masquerade
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Step 1.6: Enable and start services
|
||||
|
||||
```bash
|
||||
systemctl enable --now nftables
|
||||
systemctl enable --now wg-quick@wg0
|
||||
```
|
||||
|
||||
### Step 1.7: Verify
|
||||
|
||||
```bash
|
||||
wg show
|
||||
ip addr show wg0
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Phase 2: RU VDS Setup (Gateway)
|
||||
|
||||
The main node - handles user connections, DNS-based routing decisions.
|
||||
|
||||
### Step 2.1: Install packages
|
||||
|
||||
```bash
|
||||
apt update && apt install -y wireguard dnsmasq nftables ipset
|
||||
```
|
||||
|
||||
### Step 2.2: Enable IP forwarding
|
||||
|
||||
```bash
|
||||
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.d/99-vpn.conf
|
||||
sysctl -p /etc/sysctl.d/99-vpn.conf
|
||||
```
|
||||
|
||||
### Step 2.3: Generate WireGuard keys
|
||||
|
||||
```bash
|
||||
mkdir -p /etc/wireguard/keys
|
||||
chmod 700 /etc/wireguard/keys
|
||||
|
||||
# Server key for user-facing interface
|
||||
wg genkey | tee /etc/wireguard/keys/server.key | wg pubkey > /etc/wireguard/keys/server.pub
|
||||
|
||||
# Key for DE tunnel
|
||||
wg genkey | tee /etc/wireguard/keys/de-tunnel.key | wg pubkey > /etc/wireguard/keys/de-tunnel.pub
|
||||
|
||||
chmod 600 /etc/wireguard/keys/*
|
||||
```
|
||||
|
||||
### Step 2.4: Create routing tables
|
||||
|
||||
Add to `/etc/iproute2/rt_tables`:
|
||||
|
||||
```
|
||||
200 proxy
|
||||
```
|
||||
|
||||
### Step 2.5: Create WireGuard configs
|
||||
|
||||
Create `/etc/wireguard/wg0.conf` (user-facing):
|
||||
|
||||
```ini
|
||||
[Interface]
|
||||
Address = 10.10.0.1/24
|
||||
ListenPort = 51820
|
||||
PrivateKey = <RU_SERVER_PRIVATE_KEY>
|
||||
PostUp = /etc/wireguard/postup.sh
|
||||
PostDown = /etc/wireguard/postdown.sh
|
||||
|
||||
# Users will be added here as [Peer] sections
|
||||
```
|
||||
|
||||
Create `/etc/wireguard/wg1.conf` (DE tunnel):
|
||||
|
||||
```ini
|
||||
[Interface]
|
||||
Address = 10.20.0.1/30
|
||||
PrivateKey = <RU_DE_TUNNEL_PRIVATE_KEY>
|
||||
|
||||
[Peer]
|
||||
# DE VDS
|
||||
PublicKey = <DE_SERVER_PUBLIC_KEY>
|
||||
Endpoint = 194.31.173.178:51821
|
||||
AllowedIPs = 0.0.0.0/0
|
||||
PersistentKeepalive = 25
|
||||
```
|
||||
|
||||
### Step 2.6: Create PostUp script
|
||||
|
||||
Create `/etc/wireguard/postup.sh`:
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
|
||||
# Create ipsets for routing decisions
|
||||
ipset create direct hash:net -exist
|
||||
ipset create proxy hash:net -exist
|
||||
|
||||
# Add default route via DE tunnel for 'proxy' table
|
||||
ip route add default via 10.20.0.2 table proxy
|
||||
|
||||
# Load nftables rules
|
||||
nft -f /etc/nftables.conf
|
||||
```
|
||||
|
||||
Make executable:
|
||||
```bash
|
||||
chmod +x /etc/wireguard/postup.sh
|
||||
```
|
||||
|
||||
### Step 2.7: Create PostDown script
|
||||
|
||||
Create `/etc/wireguard/postdown.sh`:
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
|
||||
# Flush routing table
|
||||
ip route flush table proxy
|
||||
|
||||
# Destroy ipsets
|
||||
ipset destroy direct 2>/dev/null
|
||||
ipset destroy proxy 2>/dev/null
|
||||
|
||||
# Flush nftables
|
||||
nft flush ruleset
|
||||
```
|
||||
|
||||
Make executable:
|
||||
```bash
|
||||
chmod +x /etc/wireguard/postdown.sh
|
||||
```
|
||||
|
||||
### Step 2.8: Configure nftables
|
||||
|
||||
Create `/etc/nftables.conf`:
|
||||
|
||||
```nft
|
||||
#!/usr/sbin/nft -f
|
||||
|
||||
flush ruleset
|
||||
|
||||
table inet filter {
|
||||
chain input {
|
||||
type filter hook input priority 0; policy drop;
|
||||
|
||||
# Allow established
|
||||
ct state established,related accept
|
||||
|
||||
# Allow loopback
|
||||
iif lo accept
|
||||
|
||||
# Allow SSH
|
||||
tcp dport 22 accept
|
||||
|
||||
# Allow WireGuard from anywhere (user connections)
|
||||
udp dport 51820 accept
|
||||
|
||||
# Allow DNS from VPN clients only
|
||||
iifname "wg0" udp dport 53 accept
|
||||
iifname "wg0" tcp dport 53 accept
|
||||
|
||||
# Allow ICMP
|
||||
icmp type echo-request accept
|
||||
}
|
||||
|
||||
chain forward {
|
||||
type filter hook forward priority 0; policy drop;
|
||||
|
||||
# Allow forwarding from user VPN
|
||||
iifname "wg0" accept
|
||||
|
||||
# Allow forwarding from DE tunnel
|
||||
iifname "wg1" accept
|
||||
|
||||
# Allow established
|
||||
ct state established,related accept
|
||||
}
|
||||
|
||||
chain output {
|
||||
type filter hook output priority 0; policy accept;
|
||||
}
|
||||
}
|
||||
|
||||
table inet nat {
|
||||
chain postrouting {
|
||||
type nat hook postrouting priority 100;
|
||||
|
||||
# NAT direct traffic (going out main interface)
|
||||
oifname != "wg0" oifname != "wg1" ip saddr 10.10.0.0/24 masquerade
|
||||
}
|
||||
}
|
||||
|
||||
table inet mangle {
|
||||
chain prerouting {
|
||||
type filter hook prerouting priority -150;
|
||||
|
||||
# Mark packets destined for 'proxy' ipset
|
||||
ip daddr @proxy meta mark set 0x1
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Note:** nftables native sets will be used instead of ipset. See Step 2.10 for updated approach.
|
||||
|
||||
### Step 2.9: Configure dnsmasq
|
||||
|
||||
Disable systemd-resolved if running:
|
||||
```bash
|
||||
systemctl disable --now systemd-resolved
|
||||
rm /etc/resolv.conf
|
||||
echo "nameserver 8.8.8.8" > /etc/resolv.conf
|
||||
```
|
||||
|
||||
Create `/etc/dnsmasq.d/vpn-routing.conf`:
|
||||
|
||||
```conf
|
||||
# Listen only on VPN interface
|
||||
interface=wg0
|
||||
bind-interfaces
|
||||
|
||||
# Upstream DNS
|
||||
server=8.8.8.8
|
||||
server=8.8.4.4
|
||||
|
||||
# Don't read /etc/resolv.conf
|
||||
no-resolv
|
||||
|
||||
# Cache size
|
||||
cache-size=10000
|
||||
|
||||
# Log queries (optional, disable in production)
|
||||
# log-queries
|
||||
|
||||
# Russian TLDs - route directly (add to 'direct' ipset)
|
||||
ipset=/ru/direct
|
||||
ipset=/рф/direct
|
||||
ipset=/su/direct
|
||||
|
||||
# Everything else goes to proxy (default)
|
||||
# This is handled by routing table, not ipset
|
||||
```
|
||||
|
||||
**Important:** dnsmasq's ipset feature requires ipset, not nftables sets. We'll use a hybrid approach.
|
||||
|
||||
### Step 2.10: Updated routing approach (hybrid ipset + nftables)
|
||||
|
||||
Since dnsmasq works with ipset, we'll use ipset for the sets and nftables for the rules.
|
||||
|
||||
Update `/etc/nftables.conf`:
|
||||
|
||||
```nft
|
||||
#!/usr/sbin/nft -f
|
||||
|
||||
flush ruleset
|
||||
|
||||
table inet filter {
|
||||
chain input {
|
||||
type filter hook input priority 0; policy drop;
|
||||
|
||||
ct state established,related accept
|
||||
iif lo accept
|
||||
tcp dport 22 accept
|
||||
udp dport 51820 accept
|
||||
iifname "wg0" udp dport 53 accept
|
||||
iifname "wg0" tcp dport 53 accept
|
||||
icmp type echo-request accept
|
||||
}
|
||||
|
||||
chain forward {
|
||||
type filter hook forward priority 0; policy drop;
|
||||
|
||||
iifname "wg0" accept
|
||||
iifname "wg1" accept
|
||||
ct state established,related accept
|
||||
}
|
||||
|
||||
chain output {
|
||||
type filter hook output priority 0; policy accept;
|
||||
}
|
||||
}
|
||||
|
||||
table inet nat {
|
||||
chain postrouting {
|
||||
type nat hook postrouting priority 100;
|
||||
|
||||
# NAT direct traffic going out main interface
|
||||
oifname != "wg0" oifname != "wg1" ip saddr 10.10.0.0/24 masquerade
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Update `/etc/wireguard/postup.sh`:
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
|
||||
# Create ipsets
|
||||
ipset create direct hash:net -exist
|
||||
ipset flush direct
|
||||
|
||||
# Add default route via DE tunnel for 'proxy' table
|
||||
ip route add default via 10.20.0.2 table proxy 2>/dev/null || true
|
||||
|
||||
# Policy routing: packets NOT going to 'direct' ipset use 'proxy' table
|
||||
ip rule add from 10.10.0.0/24 fwmark 0x1 table proxy priority 100 2>/dev/null || true
|
||||
|
||||
# Load nftables
|
||||
nft -f /etc/nftables.conf
|
||||
|
||||
# Add iptables rule for fwmark (nftables mangle is complex with ipset)
|
||||
iptables -t mangle -A PREROUTING -m set ! --match-set direct dst -s 10.10.0.0/24 -j MARK --set-mark 0x1
|
||||
```
|
||||
|
||||
Update `/etc/wireguard/postdown.sh`:
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
|
||||
ip rule del from 10.10.0.0/24 fwmark 0x1 table proxy priority 100 2>/dev/null || true
|
||||
ip route flush table proxy 2>/dev/null || true
|
||||
iptables -t mangle -F PREROUTING 2>/dev/null || true
|
||||
ipset destroy direct 2>/dev/null || true
|
||||
nft flush ruleset
|
||||
```
|
||||
|
||||
### Step 2.11: Enable and start services
|
||||
|
||||
```bash
|
||||
systemctl enable --now dnsmasq
|
||||
systemctl enable --now wg-quick@wg0
|
||||
systemctl enable --now wg-quick@wg1
|
||||
```
|
||||
|
||||
### Step 2.12: Verify
|
||||
|
||||
```bash
|
||||
wg show
|
||||
ip route show table proxy
|
||||
ipset list direct
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Phase 3: Key Exchange
|
||||
|
||||
After generating keys on both servers, exchange public keys:
|
||||
|
||||
### On DE VDS:
|
||||
```bash
|
||||
cat /etc/wireguard/keys/server.pub
|
||||
# Copy this value
|
||||
```
|
||||
|
||||
### On RU VDS:
|
||||
```bash
|
||||
cat /etc/wireguard/keys/server.pub
|
||||
cat /etc/wireguard/keys/de-tunnel.pub
|
||||
# Copy these values
|
||||
```
|
||||
|
||||
### Update configs:
|
||||
|
||||
1. **DE VDS** `/etc/wireguard/wg0.conf`: Replace `<RU_SERVER_PUBLIC_KEY>` with RU's `de-tunnel.pub`
|
||||
2. **RU VDS** `/etc/wireguard/wg1.conf`: Replace `<DE_SERVER_PUBLIC_KEY>` with DE's `server.pub`
|
||||
|
||||
### Restart WireGuard:
|
||||
|
||||
```bash
|
||||
# On DE VDS
|
||||
systemctl restart wg-quick@wg0
|
||||
|
||||
# On RU VDS
|
||||
systemctl restart wg-quick@wg1
|
||||
```
|
||||
|
||||
### Verify tunnel:
|
||||
|
||||
```bash
|
||||
# On RU VDS
|
||||
ping 10.20.0.2
|
||||
wg show wg1
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Phase 4: Add First Client
|
||||
|
||||
### Step 4.1: Generate client keys (on RU VDS)
|
||||
|
||||
```bash
|
||||
CLIENT_NAME="phone"
|
||||
wg genkey | tee /etc/wireguard/keys/client_${CLIENT_NAME}.key | wg pubkey > /etc/wireguard/keys/client_${CLIENT_NAME}.pub
|
||||
chmod 600 /etc/wireguard/keys/client_${CLIENT_NAME}.*
|
||||
```
|
||||
|
||||
### Step 4.2: Add peer to server
|
||||
|
||||
```bash
|
||||
CLIENT_IP="10.10.0.2"
|
||||
CLIENT_PUBKEY=$(cat /etc/wireguard/keys/client_${CLIENT_NAME}.pub)
|
||||
|
||||
wg set wg0 peer ${CLIENT_PUBKEY} allowed-ips ${CLIENT_IP}/32
|
||||
wg-quick save wg0
|
||||
```
|
||||
|
||||
### Step 4.3: Create client config
|
||||
|
||||
```bash
|
||||
CLIENT_NAME="phone"
|
||||
CLIENT_IP="10.10.0.2"
|
||||
SERVER_PUBKEY=$(cat /etc/wireguard/keys/server.pub)
|
||||
CLIENT_PRIVKEY=$(cat /etc/wireguard/keys/client_${CLIENT_NAME}.key)
|
||||
|
||||
cat > /etc/wireguard/clients/${CLIENT_NAME}.conf << EOF
|
||||
[Interface]
|
||||
PrivateKey = ${CLIENT_PRIVKEY}
|
||||
Address = ${CLIENT_IP}/32
|
||||
DNS = 10.10.0.1
|
||||
|
||||
[Peer]
|
||||
PublicKey = ${SERVER_PUBKEY}
|
||||
Endpoint = 176.124.216.197:51820
|
||||
AllowedIPs = 0.0.0.0/0
|
||||
PersistentKeepalive = 25
|
||||
EOF
|
||||
|
||||
mkdir -p /etc/wireguard/clients
|
||||
chmod 600 /etc/wireguard/clients/${CLIENT_NAME}.conf
|
||||
```
|
||||
|
||||
### Step 4.4: Transfer to client
|
||||
|
||||
Display as QR code (for mobile):
|
||||
```bash
|
||||
apt install -y qrencode
|
||||
qrencode -t ansiutf8 < /etc/wireguard/clients/${CLIENT_NAME}.conf
|
||||
```
|
||||
|
||||
Or copy the file contents manually.
|
||||
|
||||
---
|
||||
|
||||
## Phase 5: Testing
|
||||
|
||||
### Test 1: Basic connectivity
|
||||
|
||||
```bash
|
||||
# From client
|
||||
ping 10.10.0.1 # Should work - RU VDS
|
||||
ping 10.20.0.2 # Should work - DE VDS
|
||||
```
|
||||
|
||||
### Test 2: DNS resolution
|
||||
|
||||
```bash
|
||||
# From client
|
||||
nslookup google.com 10.10.0.1
|
||||
nslookup yandex.ru 10.10.0.1
|
||||
```
|
||||
|
||||
### Test 3: Routing verification
|
||||
|
||||
```bash
|
||||
# On RU VDS - check ipset after client visits some .ru sites
|
||||
ipset list direct
|
||||
|
||||
# From client - check external IP
|
||||
curl ifconfig.me # Should show DE VDS IP (194.31.173.178)
|
||||
curl ifconfig.me --resolve ifconfig.me:80:$(dig +short yandex.ru | head -1) # Won't work, but...
|
||||
|
||||
# Better test - check where traffic goes
|
||||
curl https://2ip.ru # Russian service, should go direct, show RU VDS IP
|
||||
curl https://ifconfig.me # Should show DE VDS IP
|
||||
```
|
||||
|
||||
### Test 4: Check that .ru domains go direct
|
||||
|
||||
```bash
|
||||
# From client
|
||||
traceroute yandex.ru # Should not go through DE
|
||||
traceroute google.com # Should go through DE (you'll see 10.20.0.x hop)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### WireGuard not connecting
|
||||
|
||||
```bash
|
||||
# Check if service is running
|
||||
systemctl status wg-quick@wg0
|
||||
|
||||
# Check for errors
|
||||
journalctl -u wg-quick@wg0 -e
|
||||
|
||||
# Verify port is open
|
||||
ss -ulnp | grep 51820
|
||||
```
|
||||
|
||||
### DNS not working
|
||||
|
||||
```bash
|
||||
# Check dnsmasq
|
||||
systemctl status dnsmasq
|
||||
journalctl -u dnsmasq -e
|
||||
|
||||
# Test locally
|
||||
dig @127.0.0.1 google.com
|
||||
```
|
||||
|
||||
### Routing not working
|
||||
|
||||
```bash
|
||||
# Check ipset
|
||||
ipset list direct
|
||||
|
||||
# Check routing table
|
||||
ip route show table proxy
|
||||
ip rule show
|
||||
|
||||
# Check marks
|
||||
iptables -t mangle -L -v
|
||||
|
||||
# Test marking
|
||||
ping -c 1 8.8.8.8
|
||||
conntrack -L | grep 8.8.8.8
|
||||
```
|
||||
|
||||
### Traffic not NATed
|
||||
|
||||
```bash
|
||||
# Check nftables
|
||||
nft list ruleset
|
||||
|
||||
# Check forwarding
|
||||
cat /proc/sys/net/ipv4/ip_forward
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Summary Checklist
|
||||
|
||||
- [ ] **DE VDS**
|
||||
- [ ] WireGuard installed
|
||||
- [ ] IP forwarding enabled
|
||||
- [ ] Keys generated
|
||||
- [ ] wg0.conf configured
|
||||
- [ ] nftables configured
|
||||
- [ ] Services enabled and started
|
||||
|
||||
- [ ] **RU VDS**
|
||||
- [ ] WireGuard installed
|
||||
- [ ] dnsmasq installed
|
||||
- [ ] ipset installed
|
||||
- [ ] IP forwarding enabled
|
||||
- [ ] Keys generated
|
||||
- [ ] Routing table 'proxy' added
|
||||
- [ ] wg0.conf configured (users)
|
||||
- [ ] wg1.conf configured (DE tunnel)
|
||||
- [ ] postup.sh / postdown.sh created
|
||||
- [ ] nftables configured
|
||||
- [ ] dnsmasq configured
|
||||
- [ ] Services enabled and started
|
||||
|
||||
- [ ] **Key Exchange**
|
||||
- [ ] DE public key → RU wg1.conf
|
||||
- [ ] RU de-tunnel public key → DE wg0.conf
|
||||
- [ ] Tunnel verified (ping 10.20.0.2 from RU)
|
||||
|
||||
- [ ] **First Client**
|
||||
- [ ] Keys generated
|
||||
- [ ] Peer added to wg0
|
||||
- [ ] Client config created
|
||||
- [ ] Connection tested
|
||||
- [ ] Routing verified
|
||||
262
PRE_DEPLOYMENT_CHECKLIST.md
Normal file
262
PRE_DEPLOYMENT_CHECKLIST.md
Normal file
@@ -0,0 +1,262 @@
|
||||
# Pre-Deployment Checklist
|
||||
|
||||
Complete this checklist before deploying to production servers.
|
||||
|
||||
## Infrastructure Verification
|
||||
|
||||
### RU VDS (176.124.216.197)
|
||||
|
||||
- [ ] Can SSH into server: `ssh root@176.124.216.197`
|
||||
- [ ] Have root access: `sudo -i` or logged in as root
|
||||
- [ ] Server is Debian 12 (or compatible): `cat /etc/debian_version`
|
||||
- [ ] Adequate resources:
|
||||
- [ ] At least 1GB RAM: `free -h`
|
||||
- [ ] At least 5GB free disk: `df -h`
|
||||
- [ ] CPU is reasonable: `lscpu`
|
||||
- [ ] Internet connectivity: `ping -c 4 8.8.8.8`
|
||||
- [ ] Can resolve DNS: `nslookup google.com`
|
||||
- [ ] Port 51820/udp not in use: `ss -ulnp | grep 51820` (should be empty)
|
||||
- [ ] Port 53 not in use by another service: `ss -ulnp | grep :53` (or just systemd-resolved)
|
||||
|
||||
### DE VDS (194.31.173.178)
|
||||
|
||||
- [ ] Can SSH into server: `ssh root@194.31.173.178`
|
||||
- [ ] Have root access: `sudo -i` or logged in as root
|
||||
- [ ] Server is Debian 13 (or compatible): `cat /etc/debian_version`
|
||||
- [ ] Adequate resources:
|
||||
- [ ] At least 512MB RAM: `free -h`
|
||||
- [ ] At least 5GB free disk: `df -h`
|
||||
- [ ] CPU is reasonable: `lscpu`
|
||||
- [ ] Internet connectivity: `ping -c 4 8.8.8.8`
|
||||
- [ ] Can resolve DNS: `nslookup google.com`
|
||||
- [ ] Port 51821/udp not in use: `ss -ulnp | grep 51821` (should be empty)
|
||||
|
||||
### Network Connectivity
|
||||
|
||||
- [ ] RU VDS can reach DE VDS: `ping -c 4 194.31.173.178` (from RU VDS)
|
||||
- [ ] DE VDS can reach RU VDS: `ping -c 4 176.124.216.197` (from DE VDS)
|
||||
- [ ] No firewall blocking UDP between servers (if any external firewall exists)
|
||||
|
||||
## Security Preparation
|
||||
|
||||
### SSH Access
|
||||
|
||||
- [ ] Have backup SSH access method (console access, VNC, etc.)
|
||||
- [ ] Know how to access server if SSH breaks
|
||||
- [ ] Current SSH session is stable
|
||||
- [ ] Consider opening second SSH session before making changes
|
||||
|
||||
### Firewall Considerations
|
||||
|
||||
- [ ] Understand current firewall setup (if any): `iptables -L -n` or `nft list ruleset`
|
||||
- [ ] Have documented how to disable firewall if something goes wrong
|
||||
- [ ] Won't lock yourself out when applying new firewall rules
|
||||
|
||||
### Backup Current State
|
||||
|
||||
- [ ] Backup current network config: `cp /etc/network/interfaces /root/interfaces.backup` (if applicable)
|
||||
- [ ] Backup current SSH config: `cp /etc/ssh/sshd_config /root/sshd_config.backup`
|
||||
- [ ] Know how to rollback changes if needed
|
||||
|
||||
## Client Device Preparation
|
||||
|
||||
- [ ] Have at least one device to test VPN client
|
||||
- [ ] WireGuard app installed on test device:
|
||||
- iOS/Android: WireGuard app from App Store/Play Store
|
||||
- Windows: WireGuard from wireguard.com
|
||||
- macOS: WireGuard from App Store or wireguard.com
|
||||
- Linux: `apt install wireguard-tools`
|
||||
- [ ] Device can scan QR codes (for mobile) or can copy/paste config text
|
||||
|
||||
## Tools and Access
|
||||
|
||||
### Local Machine
|
||||
|
||||
- [ ] Have SSH access from local machine to both servers
|
||||
- [ ] Can copy files via SCP: `scp test.txt root@176.124.216.197:/tmp/` works
|
||||
- [ ] Have text editor ready for editing configs
|
||||
- [ ] Have terminal with multiple tabs/windows open
|
||||
|
||||
### Required Information
|
||||
|
||||
- [ ] DE VDS IP: 194.31.173.178 (confirmed)
|
||||
- [ ] RU VDS IP: 176.124.216.197 (confirmed)
|
||||
- [ ] Root password or SSH keys for both servers
|
||||
- [ ] Know which local device will be first test client
|
||||
|
||||
## Time and Planning
|
||||
|
||||
- [ ] Have allocated 1-2 hours for deployment
|
||||
- [ ] Not during critical business hours (in case of issues)
|
||||
- [ ] Have time for troubleshooting if needed
|
||||
- [ ] Not in a rush
|
||||
|
||||
## Documentation Review
|
||||
|
||||
- [ ] Read QUICKSTART.md overview
|
||||
- [ ] Reviewed DEPLOYMENT.md deployment steps
|
||||
- [ ] Know where to find troubleshooting info (DEPLOYMENT.md)
|
||||
- [ ] Have TESTING.md ready for post-deployment tests
|
||||
|
||||
## Script Verification
|
||||
|
||||
### Check scripts are ready
|
||||
|
||||
```bash
|
||||
cd /home/mish/vpn.git
|
||||
ls -la scripts/
|
||||
```
|
||||
|
||||
Should see:
|
||||
- [ ] setup-de-vds.sh (executable)
|
||||
- [ ] setup-ru-vds.sh (executable)
|
||||
- [ ] add-client.sh (executable)
|
||||
- [ ] disable-client.sh (executable)
|
||||
- [ ] enable-client.sh (executable)
|
||||
- [ ] remove-client.sh (executable)
|
||||
- [ ] list-clients.sh (executable)
|
||||
|
||||
## Configuration Files Check
|
||||
|
||||
```bash
|
||||
cd /home/mish/vpn.git
|
||||
ls -la configs/de-vds/
|
||||
ls -la configs/ru-vds/
|
||||
```
|
||||
|
||||
Should see all required config files.
|
||||
|
||||
## Risk Assessment
|
||||
|
||||
### Understand the risks
|
||||
|
||||
- [ ] Understand that changes will be made to network configuration
|
||||
- [ ] Understand that firewall rules will be modified
|
||||
- [ ] Understand that new services will be installed
|
||||
- [ ] Have rollback plan if things go wrong
|
||||
- [ ] Won't lose access to servers (have console/recovery access)
|
||||
|
||||
### Rollback Plan
|
||||
|
||||
If something goes wrong:
|
||||
|
||||
**DE VDS:**
|
||||
```bash
|
||||
# Stop services
|
||||
systemctl stop wg-quick@wg0
|
||||
systemctl stop nftables
|
||||
|
||||
# Flush firewall
|
||||
nft flush ruleset
|
||||
iptables -F
|
||||
iptables -X
|
||||
iptables -t nat -F
|
||||
iptables -t nat -X
|
||||
|
||||
# Default accept
|
||||
iptables -P INPUT ACCEPT
|
||||
iptables -P FORWARD ACCEPT
|
||||
iptables -P OUTPUT ACCEPT
|
||||
```
|
||||
|
||||
**RU VDS:**
|
||||
```bash
|
||||
# Stop services
|
||||
systemctl stop wg-quick@wg0
|
||||
systemctl stop wg-quick@wg1
|
||||
systemctl stop dnsmasq
|
||||
|
||||
# Start systemd-resolved if it was stopped
|
||||
systemctl start systemd-resolved
|
||||
|
||||
# Flush firewall (same as above)
|
||||
nft flush ruleset
|
||||
iptables -F
|
||||
iptables -X
|
||||
iptables -t nat -F
|
||||
iptables -t nat -X
|
||||
iptables -P INPUT ACCEPT
|
||||
iptables -P FORWARD ACCEPT
|
||||
iptables -P OUTPUT ACCEPT
|
||||
```
|
||||
|
||||
## Post-Deployment Preparation
|
||||
|
||||
- [ ] Have notepad ready to save:
|
||||
- DE VDS public key
|
||||
- RU VDS server public key
|
||||
- RU VDS DE tunnel public key
|
||||
- [ ] Ready to run tests from TESTING.md
|
||||
- [ ] Have client device ready for connection test
|
||||
|
||||
## Final Verification
|
||||
|
||||
- [ ] All above items checked
|
||||
- [ ] Confident to proceed
|
||||
- [ ] Have time allocated
|
||||
- [ ] No critical dependencies on servers right now
|
||||
- [ ] Ready to start deployment
|
||||
|
||||
---
|
||||
|
||||
## Ready to Deploy?
|
||||
|
||||
If all items are checked, proceed to:
|
||||
|
||||
1. **QUICKSTART.md** - For rapid deployment
|
||||
2. **DEPLOYMENT.md** - For detailed deployment guide
|
||||
|
||||
## Need More Info?
|
||||
|
||||
- Architecture details → README.md
|
||||
- Implementation steps → IMPLEMENTATION.md
|
||||
- Testing procedures → TESTING.md
|
||||
|
||||
---
|
||||
|
||||
## Deployment Day Checklist
|
||||
|
||||
### Morning of deployment
|
||||
|
||||
- [ ] Verify servers are accessible
|
||||
- [ ] Verify servers are up-to-date: `apt update && apt list --upgradable`
|
||||
- [ ] Create snapshot/backup if available from hosting provider
|
||||
- [ ] Notify anyone who might be affected
|
||||
|
||||
### During deployment
|
||||
|
||||
- [ ] Follow DEPLOYMENT.md step by step
|
||||
- [ ] Don't skip verification steps
|
||||
- [ ] Test after each major phase
|
||||
- [ ] Document any issues or deviations
|
||||
|
||||
### After deployment
|
||||
|
||||
- [ ] Complete all tests from TESTING.md
|
||||
- [ ] Verify client can connect
|
||||
- [ ] Verify routing is correct
|
||||
- [ ] Document any configuration changes made
|
||||
- [ ] Save all keys securely
|
||||
|
||||
---
|
||||
|
||||
## Emergency Contacts
|
||||
|
||||
Document here:
|
||||
|
||||
- VDS provider support: _______________________
|
||||
- Backup admin contact: _______________________
|
||||
- Your remote access method: _______________________
|
||||
|
||||
---
|
||||
|
||||
**Date completed:** _______________
|
||||
|
||||
**Completed by:** _______________
|
||||
|
||||
**Ready to proceed:** ☐ Yes ☐ No
|
||||
|
||||
**If No, blockers:**
|
||||
_________________________________
|
||||
_________________________________
|
||||
_________________________________
|
||||
279
PROJECT_SUMMARY.md
Normal file
279
PROJECT_SUMMARY.md
Normal file
@@ -0,0 +1,279 @@
|
||||
# Project Summary
|
||||
|
||||
## Overview
|
||||
|
||||
This project implements a split-tunnel VPN network for bypassing internet restrictions in Russia while maintaining optimal performance for domestic traffic.
|
||||
|
||||
## Architecture
|
||||
|
||||
**3-node setup:**
|
||||
- Client devices (users in Russia)
|
||||
- RU VDS (176.124.216.197) - Gateway with selective routing
|
||||
- DE VDS (194.31.173.178) - Exit node in Germany
|
||||
|
||||
**Key feature:** DNS-based domain routing
|
||||
- `.ru`, `.рф`, `.su` domains → Direct routing (fast, no proxy)
|
||||
- All other domains → Routed through Germany (bypass blocks)
|
||||
|
||||
## Technology Stack
|
||||
|
||||
| Component | Purpose |
|
||||
|-----------|---------|
|
||||
| WireGuard | VPN tunnels (lightweight, fast) |
|
||||
| dnsmasq | DNS server with ipset integration |
|
||||
| nftables | Firewall and NAT |
|
||||
| ipset | IP address sets for routing decisions |
|
||||
| iproute2 | Policy-based routing |
|
||||
|
||||
## What's Included
|
||||
|
||||
### Documentation (5 files)
|
||||
|
||||
1. **README.md** - Architecture overview and reference
|
||||
2. **QUICKSTART.md** - 30-minute setup guide
|
||||
3. **IMPLEMENTATION.md** - Detailed step-by-step implementation
|
||||
4. **DEPLOYMENT.md** - Production deployment guide
|
||||
5. **TESTING.md** - Comprehensive testing checklist
|
||||
|
||||
### Configuration Files (11 files)
|
||||
|
||||
**DE VDS configs:**
|
||||
- `wg0.conf` - WireGuard interface config
|
||||
- `nftables.conf` - Firewall rules (NAT)
|
||||
- `99-vpn.conf` - Kernel parameters (IP forwarding)
|
||||
|
||||
**RU VDS configs:**
|
||||
- `wg0.conf` - User-facing VPN interface
|
||||
- `wg1.conf` - DE tunnel interface
|
||||
- `postup.sh` - Routing setup script
|
||||
- `postdown.sh` - Routing cleanup script
|
||||
- `nftables.conf` - Firewall rules
|
||||
- `vpn-routing.conf` - dnsmasq domain routing
|
||||
- `rt_tables` - Custom routing table definitions
|
||||
- `99-vpn.conf` - Kernel parameters
|
||||
|
||||
**Client template:**
|
||||
- `example-client.conf` - Template for client configs
|
||||
|
||||
### Management Scripts (7 files)
|
||||
|
||||
**Setup:**
|
||||
- `setup-de-vds.sh` - Automated DE VDS setup
|
||||
- `setup-ru-vds.sh` - Automated RU VDS setup
|
||||
|
||||
**Client management:**
|
||||
- `add-client.sh` - Add new VPN client (with QR code)
|
||||
- `remove-client.sh` - Permanently remove client
|
||||
- `disable-client.sh` - Temporarily disable client
|
||||
- `enable-client.sh` - Re-enable disabled client
|
||||
- `list-clients.sh` - List all clients with status
|
||||
|
||||
## Key Features
|
||||
|
||||
### Automated Setup
|
||||
- One-command server deployment
|
||||
- Automatic key generation
|
||||
- Automatic package installation
|
||||
- Automatic service configuration
|
||||
|
||||
### Easy Client Management
|
||||
- Simple CLI commands
|
||||
- Automatic IP assignment
|
||||
- QR code generation for mobile
|
||||
- Enable/disable without key regeneration
|
||||
|
||||
### Smart Routing
|
||||
- Automatic domain-based routing
|
||||
- No manual IP list maintenance
|
||||
- DNS-driven routing decisions
|
||||
- Optimal performance for local traffic
|
||||
|
||||
### Security
|
||||
- WireGuard modern cryptography
|
||||
- Restricted firewall rules
|
||||
- Key-based authentication
|
||||
- Isolated VPN network
|
||||
|
||||
### Scalability
|
||||
- Support for 253 concurrent clients
|
||||
- Low resource usage
|
||||
- Efficient packet routing
|
||||
- No bottlenecks
|
||||
|
||||
## Network Topology
|
||||
|
||||
```
|
||||
Internet
|
||||
▲
|
||||
│
|
||||
┌───────────────┼───────────────┐
|
||||
│ │ │
|
||||
│ Direct (fast) │
|
||||
│ .ru/.рф domains │
|
||||
│ │
|
||||
┌──────────┐ │ ┌──────────────┐ │ ┌──────────┐
|
||||
│ Client │◄───┼───►│ RU VDS │◄─────────┼───►│ DE VDS │
|
||||
│ Device │ │ │ Gateway │ │ │Exit Node │
|
||||
└──────────┘ │ └──────────────┘ │ └──────────┘
|
||||
│ │ │
|
||||
│ │ │
|
||||
│ ▼ │
|
||||
│ Routing Decision │
|
||||
│ (dnsmasq + ipset) │
|
||||
│ │
|
||||
│ WireGuard tunnel │
|
||||
│ (all other domains) │
|
||||
└───────────────────────────────┘
|
||||
```
|
||||
|
||||
## IP Addressing
|
||||
|
||||
- **User VPN:** 10.10.0.0/24 (clients ↔ RU VDS)
|
||||
- 10.10.0.1 - RU VDS gateway
|
||||
- 10.10.0.2-254 - Client IPs
|
||||
|
||||
- **Server VPN:** 10.20.0.0/30 (RU ↔ DE tunnel)
|
||||
- 10.20.0.1 - RU VDS
|
||||
- 10.20.0.2 - DE VDS
|
||||
|
||||
## Deployment Workflow
|
||||
|
||||
1. **Prepare** (5 min)
|
||||
- Verify server access
|
||||
- Copy setup scripts
|
||||
|
||||
2. **Deploy DE VDS** (5 min)
|
||||
- Run setup script
|
||||
- Save public key
|
||||
|
||||
3. **Deploy RU VDS** (5 min)
|
||||
- Run setup script
|
||||
- Save public keys
|
||||
|
||||
4. **Exchange Keys** (3 min)
|
||||
- Update DE config with RU key
|
||||
- Update RU config with DE key
|
||||
|
||||
5. **Start Services** (2 min)
|
||||
- Start DE services
|
||||
- Start RU services
|
||||
|
||||
6. **Verify** (5 min)
|
||||
- Test tunnel connectivity
|
||||
- Check routing tables
|
||||
|
||||
7. **Add Clients** (5 min each)
|
||||
- Run add-client script
|
||||
- Transfer config to device
|
||||
|
||||
**Total time: ~30-40 minutes**
|
||||
|
||||
## Testing Coverage
|
||||
|
||||
Comprehensive testing checklist covers:
|
||||
- Pre-deployment verification
|
||||
- Post-setup validation
|
||||
- Tunnel connectivity
|
||||
- DNS resolution
|
||||
- Routing logic
|
||||
- Client management
|
||||
- Performance benchmarks
|
||||
- Security verification
|
||||
- Failure recovery
|
||||
|
||||
## Maintenance
|
||||
|
||||
### Regular Tasks
|
||||
- Monitor logs for errors
|
||||
- Check client list for inactive users
|
||||
- Review bandwidth usage
|
||||
- Update system packages
|
||||
|
||||
### Backup Strategy
|
||||
- Backup `/etc/wireguard/` directory
|
||||
- Store keys securely offline
|
||||
- Document client assignments
|
||||
|
||||
### Monitoring
|
||||
- WireGuard handshake status
|
||||
- DNS query logs (optional)
|
||||
- System resource usage
|
||||
- Network traffic patterns
|
||||
|
||||
## Troubleshooting Quick Reference
|
||||
|
||||
| Issue | Check | Fix |
|
||||
|-------|-------|-----|
|
||||
| Tunnel down | `wg show` | Restart wg-quick services |
|
||||
| DNS not working | `systemctl status dnsmasq` | Restart dnsmasq |
|
||||
| Routing wrong | `ipset list direct` | Check dnsmasq config |
|
||||
| Client can't connect | `wg show wg0 peers` | Verify peer added |
|
||||
| Slow performance | `ping` tests | Check MTU settings |
|
||||
|
||||
## Security Considerations
|
||||
|
||||
- Keys stored with 600 permissions
|
||||
- Firewall restricts access by IP
|
||||
- DNS only accessible from VPN clients
|
||||
- Separate interfaces for users/tunnel
|
||||
- No logging of DNS queries (configurable)
|
||||
|
||||
## Future Enhancements (Optional)
|
||||
|
||||
Potential additions:
|
||||
- Web UI for client management
|
||||
- Prometheus metrics export
|
||||
- Automated key rotation
|
||||
- Fail-over to secondary DE server
|
||||
- IPv6 support
|
||||
- Traffic statistics dashboard
|
||||
|
||||
## Repository Structure
|
||||
|
||||
```
|
||||
vpn.git/
|
||||
├── README.md # Architecture and reference
|
||||
├── QUICKSTART.md # Fast setup guide
|
||||
├── IMPLEMENTATION.md # Detailed implementation
|
||||
├── DEPLOYMENT.md # Production deployment
|
||||
├── TESTING.md # Testing checklist
|
||||
├── PROJECT_SUMMARY.md # This file
|
||||
├── .gitignore # Git ignore rules
|
||||
├── configs/ # All configuration files
|
||||
│ ├── de-vds/ # DE VDS configs
|
||||
│ ├── ru-vds/ # RU VDS configs
|
||||
│ └── client-templates/ # Client config templates
|
||||
└── scripts/ # Management scripts
|
||||
├── setup-*.sh # Server setup
|
||||
└── *-client.sh # Client management
|
||||
```
|
||||
|
||||
## Success Metrics
|
||||
|
||||
After deployment, you should have:
|
||||
- ✓ Stable VPN tunnel between RU and DE
|
||||
- ✓ Working client connections
|
||||
- ✓ Correct routing for .ru vs other domains
|
||||
- ✓ Simple client management via CLI
|
||||
- ✓ No errors in service logs
|
||||
- ✓ Acceptable performance (latency, bandwidth)
|
||||
|
||||
## Support and Documentation
|
||||
|
||||
All information needed is in this repository:
|
||||
- Architecture → README.md
|
||||
- Quick setup → QUICKSTART.md
|
||||
- Detailed steps → IMPLEMENTATION.md
|
||||
- Deployment → DEPLOYMENT.md
|
||||
- Testing → TESTING.md
|
||||
|
||||
## License
|
||||
|
||||
This is a personal project. Use at your own discretion.
|
||||
|
||||
## Credits
|
||||
|
||||
Built with:
|
||||
- WireGuard - Jason A. Donenfeld
|
||||
- dnsmasq - Simon Kelley
|
||||
- nftables - Netfilter Project
|
||||
207
QUICKSTART.md
Normal file
207
QUICKSTART.md
Normal file
@@ -0,0 +1,207 @@
|
||||
# Quick Start Guide
|
||||
|
||||
Get your VPN network up and running in 30 minutes.
|
||||
|
||||
## What You'll Get
|
||||
|
||||
A VPN network where:
|
||||
- `.ru` and `.рф` domains go directly to the internet (fast, no proxy)
|
||||
- All other domains route through Germany (bypass blocks)
|
||||
- Easy client management via command-line scripts
|
||||
- Support for multiple users (up to 253 devices)
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- 2 VDS servers (already have: RU + DE)
|
||||
- SSH access with root privileges
|
||||
- 30 minutes of time
|
||||
|
||||
## Deployment Steps
|
||||
|
||||
### Step 1: Setup DE VDS (5 min)
|
||||
|
||||
```bash
|
||||
# From your computer
|
||||
scp scripts/setup-de-vds.sh root@194.31.173.178:/root/
|
||||
|
||||
# SSH into DE VDS
|
||||
ssh root@194.31.173.178
|
||||
|
||||
# Run setup
|
||||
chmod +x /root/setup-de-vds.sh
|
||||
/root/setup-de-vds.sh
|
||||
|
||||
# Copy the public key that appears (save it for step 3)
|
||||
```
|
||||
|
||||
### Step 2: Setup RU VDS (5 min)
|
||||
|
||||
```bash
|
||||
# From your computer
|
||||
scp scripts/setup-ru-vds.sh root@176.124.216.197:/root/
|
||||
|
||||
# SSH into RU VDS
|
||||
ssh root@176.124.216.197
|
||||
|
||||
# Run setup
|
||||
chmod +x /root/setup-ru-vds.sh
|
||||
/root/setup-ru-vds.sh
|
||||
|
||||
# Copy both public keys that appear (save for step 3)
|
||||
```
|
||||
|
||||
### Step 3: Exchange Keys (3 min)
|
||||
|
||||
**On DE VDS:**
|
||||
```bash
|
||||
nano /etc/wireguard/wg0.conf
|
||||
# Replace __RU_DE_TUNNEL_PUBLIC_KEY__ with RU's "DE tunnel key"
|
||||
# Save and exit (Ctrl+X, Y, Enter)
|
||||
```
|
||||
|
||||
**On RU VDS:**
|
||||
```bash
|
||||
nano /etc/wireguard/wg1.conf
|
||||
# Replace __DE_SERVER_PUBLIC_KEY__ with DE's public key
|
||||
# Save and exit (Ctrl+X, Y, Enter)
|
||||
```
|
||||
|
||||
### Step 4: Start Services (2 min)
|
||||
|
||||
**On DE VDS:**
|
||||
```bash
|
||||
systemctl start nftables
|
||||
systemctl start wg-quick@wg0
|
||||
```
|
||||
|
||||
**On RU VDS:**
|
||||
```bash
|
||||
systemctl start dnsmasq
|
||||
systemctl start wg-quick@wg1
|
||||
systemctl start wg-quick@wg0
|
||||
```
|
||||
|
||||
### Step 5: Verify Tunnel (2 min)
|
||||
|
||||
**On RU VDS:**
|
||||
```bash
|
||||
ping -c 4 10.20.0.2
|
||||
wg show wg1
|
||||
# Should see successful ping and recent handshake
|
||||
```
|
||||
|
||||
### Step 6: Add First Client (5 min)
|
||||
|
||||
**Copy client scripts to RU VDS:**
|
||||
```bash
|
||||
# From your computer
|
||||
scp scripts/*.sh root@176.124.216.197:/root/
|
||||
```
|
||||
|
||||
**On RU VDS:**
|
||||
```bash
|
||||
chmod +x /root/*.sh
|
||||
/root/add-client.sh phone
|
||||
# Scan the QR code with WireGuard app or copy the config
|
||||
```
|
||||
|
||||
### Step 7: Test (5 min)
|
||||
|
||||
**On your client device:**
|
||||
1. Install WireGuard app
|
||||
2. Scan QR code or import config
|
||||
3. Connect to VPN
|
||||
|
||||
**Test it works:**
|
||||
```bash
|
||||
# Should show DE VDS IP (194.31.173.178)
|
||||
curl ifconfig.me
|
||||
|
||||
# Should resolve through VPN DNS
|
||||
nslookup google.com
|
||||
```
|
||||
|
||||
**Test routing:**
|
||||
- Visit google.com → routed through Germany
|
||||
- Visit yandex.ru → routed directly (faster)
|
||||
|
||||
## Done!
|
||||
|
||||
Your VPN is now operational.
|
||||
|
||||
## Common Commands
|
||||
|
||||
```bash
|
||||
# List all clients
|
||||
/root/list-clients.sh
|
||||
|
||||
# Add new client
|
||||
/root/add-client.sh laptop
|
||||
|
||||
# Disable client temporarily
|
||||
/root/disable-client.sh phone
|
||||
|
||||
# Re-enable client
|
||||
/root/enable-client.sh phone
|
||||
|
||||
# Remove client permanently
|
||||
/root/remove-client.sh phone
|
||||
|
||||
# Check VPN status
|
||||
wg show
|
||||
|
||||
# View logs
|
||||
journalctl -u wg-quick@wg0 -f
|
||||
```
|
||||
|
||||
## Need Help?
|
||||
|
||||
- Full implementation details: [IMPLEMENTATION.md](IMPLEMENTATION.md)
|
||||
- Deployment guide: [DEPLOYMENT.md](DEPLOYMENT.md)
|
||||
- Architecture overview: [README.md](README.md)
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
**Tunnel not connecting?**
|
||||
```bash
|
||||
# Check WireGuard status
|
||||
wg show
|
||||
systemctl status wg-quick@wg0
|
||||
|
||||
# Check if ports are open
|
||||
ss -ulnp | grep 51820 # RU VDS
|
||||
ss -ulnp | grep 51821 # DE VDS
|
||||
```
|
||||
|
||||
**DNS not working?**
|
||||
```bash
|
||||
# Check dnsmasq
|
||||
systemctl status dnsmasq
|
||||
journalctl -u dnsmasq -n 50
|
||||
```
|
||||
|
||||
**Routing not working?**
|
||||
```bash
|
||||
# Check ipset after visiting .ru sites
|
||||
ipset list direct
|
||||
|
||||
# Check routing table
|
||||
ip route show table proxy
|
||||
ip rule show
|
||||
```
|
||||
|
||||
## Security Notes
|
||||
|
||||
- Keep WireGuard keys secure (never share them)
|
||||
- Change SSH port from default 22
|
||||
- Use SSH keys instead of passwords
|
||||
- Remove unused clients promptly
|
||||
- Monitor logs regularly
|
||||
|
||||
## Next Steps
|
||||
|
||||
- Add more clients as needed
|
||||
- Set up automatic security updates
|
||||
- Configure backups for `/etc/wireguard/`
|
||||
- Monitor server resources
|
||||
- Consider setting up monitoring/alerting
|
||||
234
README.md
234
README.md
@@ -1,2 +1,234 @@
|
||||
# vpn
|
||||
# VPN Network with Selective Routing
|
||||
|
||||
A WireGuard-based VPN network with selective domain routing. Traffic to `.ru` and `.рф` domains goes directly to the internet, all other traffic is routed through an EU exit node.
|
||||
|
||||
## Architecture Overview
|
||||
|
||||
```
|
||||
┌─────────────┐ WireGuard ┌─────────────┐ WireGuard ┌─────────────┐
|
||||
│ Client │─────────────────────▶│ RU VDS │─────────────────────▶│ DE VDS │
|
||||
│ (Russia) │ 10.10.0.0/24 │ (Gateway) │ 10.20.0.0/24 │ (Exit Node) │
|
||||
└─────────────┘ └─────────────┘ └─────────────┘
|
||||
│ │
|
||||
│ Direct routing │
|
||||
│ for .ru/.рф ▼
|
||||
│ ┌───────────┐
|
||||
└─────────────────────────────▶│ Internet │
|
||||
└───────────┘
|
||||
```
|
||||
|
||||
## Infrastructure
|
||||
|
||||
| Node | Role | IP Address | OS | Specs |
|
||||
|------|------|------------|-----|-------|
|
||||
| RU VDS | Gateway + DNS router | 176.124.216.197 | Debian 12 | 1 CPU, 2GB RAM, 20GB NVMe |
|
||||
| DE VDS | Exit node | 194.31.173.178 | Debian 13 | 1 CPU, 1GB RAM, 15GB NVMe |
|
||||
| Clients | User devices | Dynamic | Any | WireGuard client |
|
||||
|
||||
## Network Design
|
||||
|
||||
### IP Addressing
|
||||
|
||||
| Network | Range | Purpose |
|
||||
|---------|-------|---------|
|
||||
| User VPN | 10.10.0.0/24 | Client ↔ RU VDS tunnel |
|
||||
| Server VPN | 10.20.0.0/30 | RU VDS ↔ DE VDS tunnel |
|
||||
|
||||
### IP Assignments
|
||||
|
||||
**User VPN (10.10.0.0/24):**
|
||||
- 10.10.0.1 - RU VDS (gateway)
|
||||
- 10.10.0.2 - Client #1
|
||||
- 10.10.0.3 - Client #2
|
||||
- ... up to 10.10.0.254
|
||||
|
||||
**Server VPN (10.20.0.0/30):**
|
||||
- 10.20.0.1 - RU VDS
|
||||
- 10.20.0.2 - DE VDS
|
||||
|
||||
### Ports
|
||||
|
||||
| Service | Port | Protocol |
|
||||
|---------|------|----------|
|
||||
| WireGuard (RU VDS, users) | 51820/udp | WireGuard |
|
||||
| WireGuard (DE VDS, server) | 51821/udp | WireGuard |
|
||||
| DNS (RU VDS, internal) | 53/udp | DNS |
|
||||
|
||||
## Routing Logic
|
||||
|
||||
1. Client connects to RU VDS via WireGuard
|
||||
2. Client uses RU VDS as DNS server (10.10.0.1)
|
||||
3. dnsmasq on RU VDS resolves DNS queries:
|
||||
- For `.ru` and `.рф` domains → adds resolved IPs to `direct` ipset
|
||||
- For all other domains → adds resolved IPs to `proxy` ipset
|
||||
4. nftables routes packets based on ipset membership:
|
||||
- IPs in `direct` → route via RU VDS default gateway (direct internet)
|
||||
- IPs in `proxy` → route via DE VDS tunnel (10.20.0.2)
|
||||
|
||||
## Components
|
||||
|
||||
### RU VDS (Gateway)
|
||||
|
||||
- **WireGuard**: Two interfaces
|
||||
- `wg0` - User-facing (10.10.0.1/24)
|
||||
- `wg1` - DE VDS tunnel (10.20.0.1/30)
|
||||
- **dnsmasq**: DNS server with ipset integration
|
||||
- **nftables**: Packet marking and routing
|
||||
- **iproute2**: Policy-based routing tables
|
||||
|
||||
### DE VDS (Exit Node)
|
||||
|
||||
- **WireGuard**: One interface
|
||||
- `wg0` - RU VDS tunnel (10.20.0.2/30)
|
||||
- **nftables**: NAT for outgoing traffic
|
||||
|
||||
## Project Structure
|
||||
|
||||
```
|
||||
vpn.git/
|
||||
├── README.md # Project overview
|
||||
├── IMPLEMENTATION.md # Step-by-step implementation guide
|
||||
├── DEPLOYMENT.md # Deployment guide for production
|
||||
├── configs/ # Configuration files
|
||||
│ ├── de-vds/ # DE VDS configs
|
||||
│ │ ├── wg0.conf # WireGuard config
|
||||
│ │ ├── nftables.conf # Firewall rules
|
||||
│ │ └── 99-vpn.conf # Sysctl settings
|
||||
│ ├── ru-vds/ # RU VDS configs
|
||||
│ │ ├── wg0.conf # User VPN config
|
||||
│ │ ├── wg1.conf # DE tunnel config
|
||||
│ │ ├── postup.sh # Routing setup script
|
||||
│ │ ├── postdown.sh # Routing cleanup script
|
||||
│ │ ├── nftables.conf # Firewall rules
|
||||
│ │ ├── 99-vpn.conf # Sysctl settings
|
||||
│ │ ├── rt_tables # Routing tables
|
||||
│ │ └── vpn-routing.conf # dnsmasq config
|
||||
│ └── client-templates/ # Client config templates
|
||||
│ └── example-client.conf
|
||||
└── scripts/ # Management scripts
|
||||
├── setup-de-vds.sh # DE VDS automated setup
|
||||
├── setup-ru-vds.sh # RU VDS automated setup
|
||||
├── add-client.sh # Add new VPN client
|
||||
├── remove-client.sh # Remove VPN client
|
||||
├── disable-client.sh # Disable VPN client
|
||||
├── enable-client.sh # Enable VPN client
|
||||
└── list-clients.sh # List all clients
|
||||
```
|
||||
|
||||
## Quick Start
|
||||
|
||||
1. **Read the implementation plan:** See [IMPLEMENTATION.md](IMPLEMENTATION.md)
|
||||
2. **Deploy to servers:** Follow [DEPLOYMENT.md](DEPLOYMENT.md)
|
||||
3. **Add clients:** Use scripts in `scripts/` directory
|
||||
|
||||
## Server File Structure
|
||||
|
||||
On the servers, files will be organized as:
|
||||
|
||||
```
|
||||
/etc/wireguard/
|
||||
├── wg0.conf # User VPN interface
|
||||
├── wg1.conf # Server-to-server tunnel (RU only)
|
||||
├── postup.sh # Routing setup (RU only)
|
||||
├── postdown.sh # Routing cleanup (RU only)
|
||||
├── keys/ # Private/public keys
|
||||
└── clients/ # Client configs (RU only)
|
||||
|
||||
/etc/dnsmasq.d/
|
||||
└── vpn-routing.conf # Domain-based routing rules (RU only)
|
||||
|
||||
/etc/nftables.conf # Firewall and NAT rules
|
||||
|
||||
/etc/iproute2/
|
||||
└── rt_tables # Custom routing tables (RU only)
|
||||
```
|
||||
|
||||
## User Management
|
||||
|
||||
Use the provided scripts on RU VDS:
|
||||
|
||||
### Add new user
|
||||
|
||||
```bash
|
||||
/root/add-client.sh <client_name>
|
||||
# Example: /root/add-client.sh phone
|
||||
```
|
||||
|
||||
### List all users
|
||||
|
||||
```bash
|
||||
/root/list-clients.sh
|
||||
```
|
||||
|
||||
### Disable user (temporarily)
|
||||
|
||||
```bash
|
||||
/root/disable-client.sh <client_name>
|
||||
```
|
||||
|
||||
### Enable user
|
||||
|
||||
```bash
|
||||
/root/enable-client.sh <client_name>
|
||||
```
|
||||
|
||||
### Remove user (permanently)
|
||||
|
||||
```bash
|
||||
/root/remove-client.sh <client_name>
|
||||
```
|
||||
|
||||
### Manual management
|
||||
|
||||
If you prefer manual commands:
|
||||
|
||||
```bash
|
||||
# Generate keys
|
||||
wg genkey | tee /etc/wireguard/keys/client_NAME.key | wg pubkey > /etc/wireguard/keys/client_NAME.pub
|
||||
|
||||
# Add peer
|
||||
wg set wg0 peer $(cat /etc/wireguard/keys/client_NAME.pub) allowed-ips 10.10.0.X/32
|
||||
|
||||
# Save config
|
||||
wg-quick save wg0
|
||||
```
|
||||
|
||||
## Security Considerations
|
||||
|
||||
- WireGuard keys are stored in `/etc/wireguard/keys/` with 600 permissions
|
||||
- Only UDP port 51820 is exposed on RU VDS
|
||||
- Only UDP port 51821 is exposed on DE VDS (and only to RU VDS IP)
|
||||
- DNS queries are only accepted from VPN clients (10.10.0.0/24)
|
||||
- IP forwarding is enabled only for necessary interfaces
|
||||
|
||||
## Maintenance
|
||||
|
||||
### Check status
|
||||
|
||||
```bash
|
||||
# WireGuard status
|
||||
wg show
|
||||
|
||||
# Active connections
|
||||
wg show wg0 latest-handshakes
|
||||
|
||||
# DNS cache stats
|
||||
kill -USR1 $(pidof dnsmasq) && journalctl -u dnsmasq -n 20
|
||||
|
||||
# Routing tables
|
||||
ip route show table direct
|
||||
ip route show table proxy
|
||||
```
|
||||
|
||||
### View logs
|
||||
|
||||
```bash
|
||||
journalctl -u wg-quick@wg0 -f
|
||||
journalctl -u dnsmasq -f
|
||||
```
|
||||
|
||||
## References
|
||||
|
||||
- [WireGuard Documentation](https://www.wireguard.com/quickstart/)
|
||||
- [dnsmasq ipset feature](https://thekelleys.org.uk/dnsmasq/docs/dnsmasq-man.html)
|
||||
- [nftables wiki](https://wiki.nftables.org/)
|
||||
|
||||
305
TESTING.md
Normal file
305
TESTING.md
Normal file
@@ -0,0 +1,305 @@
|
||||
# Testing Checklist
|
||||
|
||||
Use this checklist to verify your VPN network is working correctly.
|
||||
|
||||
## Pre-Deployment Tests
|
||||
|
||||
### DE VDS
|
||||
|
||||
- [ ] SSH access working
|
||||
- [ ] System updated (`apt update && apt upgrade`)
|
||||
- [ ] Adequate disk space (`df -h`)
|
||||
- [ ] No port conflicts on 51821 (`ss -ulnp | grep 51821`)
|
||||
|
||||
### RU VDS
|
||||
|
||||
- [ ] SSH access working
|
||||
- [ ] System updated (`apt update && apt upgrade`)
|
||||
- [ ] Adequate disk space (`df -h`)
|
||||
- [ ] No port conflicts on 51820 (`ss -ulnp | grep 51820`)
|
||||
- [ ] No DNS conflicts on port 53 (`ss -ulnp | grep :53`)
|
||||
|
||||
## Post-Setup Tests
|
||||
|
||||
### DE VDS
|
||||
|
||||
- [ ] WireGuard installed (`wg version`)
|
||||
- [ ] IP forwarding enabled (`cat /proc/sys/net/ipv4/ip_forward` = 1)
|
||||
- [ ] WireGuard keys generated (`ls /etc/wireguard/keys/`)
|
||||
- [ ] nftables config exists (`ls /etc/nftables.conf`)
|
||||
- [ ] Services enabled (not yet started)
|
||||
|
||||
### RU VDS
|
||||
|
||||
- [ ] WireGuard installed (`wg version`)
|
||||
- [ ] dnsmasq installed (`dnsmasq -v`)
|
||||
- [ ] ipset installed (`ipset -v`)
|
||||
- [ ] IP forwarding enabled (`cat /proc/sys/net/ipv4/ip_forward` = 1)
|
||||
- [ ] WireGuard keys generated (`ls /etc/wireguard/keys/`)
|
||||
- [ ] Routing table added (`grep proxy /etc/iproute2/rt_tables`)
|
||||
- [ ] All configs in place
|
||||
- [ ] Services enabled (not yet started)
|
||||
|
||||
## Post-Configuration Tests (After Key Exchange)
|
||||
|
||||
### DE VDS
|
||||
|
||||
- [ ] wg0.conf contains RU public key (no `__RU_DE_TUNNEL_PUBLIC_KEY__` placeholder)
|
||||
- [ ] nftables service started (`systemctl status nftables`)
|
||||
- [ ] wg-quick@wg0 started (`systemctl status wg-quick@wg0`)
|
||||
- [ ] wg0 interface exists (`ip addr show wg0`)
|
||||
- [ ] wg0 has correct IP (`ip addr show wg0 | grep 10.20.0.2`)
|
||||
|
||||
### RU VDS
|
||||
|
||||
- [ ] wg1.conf contains DE public key (no `__DE_SERVER_PUBLIC_KEY__` placeholder)
|
||||
- [ ] dnsmasq started (`systemctl status dnsmasq`)
|
||||
- [ ] wg-quick@wg1 started (`systemctl status wg-quick@wg1`)
|
||||
- [ ] wg-quick@wg0 started (`systemctl status wg-quick@wg0`)
|
||||
- [ ] wg1 interface exists (`ip addr show wg1`)
|
||||
- [ ] wg0 interface exists (`ip addr show wg0`)
|
||||
- [ ] wg1 has correct IP (`ip addr show wg1 | grep 10.20.0.1`)
|
||||
- [ ] wg0 has correct IP (`ip addr show wg0 | grep 10.10.0.1`)
|
||||
|
||||
## Tunnel Tests
|
||||
|
||||
### From RU VDS
|
||||
|
||||
- [ ] Can ping DE VDS: `ping -c 4 10.20.0.2`
|
||||
- [ ] WireGuard handshake established: `wg show wg1 | grep "latest handshake"`
|
||||
- [ ] Transfer counters incrementing: `wg show wg1 | grep transfer`
|
||||
|
||||
### From DE VDS
|
||||
|
||||
- [ ] WireGuard handshake established: `wg show wg0 | grep "latest handshake"`
|
||||
- [ ] Shows RU VDS as peer: `wg show wg0 peers`
|
||||
- [ ] Transfer counters incrementing: `wg show wg0 | grep transfer`
|
||||
|
||||
## Routing Tests (Before Client Connection)
|
||||
|
||||
### RU VDS
|
||||
|
||||
- [ ] Proxy routing table exists: `ip route show table proxy`
|
||||
- [ ] Default route via DE: `ip route show table proxy | grep "default via 10.20.0.2"`
|
||||
- [ ] Policy routing rule exists: `ip rule show | grep proxy`
|
||||
- [ ] ipset 'direct' exists: `ipset list direct`
|
||||
- [ ] iptables mangle rule exists: `iptables -t mangle -L PREROUTING | grep direct`
|
||||
|
||||
## Client Connection Tests
|
||||
|
||||
### First Client Addition
|
||||
|
||||
- [ ] Client added successfully: `/root/add-client.sh testclient`
|
||||
- [ ] Client keys generated: `ls /etc/wireguard/keys/client_testclient.*`
|
||||
- [ ] Client config created: `ls /etc/wireguard/clients/testclient.conf`
|
||||
- [ ] QR code generated successfully
|
||||
- [ ] Peer added to wg0: `wg show wg0 peers | grep -f /etc/wireguard/keys/client_testclient.pub`
|
||||
|
||||
### Client Connection (From Client Device)
|
||||
|
||||
- [ ] WireGuard app installed
|
||||
- [ ] Config imported successfully
|
||||
- [ ] Connection established
|
||||
- [ ] No connection errors in app
|
||||
|
||||
### Basic Connectivity (From Client)
|
||||
|
||||
- [ ] Can ping VPN gateway: `ping 10.10.0.1`
|
||||
- [ ] Can ping DE VDS: `ping 10.20.0.2`
|
||||
- [ ] DNS resolution works: `nslookup google.com`
|
||||
- [ ] DNS uses correct server: `nslookup google.com 10.10.0.1`
|
||||
|
||||
### Routing Verification (From Client)
|
||||
|
||||
- [ ] External IP shows DE VDS: `curl ifconfig.me` (should be 194.31.173.178)
|
||||
- [ ] Can access international sites: `curl -I https://google.com`
|
||||
- [ ] Can access Russian sites: `curl -I https://yandex.ru`
|
||||
|
||||
### DNS-Based Routing (From Client)
|
||||
|
||||
Visit some Russian sites first, then check on RU VDS:
|
||||
|
||||
- [ ] Visit `https://yandex.ru` from client
|
||||
- [ ] Visit `https://mail.ru` from client
|
||||
- [ ] Check ipset on RU VDS: `ipset list direct`
|
||||
- [ ] ipset contains Russian IPs
|
||||
- [ ] Visit `https://google.com` from client
|
||||
- [ ] Check that google IPs NOT in direct ipset
|
||||
|
||||
### Advanced Routing Tests
|
||||
|
||||
From client, check routing paths:
|
||||
|
||||
- [ ] Traceroute to Russian site shows no DE hop
|
||||
```bash
|
||||
traceroute yandex.ru
|
||||
# Should NOT show 10.20.0.x
|
||||
```
|
||||
|
||||
- [ ] Traceroute to international site shows DE hop
|
||||
```bash
|
||||
traceroute google.com
|
||||
# Should show 10.20.0.x in path
|
||||
```
|
||||
|
||||
## Performance Tests
|
||||
|
||||
### Latency (From Client)
|
||||
|
||||
- [ ] Latency to VPN gateway: `ping -c 10 10.10.0.1`
|
||||
- Expected: < 50ms (depends on your location)
|
||||
- [ ] Latency through tunnel: `ping -c 10 8.8.8.8`
|
||||
- Expected: 50-150ms (via DE)
|
||||
|
||||
### Bandwidth (From Client)
|
||||
|
||||
- [ ] Download speed test: `curl -o /dev/null https://speed.cloudflare.com/__down?bytes=100000000`
|
||||
- [ ] Should get reasonable speeds (depends on VDS specs)
|
||||
|
||||
## Client Management Tests
|
||||
|
||||
### List Clients
|
||||
|
||||
- [ ] List shows active client: `/root/list-clients.sh`
|
||||
- [ ] Shows correct IP assignment
|
||||
- [ ] Shows latest handshake
|
||||
|
||||
### Disable Client
|
||||
|
||||
- [ ] Disable client: `/root/disable-client.sh testclient`
|
||||
- [ ] Client no longer in wg show: `wg show wg0 peers`
|
||||
- [ ] Client cannot connect
|
||||
- [ ] Keys still exist: `ls /etc/wireguard/keys/client_testclient.*`
|
||||
|
||||
### Enable Client
|
||||
|
||||
- [ ] Enable client: `/root/enable-client.sh testclient`
|
||||
- [ ] Client appears in wg show: `wg show wg0 peers`
|
||||
- [ ] Client can connect again
|
||||
|
||||
### Add Multiple Clients
|
||||
|
||||
- [ ] Add 2nd client: `/root/add-client.sh client2`
|
||||
- [ ] Gets different IP (10.10.0.3)
|
||||
- [ ] Both clients can connect simultaneously
|
||||
- [ ] Both clients in list: `/root/list-clients.sh`
|
||||
|
||||
### Remove Client
|
||||
|
||||
- [ ] Remove client: `/root/remove-client.sh testclient`
|
||||
- [ ] Client not in wg show
|
||||
- [ ] Keys deleted: `ls /etc/wireguard/keys/client_testclient.* 2>&1 | grep "No such file"`
|
||||
- [ ] Config deleted: `ls /etc/wireguard/clients/testclient.conf 2>&1 | grep "No such file"`
|
||||
|
||||
## Stress Tests
|
||||
|
||||
### Multiple Concurrent Clients
|
||||
|
||||
- [ ] Add 5 clients
|
||||
- [ ] All connect simultaneously
|
||||
- [ ] All can browse internet
|
||||
- [ ] Check server load: `top` (CPU should be low)
|
||||
- [ ] Check memory: `free -h` (should have free memory)
|
||||
|
||||
### Continuous Traffic
|
||||
|
||||
- [ ] Stream video through VPN for 10 minutes
|
||||
- [ ] No disconnections
|
||||
- [ ] Stable speed
|
||||
- [ ] Check for errors: `journalctl -u wg-quick@wg0 -n 50`
|
||||
|
||||
## Security Tests
|
||||
|
||||
### Firewall Rules (DE VDS)
|
||||
|
||||
- [ ] Port 51821 only accepts from RU IP:
|
||||
```bash
|
||||
# From another host (should fail)
|
||||
nc -u 194.31.173.178 51821
|
||||
```
|
||||
|
||||
- [ ] SSH still accessible (if configured)
|
||||
- [ ] Other ports closed
|
||||
|
||||
### Firewall Rules (RU VDS)
|
||||
|
||||
- [ ] Port 51820 accepts WireGuard connections
|
||||
- [ ] DNS only from VPN clients:
|
||||
```bash
|
||||
# From outside (should fail)
|
||||
dig @176.124.216.197 google.com
|
||||
```
|
||||
|
||||
- [ ] SSH still accessible
|
||||
- [ ] Other ports closed
|
||||
|
||||
### DNS Leak Test (From Client)
|
||||
|
||||
- [ ] Check DNS server used: visit https://dnsleaktest.com/
|
||||
- [ ] Should show RU VDS or your VPN as DNS server
|
||||
- [ ] Should NOT show your ISP's DNS
|
||||
|
||||
## Failure Recovery Tests
|
||||
|
||||
### Restart Services
|
||||
|
||||
- [ ] Restart wg-quick@wg0 on RU VDS
|
||||
- [ ] Clients reconnect automatically
|
||||
- [ ] No connection loss > 30 seconds
|
||||
|
||||
### Reboot Tests
|
||||
|
||||
- [ ] Reboot DE VDS: `reboot`
|
||||
- [ ] Services auto-start after boot
|
||||
- [ ] Tunnel re-establishes
|
||||
|
||||
- [ ] Reboot RU VDS: `reboot`
|
||||
- [ ] Services auto-start after boot
|
||||
- [ ] Clients can reconnect
|
||||
|
||||
## Logs Check
|
||||
|
||||
### No Errors in Logs
|
||||
|
||||
- [ ] DE VDS WireGuard: `journalctl -u wg-quick@wg0 -n 50 --no-pager`
|
||||
- [ ] RU VDS WireGuard wg0: `journalctl -u wg-quick@wg0 -n 50 --no-pager`
|
||||
- [ ] RU VDS WireGuard wg1: `journalctl -u wg-quick@wg1 -n 50 --no-pager`
|
||||
- [ ] RU VDS dnsmasq: `journalctl -u dnsmasq -n 50 --no-pager`
|
||||
|
||||
## Final Verification
|
||||
|
||||
- [ ] All clients can connect
|
||||
- [ ] Russian domains route directly (fast)
|
||||
- [ ] International domains route through DE (working)
|
||||
- [ ] DNS resolution working
|
||||
- [ ] No errors in logs
|
||||
- [ ] Services set to auto-start
|
||||
- [ ] Documentation updated with actual client names
|
||||
- [ ] Backup of /etc/wireguard/ created
|
||||
|
||||
## Troubleshooting References
|
||||
|
||||
If any tests fail, refer to:
|
||||
- [DEPLOYMENT.md](DEPLOYMENT.md) - Troubleshooting section
|
||||
- [IMPLEMENTATION.md](IMPLEMENTATION.md) - Detailed implementation steps
|
||||
|
||||
## Test Results Template
|
||||
|
||||
```
|
||||
Date: ____________________
|
||||
Tester: __________________
|
||||
|
||||
Pre-Deployment: ☐ Pass ☐ Fail
|
||||
Post-Setup: ☐ Pass ☐ Fail
|
||||
Tunnel Tests: ☐ Pass ☐ Fail
|
||||
Routing Tests: ☐ Pass ☐ Fail
|
||||
Client Tests: ☐ Pass ☐ Fail
|
||||
Performance: ☐ Pass ☐ Fail
|
||||
Security: ☐ Pass ☐ Fail
|
||||
Recovery: ☐ Pass ☐ Fail
|
||||
|
||||
Notes:
|
||||
_____________________________________
|
||||
_____________________________________
|
||||
_____________________________________
|
||||
```
|
||||
10
configs/client-templates/example-client.conf
Normal file
10
configs/client-templates/example-client.conf
Normal file
@@ -0,0 +1,10 @@
|
||||
[Interface]
|
||||
PrivateKey = <CLIENT_PRIVATE_KEY>
|
||||
Address = 10.10.0.X/32
|
||||
DNS = 10.10.0.1
|
||||
|
||||
[Peer]
|
||||
PublicKey = <RU_SERVER_PUBLIC_KEY>
|
||||
Endpoint = 176.124.216.197:51820
|
||||
AllowedIPs = 0.0.0.0/0
|
||||
PersistentKeepalive = 25
|
||||
2
configs/de-vds/99-vpn.conf
Normal file
2
configs/de-vds/99-vpn.conf
Normal file
@@ -0,0 +1,2 @@
|
||||
# Enable IP forwarding for VPN
|
||||
net.ipv4.ip_forward = 1
|
||||
47
configs/de-vds/nftables.conf
Normal file
47
configs/de-vds/nftables.conf
Normal file
@@ -0,0 +1,47 @@
|
||||
#!/usr/sbin/nft -f
|
||||
|
||||
flush ruleset
|
||||
|
||||
table inet filter {
|
||||
chain input {
|
||||
type filter hook input priority 0; policy drop;
|
||||
|
||||
# Allow established connections
|
||||
ct state established,related accept
|
||||
|
||||
# Allow loopback
|
||||
iif lo accept
|
||||
|
||||
# Allow SSH (adjust port if needed)
|
||||
tcp dport 22 accept
|
||||
|
||||
# Allow WireGuard from RU VDS only
|
||||
ip saddr 176.124.216.197 udp dport 51821 accept
|
||||
|
||||
# Allow ICMP
|
||||
icmp type echo-request accept
|
||||
}
|
||||
|
||||
chain forward {
|
||||
type filter hook forward priority 0; policy drop;
|
||||
|
||||
# Allow forwarding from VPN
|
||||
iifname "wg0" accept
|
||||
|
||||
# Allow established connections back
|
||||
ct state established,related accept
|
||||
}
|
||||
|
||||
chain output {
|
||||
type filter hook output priority 0; policy accept;
|
||||
}
|
||||
}
|
||||
|
||||
table inet nat {
|
||||
chain postrouting {
|
||||
type nat hook postrouting priority 100;
|
||||
|
||||
# NAT traffic from VPN to internet
|
||||
oifname != "wg0" ip saddr { 10.10.0.0/24, 10.20.0.0/30 } masquerade
|
||||
}
|
||||
}
|
||||
11
configs/de-vds/wg0.conf
Normal file
11
configs/de-vds/wg0.conf
Normal file
@@ -0,0 +1,11 @@
|
||||
[Interface]
|
||||
Address = 10.20.0.2/30
|
||||
ListenPort = 51821
|
||||
PrivateKey = __DE_SERVER_PRIVATE_KEY__
|
||||
PostUp = nft -f /etc/nftables.conf
|
||||
PostDown = nft flush ruleset
|
||||
|
||||
[Peer]
|
||||
# RU VDS (server tunnel)
|
||||
PublicKey = __RU_DE_TUNNEL_PUBLIC_KEY__
|
||||
AllowedIPs = 10.20.0.1/32, 10.10.0.0/24
|
||||
2
configs/ru-vds/99-vpn.conf
Normal file
2
configs/ru-vds/99-vpn.conf
Normal file
@@ -0,0 +1,2 @@
|
||||
# Enable IP forwarding for VPN
|
||||
net.ipv4.ip_forward = 1
|
||||
55
configs/ru-vds/nftables.conf
Normal file
55
configs/ru-vds/nftables.conf
Normal file
@@ -0,0 +1,55 @@
|
||||
#!/usr/sbin/nft -f
|
||||
|
||||
flush ruleset
|
||||
|
||||
table inet filter {
|
||||
chain input {
|
||||
type filter hook input priority 0; policy drop;
|
||||
|
||||
# Allow established connections
|
||||
ct state established,related accept
|
||||
|
||||
# Allow loopback
|
||||
iif lo accept
|
||||
|
||||
# Allow SSH (adjust port if needed)
|
||||
tcp dport 22 accept
|
||||
|
||||
# Allow WireGuard from anywhere (user connections)
|
||||
udp dport 51820 accept
|
||||
|
||||
# Allow DNS from VPN clients only
|
||||
iifname "wg0" udp dport 53 accept
|
||||
iifname "wg0" tcp dport 53 accept
|
||||
|
||||
# Allow ICMP
|
||||
icmp type echo-request accept
|
||||
}
|
||||
|
||||
chain forward {
|
||||
type filter hook forward priority 0; policy drop;
|
||||
|
||||
# Allow forwarding from user VPN
|
||||
iifname "wg0" accept
|
||||
|
||||
# Allow forwarding from DE tunnel
|
||||
iifname "wg1" accept
|
||||
|
||||
# Allow established connections
|
||||
ct state established,related accept
|
||||
}
|
||||
|
||||
chain output {
|
||||
type filter hook output priority 0; policy accept;
|
||||
}
|
||||
}
|
||||
|
||||
table inet nat {
|
||||
chain postrouting {
|
||||
type nat hook postrouting priority 100;
|
||||
|
||||
# NAT direct traffic going out main interface
|
||||
# Traffic going through wg1 doesn't need NAT (DE VDS will NAT it)
|
||||
oifname != "wg0" oifname != "wg1" ip saddr 10.10.0.0/24 masquerade
|
||||
}
|
||||
}
|
||||
18
configs/ru-vds/postdown.sh
Normal file
18
configs/ru-vds/postdown.sh
Normal file
@@ -0,0 +1,18 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Remove policy routing rule
|
||||
ip rule del from 10.10.0.0/24 fwmark 0x1 table proxy priority 100 2>/dev/null || true
|
||||
|
||||
# Flush routing table
|
||||
ip route flush table proxy 2>/dev/null || true
|
||||
|
||||
# Remove iptables mangle rule
|
||||
iptables -t mangle -F PREROUTING 2>/dev/null || true
|
||||
|
||||
# Destroy ipsets
|
||||
ipset destroy direct 2>/dev/null || true
|
||||
|
||||
# Flush nftables (if not managed by other services)
|
||||
# nft flush ruleset
|
||||
|
||||
echo "PostDown script completed"
|
||||
21
configs/ru-vds/postup.sh
Normal file
21
configs/ru-vds/postup.sh
Normal file
@@ -0,0 +1,21 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
# Create ipsets for routing decisions
|
||||
ipset create direct hash:net -exist
|
||||
ipset flush direct
|
||||
|
||||
# Add default route via DE tunnel for 'proxy' table
|
||||
ip route add default via 10.20.0.2 dev wg1 table proxy 2>/dev/null || true
|
||||
|
||||
# Policy routing: packets with fwmark 0x1 use 'proxy' table
|
||||
ip rule add from 10.10.0.0/24 fwmark 0x1 table proxy priority 100 2>/dev/null || true
|
||||
|
||||
# Load nftables rules
|
||||
nft -f /etc/nftables.conf
|
||||
|
||||
# Mark packets NOT going to 'direct' ipset with fwmark 0x1
|
||||
# This is needed because nftables + ipset integration is complex
|
||||
iptables -t mangle -I PREROUTING -m set ! --match-set direct dst -s 10.10.0.0/24 -j MARK --set-mark 0x1
|
||||
|
||||
echo "PostUp script completed successfully"
|
||||
10
configs/ru-vds/rt_tables
Normal file
10
configs/ru-vds/rt_tables
Normal file
@@ -0,0 +1,10 @@
|
||||
# Reserved values
|
||||
#
|
||||
255 local
|
||||
254 main
|
||||
253 default
|
||||
0 unspec
|
||||
#
|
||||
# Local routing tables
|
||||
#
|
||||
200 proxy
|
||||
30
configs/ru-vds/vpn-routing.conf
Normal file
30
configs/ru-vds/vpn-routing.conf
Normal file
@@ -0,0 +1,30 @@
|
||||
# Listen only on VPN interface
|
||||
interface=wg0
|
||||
bind-interfaces
|
||||
|
||||
# Upstream DNS servers
|
||||
server=8.8.8.8
|
||||
server=8.8.4.4
|
||||
server=1.1.1.1
|
||||
|
||||
# Don't read /etc/resolv.conf
|
||||
no-resolv
|
||||
|
||||
# Cache settings
|
||||
cache-size=10000
|
||||
|
||||
# Log queries (optional, comment out in production for performance)
|
||||
# log-queries
|
||||
|
||||
# Russian TLDs - add resolved IPs to 'direct' ipset
|
||||
# These domains will be routed directly, not through DE VDS
|
||||
ipset=/ru/direct
|
||||
ipset=/рф/direct
|
||||
ipset=/su/direct
|
||||
|
||||
# Additional Russian domains (optional, can be extended)
|
||||
# ipset=/yandex.ru/direct
|
||||
# ipset=/mail.ru/direct
|
||||
# ipset=/vk.com/direct
|
||||
|
||||
# All other domains will go through proxy (default routing)
|
||||
9
configs/ru-vds/wg0.conf
Normal file
9
configs/ru-vds/wg0.conf
Normal file
@@ -0,0 +1,9 @@
|
||||
[Interface]
|
||||
Address = 10.10.0.1/24
|
||||
ListenPort = 51820
|
||||
PrivateKey = __RU_SERVER_PRIVATE_KEY__
|
||||
PostUp = /etc/wireguard/postup.sh
|
||||
PostDown = /etc/wireguard/postdown.sh
|
||||
|
||||
# Client peers will be added below
|
||||
# Use scripts/add-client.sh to add new clients
|
||||
10
configs/ru-vds/wg1.conf
Normal file
10
configs/ru-vds/wg1.conf
Normal file
@@ -0,0 +1,10 @@
|
||||
[Interface]
|
||||
Address = 10.20.0.1/30
|
||||
PrivateKey = __RU_DE_TUNNEL_PRIVATE_KEY__
|
||||
|
||||
[Peer]
|
||||
# DE VDS (exit node)
|
||||
PublicKey = __DE_SERVER_PUBLIC_KEY__
|
||||
Endpoint = 194.31.173.178:51821
|
||||
AllowedIPs = 10.10.0.0/24
|
||||
PersistentKeepalive = 25
|
||||
97
scripts/add-client.sh
Executable file
97
scripts/add-client.sh
Executable file
@@ -0,0 +1,97 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
# Script to add a new VPN client
|
||||
# Usage: ./add-client.sh <client_name>
|
||||
|
||||
if [ "$EUID" -ne 0 ]; then
|
||||
echo "ERROR: Please run as root"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z "$1" ]; then
|
||||
echo "Usage: $0 <client_name>"
|
||||
echo "Example: $0 phone"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
CLIENT_NAME="$1"
|
||||
KEYS_DIR="/etc/wireguard/keys"
|
||||
CLIENTS_DIR="/etc/wireguard/clients"
|
||||
WG_INTERFACE="wg0"
|
||||
|
||||
# Check if client already exists
|
||||
if [ -f "${KEYS_DIR}/client_${CLIENT_NAME}.key" ]; then
|
||||
echo "ERROR: Client '${CLIENT_NAME}' already exists"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Adding new VPN client: ${CLIENT_NAME}"
|
||||
echo ""
|
||||
|
||||
# Find next available IP
|
||||
USED_IPS=$(wg show ${WG_INTERFACE} allowed-ips 2>/dev/null | grep -oP '10\.10\.0\.\K[0-9]+' | sort -n)
|
||||
NEXT_IP=2
|
||||
for ip in $USED_IPS; do
|
||||
if [ $ip -ge $NEXT_IP ]; then
|
||||
NEXT_IP=$((ip + 1))
|
||||
fi
|
||||
done
|
||||
|
||||
if [ $NEXT_IP -gt 254 ]; then
|
||||
echo "ERROR: No available IPs in 10.10.0.0/24 range"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
CLIENT_IP="10.10.0.${NEXT_IP}"
|
||||
|
||||
echo "[1/5] Generating client keys..."
|
||||
wg genkey | tee "${KEYS_DIR}/client_${CLIENT_NAME}.key" | wg pubkey > "${KEYS_DIR}/client_${CLIENT_NAME}.pub"
|
||||
chmod 600 "${KEYS_DIR}/client_${CLIENT_NAME}."*
|
||||
|
||||
CLIENT_PRIVATE_KEY=$(cat "${KEYS_DIR}/client_${CLIENT_NAME}.key")
|
||||
CLIENT_PUBLIC_KEY=$(cat "${KEYS_DIR}/client_${CLIENT_NAME}.pub")
|
||||
SERVER_PUBLIC_KEY=$(cat "${KEYS_DIR}/server.pub")
|
||||
|
||||
echo "[2/5] Adding peer to WireGuard interface..."
|
||||
wg set ${WG_INTERFACE} peer ${CLIENT_PUBLIC_KEY} allowed-ips ${CLIENT_IP}/32
|
||||
|
||||
echo "[3/5] Saving WireGuard configuration..."
|
||||
wg-quick save ${WG_INTERFACE}
|
||||
|
||||
echo "[4/5] Creating client configuration file..."
|
||||
mkdir -p ${CLIENTS_DIR}
|
||||
|
||||
cat > "${CLIENTS_DIR}/${CLIENT_NAME}.conf" << EOF
|
||||
[Interface]
|
||||
PrivateKey = ${CLIENT_PRIVATE_KEY}
|
||||
Address = ${CLIENT_IP}/32
|
||||
DNS = 10.10.0.1
|
||||
|
||||
[Peer]
|
||||
PublicKey = ${SERVER_PUBLIC_KEY}
|
||||
Endpoint = 176.124.216.197:51820
|
||||
AllowedIPs = 0.0.0.0/0
|
||||
PersistentKeepalive = 25
|
||||
EOF
|
||||
|
||||
chmod 600 "${CLIENTS_DIR}/${CLIENT_NAME}.conf"
|
||||
|
||||
echo "[5/5] Generating QR code..."
|
||||
echo ""
|
||||
echo "========================================="
|
||||
echo "Client added successfully!"
|
||||
echo "========================================="
|
||||
echo ""
|
||||
echo "Client name: ${CLIENT_NAME}"
|
||||
echo "Client IP: ${CLIENT_IP}"
|
||||
echo ""
|
||||
echo "Configuration file: ${CLIENTS_DIR}/${CLIENT_NAME}.conf"
|
||||
echo ""
|
||||
echo "QR Code (scan with WireGuard mobile app):"
|
||||
echo ""
|
||||
qrencode -t ansiutf8 < "${CLIENTS_DIR}/${CLIENT_NAME}.conf"
|
||||
echo ""
|
||||
echo "Or copy the configuration from:"
|
||||
echo " cat ${CLIENTS_DIR}/${CLIENT_NAME}.conf"
|
||||
echo ""
|
||||
53
scripts/disable-client.sh
Executable file
53
scripts/disable-client.sh
Executable file
@@ -0,0 +1,53 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
# Script to disable a VPN client (keeps keys but removes from WireGuard)
|
||||
# Usage: ./disable-client.sh <client_name>
|
||||
|
||||
if [ "$EUID" -ne 0 ]; then
|
||||
echo "ERROR: Please run as root"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z "$1" ]; then
|
||||
echo "Usage: $0 <client_name>"
|
||||
echo "Example: $0 phone"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
CLIENT_NAME="$1"
|
||||
KEYS_DIR="/etc/wireguard/keys"
|
||||
WG_INTERFACE="wg0"
|
||||
|
||||
# Check if client exists
|
||||
if [ ! -f "${KEYS_DIR}/client_${CLIENT_NAME}.pub" ]; then
|
||||
echo "ERROR: Client '${CLIENT_NAME}' does not exist"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
CLIENT_PUBLIC_KEY=$(cat "${KEYS_DIR}/client_${CLIENT_NAME}.pub")
|
||||
|
||||
# Check if client is currently active
|
||||
if ! wg show ${WG_INTERFACE} | grep -q "${CLIENT_PUBLIC_KEY}"; then
|
||||
echo "Client '${CLIENT_NAME}' is already disabled"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo "Disabling VPN client: ${CLIENT_NAME}"
|
||||
echo ""
|
||||
|
||||
echo "[1/2] Removing peer from WireGuard interface..."
|
||||
wg set ${WG_INTERFACE} peer ${CLIENT_PUBLIC_KEY} remove
|
||||
|
||||
echo "[2/2] Saving WireGuard configuration..."
|
||||
wg-quick save ${WG_INTERFACE}
|
||||
|
||||
echo ""
|
||||
echo "========================================="
|
||||
echo "Client disabled successfully!"
|
||||
echo "========================================="
|
||||
echo ""
|
||||
echo "Client '${CLIENT_NAME}' is now disabled"
|
||||
echo "Keys and configuration are preserved"
|
||||
echo "To re-enable, use: ./enable-client.sh ${CLIENT_NAME}"
|
||||
echo ""
|
||||
66
scripts/enable-client.sh
Executable file
66
scripts/enable-client.sh
Executable file
@@ -0,0 +1,66 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
# Script to enable a previously disabled VPN client
|
||||
# Usage: ./enable-client.sh <client_name>
|
||||
|
||||
if [ "$EUID" -ne 0 ]; then
|
||||
echo "ERROR: Please run as root"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z "$1" ]; then
|
||||
echo "Usage: $0 <client_name>"
|
||||
echo "Example: $0 phone"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
CLIENT_NAME="$1"
|
||||
KEYS_DIR="/etc/wireguard/keys"
|
||||
CLIENTS_DIR="/etc/wireguard/clients"
|
||||
WG_INTERFACE="wg0"
|
||||
|
||||
# Check if client exists
|
||||
if [ ! -f "${KEYS_DIR}/client_${CLIENT_NAME}.pub" ]; then
|
||||
echo "ERROR: Client '${CLIENT_NAME}' does not exist"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ! -f "${CLIENTS_DIR}/${CLIENT_NAME}.conf" ]; then
|
||||
echo "ERROR: Client configuration file not found"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
CLIENT_PUBLIC_KEY=$(cat "${KEYS_DIR}/client_${CLIENT_NAME}.pub")
|
||||
|
||||
# Check if client is already active
|
||||
if wg show ${WG_INTERFACE} | grep -q "${CLIENT_PUBLIC_KEY}"; then
|
||||
echo "Client '${CLIENT_NAME}' is already enabled"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Extract IP from client config
|
||||
CLIENT_IP=$(grep "^Address" "${CLIENTS_DIR}/${CLIENT_NAME}.conf" | awk '{print $3}')
|
||||
|
||||
if [ -z "${CLIENT_IP}" ]; then
|
||||
echo "ERROR: Could not determine client IP from config"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Enabling VPN client: ${CLIENT_NAME}"
|
||||
echo ""
|
||||
|
||||
echo "[1/2] Adding peer to WireGuard interface..."
|
||||
wg set ${WG_INTERFACE} peer ${CLIENT_PUBLIC_KEY} allowed-ips ${CLIENT_IP}
|
||||
|
||||
echo "[2/2] Saving WireGuard configuration..."
|
||||
wg-quick save ${WG_INTERFACE}
|
||||
|
||||
echo ""
|
||||
echo "========================================="
|
||||
echo "Client enabled successfully!"
|
||||
echo "========================================="
|
||||
echo ""
|
||||
echo "Client '${CLIENT_NAME}' is now active"
|
||||
echo "IP Address: ${CLIENT_IP}"
|
||||
echo ""
|
||||
68
scripts/list-clients.sh
Executable file
68
scripts/list-clients.sh
Executable file
@@ -0,0 +1,68 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Script to list all VPN clients and their status
|
||||
# Usage: ./list-clients.sh
|
||||
|
||||
if [ "$EUID" -ne 0 ]; then
|
||||
echo "ERROR: Please run as root"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
WG_INTERFACE="wg0"
|
||||
KEYS_DIR="/etc/wireguard/keys"
|
||||
|
||||
echo "========================================="
|
||||
echo "VPN Clients Status"
|
||||
echo "========================================="
|
||||
echo ""
|
||||
|
||||
# Check if interface is up
|
||||
if ! ip link show ${WG_INTERFACE} &>/dev/null; then
|
||||
echo "ERROR: ${WG_INTERFACE} interface is not up"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Get list of client keys
|
||||
CLIENT_KEYS=$(ls ${KEYS_DIR}/client_*.pub 2>/dev/null | sed 's|.*/client_||; s|\.pub$||')
|
||||
|
||||
if [ -z "${CLIENT_KEYS}" ]; then
|
||||
echo "No clients configured"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Table header
|
||||
printf "%-15s %-15s %-45s %-20s %s\n" "Client" "IP Address" "Public Key" "Latest Handshake" "Transfer"
|
||||
echo "---------------------------------------------------------------------------------------------------------------------------"
|
||||
|
||||
for client in ${CLIENT_KEYS}; do
|
||||
CLIENT_PUBKEY=$(cat "${KEYS_DIR}/client_${client}.pub")
|
||||
|
||||
# Get client info from wg show
|
||||
CLIENT_INFO=$(wg show ${WG_INTERFACE} | grep -A 5 "${CLIENT_PUBKEY}" || echo "")
|
||||
|
||||
if [ -z "${CLIENT_INFO}" ]; then
|
||||
# Client key exists but not in wg config (disabled)
|
||||
printf "%-15s %-15s %-45s %-20s %s\n" "${client}" "N/A" "${CLIENT_PUBKEY:0:40}..." "DISABLED" "N/A"
|
||||
else
|
||||
# Extract details
|
||||
ALLOWED_IP=$(echo "${CLIENT_INFO}" | grep "allowed ips:" | awk '{print $3}' | cut -d'/' -f1)
|
||||
HANDSHAKE=$(echo "${CLIENT_INFO}" | grep "latest handshake:" | cut -d':' -f2- | xargs)
|
||||
TRANSFER=$(echo "${CLIENT_INFO}" | grep "transfer:" | cut -d':' -f2- | xargs)
|
||||
|
||||
# Format handshake
|
||||
if [ -z "${HANDSHAKE}" ]; then
|
||||
HANDSHAKE="Never"
|
||||
fi
|
||||
|
||||
# Format transfer
|
||||
if [ -z "${TRANSFER}" ]; then
|
||||
TRANSFER="N/A"
|
||||
fi
|
||||
|
||||
printf "%-15s %-15s %-45s %-20s %s\n" "${client}" "${ALLOWED_IP}" "${CLIENT_PUBKEY:0:40}..." "${HANDSHAKE}" "${TRANSFER}"
|
||||
fi
|
||||
done
|
||||
|
||||
echo ""
|
||||
echo "Total clients: $(echo "${CLIENT_KEYS}" | wc -w)"
|
||||
echo ""
|
||||
51
scripts/remove-client.sh
Executable file
51
scripts/remove-client.sh
Executable file
@@ -0,0 +1,51 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
# Script to remove a VPN client
|
||||
# Usage: ./remove-client.sh <client_name>
|
||||
|
||||
if [ "$EUID" -ne 0 ]; then
|
||||
echo "ERROR: Please run as root"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z "$1" ]; then
|
||||
echo "Usage: $0 <client_name>"
|
||||
echo "Example: $0 phone"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
CLIENT_NAME="$1"
|
||||
KEYS_DIR="/etc/wireguard/keys"
|
||||
CLIENTS_DIR="/etc/wireguard/clients"
|
||||
WG_INTERFACE="wg0"
|
||||
|
||||
# Check if client exists
|
||||
if [ ! -f "${KEYS_DIR}/client_${CLIENT_NAME}.pub" ]; then
|
||||
echo "ERROR: Client '${CLIENT_NAME}' does not exist"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
CLIENT_PUBLIC_KEY=$(cat "${KEYS_DIR}/client_${CLIENT_NAME}.pub")
|
||||
|
||||
echo "Removing VPN client: ${CLIENT_NAME}"
|
||||
echo ""
|
||||
|
||||
echo "[1/4] Removing peer from WireGuard interface..."
|
||||
wg set ${WG_INTERFACE} peer ${CLIENT_PUBLIC_KEY} remove
|
||||
|
||||
echo "[2/4] Saving WireGuard configuration..."
|
||||
wg-quick save ${WG_INTERFACE}
|
||||
|
||||
echo "[3/4] Removing client keys..."
|
||||
rm -f "${KEYS_DIR}/client_${CLIENT_NAME}.key"
|
||||
rm -f "${KEYS_DIR}/client_${CLIENT_NAME}.pub"
|
||||
|
||||
echo "[4/4] Removing client configuration..."
|
||||
rm -f "${CLIENTS_DIR}/${CLIENT_NAME}.conf"
|
||||
|
||||
echo ""
|
||||
echo "========================================="
|
||||
echo "Client removed successfully!"
|
||||
echo "========================================="
|
||||
echo ""
|
||||
137
scripts/setup-de-vds.sh
Executable file
137
scripts/setup-de-vds.sh
Executable file
@@ -0,0 +1,137 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
# Setup script for DE VDS (Exit Node)
|
||||
# Run this script as root on the DE VDS server
|
||||
|
||||
echo "========================================="
|
||||
echo "DE VDS (Exit Node) Setup"
|
||||
echo "========================================="
|
||||
echo ""
|
||||
|
||||
# Check if running as root
|
||||
if [ "$EUID" -ne 0 ]; then
|
||||
echo "ERROR: Please run as root"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "[1/7] Updating system packages..."
|
||||
apt update
|
||||
apt upgrade -y
|
||||
|
||||
echo "[2/7] Installing required packages..."
|
||||
apt install -y wireguard nftables iptables
|
||||
|
||||
echo "[3/7] Enabling IP forwarding..."
|
||||
cat > /etc/sysctl.d/99-vpn.conf << 'EOF'
|
||||
# Enable IP forwarding for VPN
|
||||
net.ipv4.ip_forward = 1
|
||||
EOF
|
||||
sysctl -p /etc/sysctl.d/99-vpn.conf
|
||||
|
||||
echo "[4/7] Generating WireGuard keys..."
|
||||
mkdir -p /etc/wireguard/keys
|
||||
chmod 700 /etc/wireguard/keys
|
||||
wg genkey | tee /etc/wireguard/keys/server.key | wg pubkey > /etc/wireguard/keys/server.pub
|
||||
chmod 600 /etc/wireguard/keys/*
|
||||
|
||||
echo "[5/7] Creating WireGuard configuration..."
|
||||
cat > /etc/wireguard/wg0.conf << 'EOF'
|
||||
[Interface]
|
||||
Address = 10.20.0.2/30
|
||||
ListenPort = 51821
|
||||
PrivateKey = __DE_SERVER_PRIVATE_KEY__
|
||||
PostUp = nft -f /etc/nftables.conf
|
||||
PostDown = nft flush ruleset
|
||||
|
||||
[Peer]
|
||||
# RU VDS (server tunnel)
|
||||
PublicKey = __RU_DE_TUNNEL_PUBLIC_KEY__
|
||||
AllowedIPs = 10.20.0.1/32, 10.10.0.0/24
|
||||
EOF
|
||||
|
||||
# Replace private key placeholder
|
||||
PRIVATE_KEY=$(cat /etc/wireguard/keys/server.key)
|
||||
sed -i "s|__DE_SERVER_PRIVATE_KEY__|${PRIVATE_KEY}|g" /etc/wireguard/wg0.conf
|
||||
|
||||
echo "[6/7] Creating nftables configuration..."
|
||||
cat > /etc/nftables.conf << 'EOF'
|
||||
#!/usr/sbin/nft -f
|
||||
|
||||
flush ruleset
|
||||
|
||||
table inet filter {
|
||||
chain input {
|
||||
type filter hook input priority 0; policy drop;
|
||||
|
||||
# Allow established connections
|
||||
ct state established,related accept
|
||||
|
||||
# Allow loopback
|
||||
iif lo accept
|
||||
|
||||
# Allow SSH (adjust port if needed)
|
||||
tcp dport 22 accept
|
||||
|
||||
# Allow WireGuard from RU VDS only
|
||||
ip saddr 176.124.216.197 udp dport 51821 accept
|
||||
|
||||
# Allow ICMP
|
||||
icmp type echo-request accept
|
||||
}
|
||||
|
||||
chain forward {
|
||||
type filter hook forward priority 0; policy drop;
|
||||
|
||||
# Allow forwarding from VPN
|
||||
iifname "wg0" accept
|
||||
|
||||
# Allow established connections back
|
||||
ct state established,related accept
|
||||
}
|
||||
|
||||
chain output {
|
||||
type filter hook output priority 0; policy accept;
|
||||
}
|
||||
}
|
||||
|
||||
table inet nat {
|
||||
chain postrouting {
|
||||
type nat hook postrouting priority 100;
|
||||
|
||||
# NAT traffic from VPN to internet
|
||||
oifname != "wg0" ip saddr { 10.10.0.0/24, 10.20.0.0/30 } masquerade
|
||||
}
|
||||
}
|
||||
EOF
|
||||
|
||||
chmod +x /etc/nftables.conf
|
||||
|
||||
echo "[7/7] Enabling services..."
|
||||
systemctl enable nftables
|
||||
systemctl enable wg-quick@wg0
|
||||
|
||||
echo ""
|
||||
echo "========================================="
|
||||
echo "Setup completed!"
|
||||
echo "========================================="
|
||||
echo ""
|
||||
echo "IMPORTANT: Next steps"
|
||||
echo ""
|
||||
echo "1. Your DE VDS public key is:"
|
||||
echo ""
|
||||
cat /etc/wireguard/keys/server.pub
|
||||
echo ""
|
||||
echo "2. You need to get the RU VDS public key (from de-tunnel.pub)"
|
||||
echo ""
|
||||
echo "3. Edit /etc/wireguard/wg0.conf and replace:"
|
||||
echo " __RU_DE_TUNNEL_PUBLIC_KEY__ with the actual RU VDS de-tunnel public key"
|
||||
echo ""
|
||||
echo "4. Start the services:"
|
||||
echo " systemctl start nftables"
|
||||
echo " systemctl start wg-quick@wg0"
|
||||
echo ""
|
||||
echo "5. Verify the tunnel:"
|
||||
echo " wg show"
|
||||
echo " ping 10.20.0.1"
|
||||
echo ""
|
||||
261
scripts/setup-ru-vds.sh
Executable file
261
scripts/setup-ru-vds.sh
Executable file
@@ -0,0 +1,261 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
# Setup script for RU VDS (Gateway)
|
||||
# Run this script as root on the RU VDS server
|
||||
|
||||
echo "========================================="
|
||||
echo "RU VDS (Gateway) Setup"
|
||||
echo "========================================="
|
||||
echo ""
|
||||
|
||||
# Check if running as root
|
||||
if [ "$EUID" -ne 0 ]; then
|
||||
echo "ERROR: Please run as root"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "[1/10] Updating system packages..."
|
||||
apt update
|
||||
apt upgrade -y
|
||||
|
||||
echo "[2/10] Installing required packages..."
|
||||
apt install -y wireguard dnsmasq nftables iptables ipset qrencode
|
||||
|
||||
echo "[3/10] Disabling systemd-resolved (conflicts with dnsmasq)..."
|
||||
systemctl disable --now systemd-resolved 2>/dev/null || true
|
||||
rm -f /etc/resolv.conf
|
||||
cat > /etc/resolv.conf << 'EOF'
|
||||
nameserver 8.8.8.8
|
||||
nameserver 1.1.1.1
|
||||
EOF
|
||||
|
||||
echo "[4/10] Enabling IP forwarding..."
|
||||
cat > /etc/sysctl.d/99-vpn.conf << 'EOF'
|
||||
# Enable IP forwarding for VPN
|
||||
net.ipv4.ip_forward = 1
|
||||
EOF
|
||||
sysctl -p /etc/sysctl.d/99-vpn.conf
|
||||
|
||||
echo "[5/10] Generating WireGuard keys..."
|
||||
mkdir -p /etc/wireguard/keys
|
||||
chmod 700 /etc/wireguard/keys
|
||||
|
||||
# Server key for user-facing interface
|
||||
wg genkey | tee /etc/wireguard/keys/server.key | wg pubkey > /etc/wireguard/keys/server.pub
|
||||
|
||||
# Key for DE tunnel
|
||||
wg genkey | tee /etc/wireguard/keys/de-tunnel.key | wg pubkey > /etc/wireguard/keys/de-tunnel.pub
|
||||
|
||||
chmod 600 /etc/wireguard/keys/*
|
||||
|
||||
echo "[6/10] Adding custom routing table..."
|
||||
if ! grep -q "^200[[:space:]]*proxy" /etc/iproute2/rt_tables; then
|
||||
echo "200 proxy" >> /etc/iproute2/rt_tables
|
||||
fi
|
||||
|
||||
echo "[7/10] Creating WireGuard configurations..."
|
||||
|
||||
# wg0 - user-facing
|
||||
cat > /etc/wireguard/wg0.conf << 'EOF'
|
||||
[Interface]
|
||||
Address = 10.10.0.1/24
|
||||
ListenPort = 51820
|
||||
PrivateKey = __RU_SERVER_PRIVATE_KEY__
|
||||
PostUp = /etc/wireguard/postup.sh
|
||||
PostDown = /etc/wireguard/postdown.sh
|
||||
|
||||
# Client peers will be added below
|
||||
# Use add-client.sh script to add new clients
|
||||
EOF
|
||||
|
||||
# Replace private key placeholder
|
||||
PRIVATE_KEY=$(cat /etc/wireguard/keys/server.key)
|
||||
sed -i "s|__RU_SERVER_PRIVATE_KEY__|${PRIVATE_KEY}|g" /etc/wireguard/wg0.conf
|
||||
|
||||
# wg1 - DE tunnel
|
||||
cat > /etc/wireguard/wg1.conf << 'EOF'
|
||||
[Interface]
|
||||
Address = 10.20.0.1/30
|
||||
PrivateKey = __RU_DE_TUNNEL_PRIVATE_KEY__
|
||||
|
||||
[Peer]
|
||||
# DE VDS (exit node)
|
||||
PublicKey = __DE_SERVER_PUBLIC_KEY__
|
||||
Endpoint = 194.31.173.178:51821
|
||||
AllowedIPs = 10.10.0.0/24
|
||||
PersistentKeepalive = 25
|
||||
EOF
|
||||
|
||||
# Replace private key placeholder
|
||||
DE_TUNNEL_KEY=$(cat /etc/wireguard/keys/de-tunnel.key)
|
||||
sed -i "s|__RU_DE_TUNNEL_PRIVATE_KEY__|${DE_TUNNEL_KEY}|g" /etc/wireguard/wg1.conf
|
||||
|
||||
echo "[8/10] Creating WireGuard helper scripts..."
|
||||
|
||||
# PostUp script
|
||||
cat > /etc/wireguard/postup.sh << 'EOF'
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
# Create ipsets for routing decisions
|
||||
ipset create direct hash:net -exist
|
||||
ipset flush direct
|
||||
|
||||
# Add default route via DE tunnel for 'proxy' table
|
||||
ip route add default via 10.20.0.2 dev wg1 table proxy 2>/dev/null || true
|
||||
|
||||
# Policy routing: packets with fwmark 0x1 use 'proxy' table
|
||||
ip rule add from 10.10.0.0/24 fwmark 0x1 table proxy priority 100 2>/dev/null || true
|
||||
|
||||
# Load nftables rules
|
||||
nft -f /etc/nftables.conf
|
||||
|
||||
# Mark packets NOT going to 'direct' ipset with fwmark 0x1
|
||||
iptables -t mangle -I PREROUTING -m set ! --match-set direct dst -s 10.10.0.0/24 -j MARK --set-mark 0x1
|
||||
|
||||
echo "PostUp script completed successfully"
|
||||
EOF
|
||||
|
||||
# PostDown script
|
||||
cat > /etc/wireguard/postdown.sh << 'EOF'
|
||||
#!/bin/bash
|
||||
|
||||
# Remove policy routing rule
|
||||
ip rule del from 10.10.0.0/24 fwmark 0x1 table proxy priority 100 2>/dev/null || true
|
||||
|
||||
# Flush routing table
|
||||
ip route flush table proxy 2>/dev/null || true
|
||||
|
||||
# Remove iptables mangle rule
|
||||
iptables -t mangle -F PREROUTING 2>/dev/null || true
|
||||
|
||||
# Destroy ipsets
|
||||
ipset destroy direct 2>/dev/null || true
|
||||
|
||||
echo "PostDown script completed"
|
||||
EOF
|
||||
|
||||
chmod +x /etc/wireguard/postup.sh
|
||||
chmod +x /etc/wireguard/postdown.sh
|
||||
|
||||
echo "[9/10] Creating nftables configuration..."
|
||||
cat > /etc/nftables.conf << 'EOF'
|
||||
#!/usr/sbin/nft -f
|
||||
|
||||
flush ruleset
|
||||
|
||||
table inet filter {
|
||||
chain input {
|
||||
type filter hook input priority 0; policy drop;
|
||||
|
||||
# Allow established connections
|
||||
ct state established,related accept
|
||||
|
||||
# Allow loopback
|
||||
iif lo accept
|
||||
|
||||
# Allow SSH (adjust port if needed)
|
||||
tcp dport 22 accept
|
||||
|
||||
# Allow WireGuard from anywhere (user connections)
|
||||
udp dport 51820 accept
|
||||
|
||||
# Allow DNS from VPN clients only
|
||||
iifname "wg0" udp dport 53 accept
|
||||
iifname "wg0" tcp dport 53 accept
|
||||
|
||||
# Allow ICMP
|
||||
icmp type echo-request accept
|
||||
}
|
||||
|
||||
chain forward {
|
||||
type filter hook forward priority 0; policy drop;
|
||||
|
||||
# Allow forwarding from user VPN
|
||||
iifname "wg0" accept
|
||||
|
||||
# Allow forwarding from DE tunnel
|
||||
iifname "wg1" accept
|
||||
|
||||
# Allow established connections
|
||||
ct state established,related accept
|
||||
}
|
||||
|
||||
chain output {
|
||||
type filter hook output priority 0; policy accept;
|
||||
}
|
||||
}
|
||||
|
||||
table inet nat {
|
||||
chain postrouting {
|
||||
type nat hook postrouting priority 100;
|
||||
|
||||
# NAT direct traffic going out main interface
|
||||
oifname != "wg0" oifname != "wg1" ip saddr 10.10.0.0/24 masquerade
|
||||
}
|
||||
}
|
||||
EOF
|
||||
|
||||
chmod +x /etc/nftables.conf
|
||||
|
||||
echo "[10/10] Configuring dnsmasq..."
|
||||
cat > /etc/dnsmasq.d/vpn-routing.conf << 'EOF'
|
||||
# Listen only on VPN interface
|
||||
interface=wg0
|
||||
bind-interfaces
|
||||
|
||||
# Upstream DNS servers
|
||||
server=8.8.8.8
|
||||
server=8.8.4.4
|
||||
server=1.1.1.1
|
||||
|
||||
# Don't read /etc/resolv.conf
|
||||
no-resolv
|
||||
|
||||
# Cache settings
|
||||
cache-size=10000
|
||||
|
||||
# Russian TLDs - add resolved IPs to 'direct' ipset
|
||||
ipset=/ru/direct
|
||||
ipset=/рф/direct
|
||||
ipset=/su/direct
|
||||
|
||||
# All other domains will go through proxy (default routing)
|
||||
EOF
|
||||
|
||||
# Create clients directory
|
||||
mkdir -p /etc/wireguard/clients
|
||||
|
||||
echo ""
|
||||
echo "========================================="
|
||||
echo "Setup completed!"
|
||||
echo "========================================="
|
||||
echo ""
|
||||
echo "IMPORTANT: Next steps"
|
||||
echo ""
|
||||
echo "1. Your RU VDS public keys are:"
|
||||
echo ""
|
||||
echo " Server key (for clients):"
|
||||
cat /etc/wireguard/keys/server.pub
|
||||
echo ""
|
||||
echo " DE tunnel key (for DE VDS):"
|
||||
cat /etc/wireguard/keys/de-tunnel.pub
|
||||
echo ""
|
||||
echo "2. You need to get the DE VDS public key"
|
||||
echo ""
|
||||
echo "3. Edit /etc/wireguard/wg1.conf and replace:"
|
||||
echo " __DE_SERVER_PUBLIC_KEY__ with the actual DE VDS public key"
|
||||
echo ""
|
||||
echo "4. Enable and start services:"
|
||||
echo " systemctl enable nftables dnsmasq"
|
||||
echo " systemctl start dnsmasq"
|
||||
echo " systemctl start wg-quick@wg1"
|
||||
echo " systemctl start wg-quick@wg0"
|
||||
echo ""
|
||||
echo "5. Verify the tunnel:"
|
||||
echo " wg show"
|
||||
echo " ping 10.20.0.2"
|
||||
echo ""
|
||||
echo "6. Add clients using: /root/add-client.sh <client_name>"
|
||||
echo ""
|
||||
Reference in New Issue
Block a user