Files
pic/scripts/setup-network.sh
2025-09-14 03:31:14 -05:00

269 lines
7.7 KiB
Bash
Executable File

#!/bin/bash
# Personal Internet Cell - Network Configuration Script
# This script sets up proper routing and NAT for WireGuard VPN internet access
set -e
echo "🔧 Setting up Personal Internet Cell Network Configuration..."
# Configuration variables
WG_INTERFACE="wg0"
WG_NETWORK="10.0.0.0/24"
WG_CONTAINER="cell-wireguard"
HOST_INTERFACE="eth0" # This will be auto-detected
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
log_info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
log_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
log_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# Function to check if running as root
check_root() {
if [[ $EUID -ne 0 ]]; then
log_error "This script must be run as root"
exit 1
fi
}
# Function to detect the main network interface
detect_interface() {
# Try to detect the main interface (not loopback, not docker)
HOST_INTERFACE=$(ip route | grep default | awk '{print $5}' | head -1)
if [[ -z "$HOST_INTERFACE" ]]; then
log_error "Could not detect main network interface"
exit 1
fi
log_info "Detected main interface: $HOST_INTERFACE"
}
# Function to enable IP forwarding
enable_ip_forwarding() {
log_info "Enabling IP forwarding..."
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
sysctl -p
log_success "IP forwarding enabled"
}
# Function to configure WireGuard container networking
configure_wireguard_container() {
log_info "Configuring WireGuard container networking..."
# Check if container is running
if ! docker ps | grep -q "$WG_CONTAINER"; then
log_error "WireGuard container is not running"
exit 1
fi
# Get container's main interface
CONTAINER_INTERFACE=$(docker exec $WG_CONTAINER ip route | grep default | awk '{print $5}' | head -1)
if [[ -z "$CONTAINER_INTERFACE" ]]; then
CONTAINER_INTERFACE="eth0"
fi
log_info "Container interface: $CONTAINER_INTERFACE"
# Configure iptables rules inside the container
docker exec $WG_CONTAINER sh -c "
# Enable IP forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward
# Add default route if missing
ip route add default via 172.20.0.1 dev $CONTAINER_INTERFACE 2>/dev/null || true
# Clear existing rules (be careful!)
iptables -t nat -F
iptables -F FORWARD
# Allow forwarding for WireGuard interface
iptables -A FORWARD -i $WG_INTERFACE -j ACCEPT
iptables -A FORWARD -o $WG_INTERFACE -j ACCEPT
# NAT rule for internet access
iptables -t nat -A POSTROUTING -s $WG_NETWORK -o $CONTAINER_INTERFACE -j MASQUERADE
# Allow established and related connections
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# Log the configuration
echo 'Network configuration applied:'
echo 'IP Forwarding:'
cat /proc/sys/net/ipv4/ip_forward
echo 'Routing Table:'
ip route show
echo 'NAT Rules:'
iptables -t nat -L POSTROUTING -n
echo 'Forwarding Rules:'
iptables -L FORWARD -n
"
log_success "WireGuard container networking configured"
}
# Function to configure host networking
configure_host_networking() {
log_info "Configuring host networking..."
# Enable IP forwarding on host
echo 'net.ipv4.ip_forward = 1' > /etc/sysctl.d/99-wireguard.conf
sysctl -p /etc/sysctl.d/99-wireguard.conf
# Configure iptables rules on host
iptables -t nat -A POSTROUTING -s $WG_NETWORK -o $HOST_INTERFACE -j MASQUERADE
iptables -A FORWARD -i $WG_INTERFACE -j ACCEPT
iptables -A FORWARD -o $WG_INTERFACE -j ACCEPT
# Save iptables rules
if command -v iptables-save >/dev/null 2>&1; then
mkdir -p /etc/iptables
iptables-save > /etc/iptables/rules.v4
log_info "iptables rules saved"
fi
log_success "Host networking configured"
}
# Function to create persistent configuration
create_persistent_config() {
log_info "Creating persistent configuration..."
# Create systemd service for network configuration
cat > /etc/systemd/system/pic-network.service << EOF
[Unit]
Description=Personal Internet Cell Network Configuration
After=docker.service
Requires=docker.service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/opt/pic/scripts/setup-network.sh
ExecReload=/opt/pic/scripts/setup-network.sh
[Install]
WantedBy=multi-user.target
EOF
# Enable the service
systemctl daemon-reload
systemctl enable pic-network.service
log_success "Persistent configuration created"
}
# Function to test the configuration
test_configuration() {
log_info "Testing network configuration..."
# Check if WireGuard interface is up
if docker exec $WG_CONTAINER ip link show $WG_INTERFACE >/dev/null 2>&1; then
log_success "WireGuard interface is up"
else
log_error "WireGuard interface is not up"
return 1
fi
# Check NAT rules
if docker exec $WG_CONTAINER iptables -t nat -L POSTROUTING | grep -q MASQUERADE; then
log_success "NAT rules are configured"
else
log_error "NAT rules are missing"
return 1
fi
# Check IP forwarding
if docker exec $WG_CONTAINER cat /proc/sys/net/ipv4/ip_forward | grep -q 1; then
log_success "IP forwarding is enabled"
else
log_error "IP forwarding is not enabled"
return 1
fi
log_success "Network configuration test passed"
}
# Function to show status
show_status() {
log_info "Network Configuration Status:"
echo "=================================="
echo "WireGuard Interface:"
docker exec $WG_CONTAINER ip addr show $WG_INTERFACE 2>/dev/null || echo " Interface not found"
echo -e "\nRouting Table:"
docker exec $WG_CONTAINER ip route show
echo -e "\nNAT Rules:"
docker exec $WG_CONTAINER iptables -t nat -L POSTROUTING -n
echo -e "\nForwarding Rules:"
docker exec $WG_CONTAINER iptables -L FORWARD -n
echo -e "\nIP Forwarding Status:"
echo " Container: $(docker exec $WG_CONTAINER cat /proc/sys/net/ipv4/ip_forward)"
echo " Host: $(cat /proc/sys/net/ipv4/ip_forward)"
}
# Main execution
main() {
log_info "Starting Personal Internet Cell Network Setup..."
check_root
detect_interface
case "${1:-setup}" in
"setup")
enable_ip_forwarding
configure_wireguard_container
configure_host_networking
create_persistent_config
test_configuration
log_success "Network configuration completed successfully!"
;;
"test")
test_configuration
;;
"status")
show_status
;;
"reset")
log_warning "Resetting network configuration..."
docker exec $WG_CONTAINER iptables -t nat -F
docker exec $WG_CONTAINER iptables -F FORWARD
iptables -t nat -D POSTROUTING -s $WG_NETWORK -o $HOST_INTERFACE -j MASQUERADE 2>/dev/null || true
iptables -D FORWARD -i $WG_INTERFACE -j ACCEPT 2>/dev/null || true
iptables -D FORWARD -o $WG_INTERFACE -j ACCEPT 2>/dev/null || true
log_success "Network configuration reset"
;;
*)
echo "Usage: $0 {setup|test|status|reset}"
echo " setup - Configure network (default)"
echo " test - Test configuration"
echo " status - Show current status"
echo " reset - Reset configuration"
exit 1
;;
esac
}
# Run main function
main "$@"