This commit is contained in:
Roxy 2023-07-05 22:42:05 +02:00
commit fcf5e9ac65
4 changed files with 185 additions and 0 deletions

39
README.md Normal file
View File

@ -0,0 +1,39 @@
# ruby-rewrite-proxy
This project sets up a simple HTTP proxy using Ruby and Nginx. It's designed to forward requests to a specified host, with the option to replace certain strings in the response.
## Installation
To install the necessary dependencies and set up the proxy, run the following command:
```bash
bash installer.sh
```
This will:
Install Ruby and the 'webrick' gem.
Install Nginx and enable it to start on boot.
Create a directory in the current user's home directory called 'ruby-proxy'.
Clone this repository into the 'ruby-proxy' directory.
Prompt you to enter values for 'server_name' and 'proxy_set_header'.
Create an Nginx configuration file using the provided template and your input.
Enable the new Nginx site.
Reload Nginx to apply the changes.
After running the script, don't forget to adjust config.yml to your likings.
## Configuration
The proxy.rb script reads its configuration from config.yml. This file specifies the host to proxy requests to, the port to listen on, and a set of string replacements to apply to the response.
## Logging
The proxy.rb script logs its output to ruby-proxy.log in the same directory.
## Usage
To start the proxy, run the following command:
```bash
ruby proxy.rb
```
This will start the proxy, listening on the port specified in config.yml.

7
config.yml Normal file
View File

@ -0,0 +1,7 @@
replacements:
example.com: example.mydomain.com
">example<": "example @ mydomain<"
https:: http:
host: example.com
port: 8000

88
installer.sh Normal file
View File

@ -0,0 +1,88 @@
#!/bin/bash
set -e
# Install Ruby and the Ruby dependency 'webrick'
if ! command -v ruby &> /dev/null; then
echo "Installing Ruby..."
sudo apt-get update
sudo apt-get install -y ruby-full
fi
if ! gem list webrick -i > /dev/null; then
echo "Installing webrick..."
gem install webrick
fi
# Install Nginx and enable the service
if ! command -v nginx &> /dev/null; then
echo "Installing Nginx..."
sudo apt-get install -y nginx
fi
echo "Enabling Nginx service..."
sudo systemctl enable nginx
sudo systemctl start nginx
# Make a directory in the current user's home folder called 'ruby-proxy'
if [ ! -d ~/ruby-proxy ]; then
echo "Creating directory 'ruby-proxy'..."
mkdir ~/ruby-proxy
fi
# Clone the contents of the specified git repository into that folder
if [ ! -d ~/ruby-proxy/ruby-rewrite-proxy ]; then
echo "Cloning repository..."
git clone https://adastra7.net/git/crt/ruby-rewrite-proxy.git ~/ruby-proxy
fi
# Ask the user to set server_name and proxy_set_header
read -p "Enter server_name (the URL from which you will access the Website): " server_name
read -p "Enter proxy_set_header (the host header for the website you wanna modify/proxy): " proxy_set_header
# Create the Nginx config file
if [ ! -f /etc/nginx/sites-available/ruby-proxy ]; then
echo "Creating Nginx configuration file..."
cat << EOF > /etc/nginx/sites-available/ruby-proxy
resolver 8.8.8.8;
server {
listen 80;
server_name $server_name;
location / {
proxy_pass http://localhost:8000/;
proxy_set_header Host $proxy_set_header;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
proxy_ssl_server_name on;
proxy_ssl_verify off;
}
location /favicon.ico {
return 204;
access_log off;
log_not_found off;
}
location /robots.txt {
return 200 "User-agent: *\nDisallow: /";
access_log off;
log_not_found off;
}
}
EOF
fi
# Enable the site
if [ ! -f /etc/nginx/sites-enabled/ruby-proxy ]; then
echo "Enabling the site..."
sudo ln -s /etc/nginx/sites-available/ruby-proxy /etc/nginx/sites-enabled/
fi
# Reload Nginx to apply the changes
echo "Reloading Nginx..."
sudo systemctl reload nginx
echo "The script has completed. Please edit the config.yml in ~/ruby-proxy/config.yml to your liking now before running proxy.rb to start the proxy"

51
proxy.rb Normal file
View File

@ -0,0 +1,51 @@
#!/usr/bin/env ruby
require "webrick"
require "net/http"
require "uri"
require "yaml"
# Load configuration from file
config = YAML.load_file(File.join(__dir__, 'config.yml'))
$replacements = config['replacements']
class MyProxy < WEBrick::HTTPServlet::AbstractServlet
HOST = config['host'] # set host to proxy duh
def do_GET(request, response)
uri = request.unparsed_uri
proxy_request(request, response, Net::HTTP::Get.new(uri, {"User-Agent" => "amongus happy meal guys this is crazy i ordered an amogus happy meal at 3am hugy wugy came and sucked my dick this is so scary"}))
end
def do_POST(request, response)
uri = request.unparsed_uri
proxy_request(request, response, Net::HTTP::Post.new(uri, {"User-Agent" => "amongus happy meal guys this is crazy i ordered an amogus happy meal at 3am hugy wugy came and sucked my dick this is so scary"}), request.body)
end
def proxy_request(request, response, http_request, body = nil)
http = Net::HTTP.new(HOST, 443)
http.use_ssl = true
http_request.body = body if body
resp = http.request(http_request)
body = resp.body
response.content_type = resp["content-type"]
$replacements.each { |k,v|
body = body.gsub(k,v)
}
response.body = body
end
end
# Redirect stdout and stderr to a log file
$stdout.reopen(File.join(__dir__, 'ruby-proxy.log'), 'a')
$stderr.reopen($stdout)
server = WEBrick::HTTPServer.new(:Port => config['port'] || 8000) # define port on which the proxy runs ... so this would be localhost:8000
server.mount "/", MyProxy
trap("INT"){ server.shutdown }
server.start