3

AlmaLinux 使用trojan+nginx自建透明代理

 1 year ago
source link: https://apad.pro/trojan-nginx/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

AlmaLinux 使用trojan+nginx自建透明代理

前期准备

一台海外服务器、一个DNSPod账号、一个国内可以正常访问的域名,同时需要对Linux有操作基础,至少会使用ssh连接服务器。

由于DNS解析需要一定时间,建议部署前,提前在DNSPod将用于连接代理的域名指向海外服务器IP,并为该域名申请免费的SSL证书。

这里推荐DNSPod,兼顾海内外的解析速度,有专业能力的用户可以随意。

(如果你搞不定以上,建议放弃自建)


部署trojan

1.1 下载与安装sing-box

wget https://github.com/SagerNet/sing-box/releases/download/v1.1-beta9/sing-box-1.1-beta9-linux-amd64v3.tar.gz
tar zxvf sing-box-1.1-beta9-linux-amd64v3.tar.gz
mv sing-box-1.1-beta9-linux-amd64v3/sing-box /usr/local/bin/sing-box
chmod +x /usr/local/bin/sing-box
rm -rf sing-box-1.1-beta9-linux-amd64v3
  1. wget https://github.com/SagerNet/sing-box/releases/download/v1.1-beta9/sing-box-1.1-beta9-linux-amd64v3.tar.gz
  2. tar zxvf sing-box-1.1-beta9-linux-amd64v3.tar.gz
  3. mv sing-box-1.1-beta9-linux-amd64v3/sing-box /usr/local/bin/sing-box
  4. chmod +x /usr/local/bin/sing-box
  5. rm -rf sing-box-1.1-beta9-linux-amd64v3
wget https://github.com/SagerNet/sing-box/releases/download/v1.1-beta9/sing-box-1.1-beta9-linux-amd64v3.tar.gz
tar zxvf sing-box-1.1-beta9-linux-amd64v3.tar.gz
mv sing-box-1.1-beta9-linux-amd64v3/sing-box /usr/local/bin/sing-box
chmod +x /usr/local/bin/sing-box
rm -rf sing-box-1.1-beta9-linux-amd64v3

1.2 创建配置文件

mkdir -p /etc/sing-box
mkdir -p /data/wwwlogs
vi /etc/sing-box/config.json
  1. mkdir -p /etc/sing-box
  2. mkdir -p /data/wwwlogs
  3. vi /etc/sing-box/config.json
mkdir -p /etc/sing-box
mkdir -p /data/wwwlogs
vi /etc/sing-box/config.json

输入以下内容后保存

{
  "log": {
    "level": "error",
    "output": "/data/wwwlogs/error_trojan.log",
    "timestamp": true
  },
  "dns": {
    "servers": [
      {
        "address": "208.67.222.222"
      }
    ]
  },
  "inbounds": [
    {
      "type": "trojan",
      "tag": "trojan-in",
      "listen": "127.0.0.1",
      "listen_port": 8443,
      "tcp_fast_open": true,
      "udp_fragment": true,
      "udp_timeout": 300,
      "proxy_protocol": true,
      "proxy_protocol_accept_no_header": true,
      "users": [
        {
          "name": "mytrojan",
          "password": "123456"
        }
      ],
      "tls": {
        "enabled": false
      },
      "fallback": {
        "server": "127.0.0.1",
        "server_port": 80
      }
    }
  ]
}
  1. "log": {
  2. "level": "error",
  3. "output": "/data/wwwlogs/error_trojan.log",
  4. "timestamp": true
  5. "dns": {
  6. "servers": [
  7. "address": "208.67.222.222"
  8. "inbounds": [
  9. "type": "trojan",
  10. "tag": "trojan-in",
  11. "listen": "127.0.0.1",
  12. "listen_port": 8443,
  13. "tcp_fast_open": true,
  14. "udp_fragment": true,
  15. "udp_timeout": 300,
  16. "proxy_protocol": true,
  17. "proxy_protocol_accept_no_header": true,
  18. "users": [
  19. "name": "mytrojan",
  20. "password": "123456"
  21. "tls": {
  22. "enabled": false
  23. "fallback": {
  24. "server": "127.0.0.1",
  25. "server_port": 80
{
  "log": {
    "level": "error",
    "output": "/data/wwwlogs/error_trojan.log",
    "timestamp": true
  },
  "dns": {
    "servers": [
      {
        "address": "208.67.222.222"
      }
    ]
  },
  "inbounds": [
    {
      "type": "trojan",
      "tag": "trojan-in",
      "listen": "127.0.0.1",
      "listen_port": 8443,
      "tcp_fast_open": true,
      "udp_fragment": true,
      "udp_timeout": 300,
      "proxy_protocol": true,
      "proxy_protocol_accept_no_header": true,
      "users": [
        {
          "name": "mytrojan",
          "password": "123456"
        }
      ],
      "tls": {
        "enabled": false
      },
      "fallback": {
        "server": "127.0.0.1",
        "server_port": 80
      }
    }
  ]
}

其中仅需要将上文”password”: “123456”中的123456修改为自己想要设置的密码即可

1.3 创建trojan服务

vi /etc/systemd/system/sing-box.service
  1. vi /etc/systemd/system/sing-box.service
vi /etc/systemd/system/sing-box.service

输入以下内容并保存

[Unit]
Description=sing-box service
Documentation=https://sing-box.sagernet.org
After=network.target nss-lookup.target

[Service]
CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
ExecStart=/usr/local/bin/sing-box run -c /etc/sing-box/config.json
Restart=on-failure
RestartSec=10s
LimitNOFILE=infinity

[Install]
WantedBy=multi-user.target
  1. [Unit]
  2. Description=sing-box service
  3. Documentation=https://sing-box.sagernet.org
  4. After=network.target nss-lookup.target
  5. [Service]
  6. CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
  7. AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
  8. ExecStart=/usr/local/bin/sing-box run -c /etc/sing-box/config.json
  9. Restart=on-failure
  10. RestartSec=10s
  11. LimitNOFILE=infinity
  12. [Install]
  13. WantedBy=multi-user.target
[Unit]
Description=sing-box service
Documentation=https://sing-box.sagernet.org
After=network.target nss-lookup.target

[Service]
CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE
ExecStart=/usr/local/bin/sing-box run -c /etc/sing-box/config.json
Restart=on-failure
RestartSec=10s
LimitNOFILE=infinity

[Install]
WantedBy=multi-user.target

启动trojan服务

systemctl start sing-box.service
systemctl enable sing-box.service
  1. systemctl start sing-box.service
  2. systemctl enable sing-box.service
systemctl start sing-box.service
systemctl enable sing-box.service

部署nginx

2.1 使用OneinStack安装nginx

wget -c http://mirrors.linuxeye.com/oneinstack-full.tar.gz && tar xzf oneinstack-full.tar.gz && ./oneinstack/install.sh --nginx_option 1 --iptables  --ssh_port 22
  1. wget -c http://mirrors.linuxeye.com/oneinstack-full.tar.gz && tar xzf oneinstack-full.tar.gz && ./oneinstack/install.sh --nginx_option 1 --iptables --ssh_port 22
wget -c http://mirrors.linuxeye.com/oneinstack-full.tar.gz && tar xzf oneinstack-full.tar.gz && ./oneinstack/install.sh --nginx_option 1 --iptables  --ssh_port 22

等待脚本执行结束后编辑nginx配置文件

vi /usr/local/nginx/conf/nginx.conf
  1. vi /usr/local/nginx/conf/nginx.conf
vi /usr/local/nginx/conf/nginx.conf

在配置文件最后一行增加以下内容并保存

stream {
 log_format slog '$remote_addr - [$time_local] '
                 '$ssl_protocol/$ssl_cipher $ssl_server_name '
                 '$status $bytes_sent $bytes_received';

  server {
    listen 443 ssl reuseport;
    access_log /data/wwwlogs/trojan_nginx.log slog;

    ssl_preread on;
    ssl_certificate /data/ssl/trojan.pem;
    ssl_certificate_key /data/ssl/trojan.key;
    ssl_session_tickets         off;
    ssl_session_timeout         1440m;
    ssl_session_cache           shared:SSL:8m;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-256-GCM-SHA384:TLS13-AES-128-GCM-SHA256:TLS-CHACHA20-POLY1305-SHA256:TLS-AES-256-GCM-SHA384:TLS-AES-128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;

    proxy_protocol  on;
    proxy_pass 127.0.0.1:8443;
  }
}
  1. stream {
  2. log_format slog '$remote_addr - [$time_local] '
  3. '$ssl_protocol/$ssl_cipher $ssl_server_name '
  4. '$status $bytes_sent $bytes_received';
  5. server {
  6. listen 443 ssl reuseport;
  7. access_log /data/wwwlogs/trojan_nginx.log slog;
  8. ssl_preread on;
  9. ssl_certificate /data/ssl/trojan.pem;
  10. ssl_certificate_key /data/ssl/trojan.key;
  11. ssl_session_tickets off;
  12. ssl_session_timeout 1440m;
  13. ssl_session_cache shared:SSL:8m;
  14. ssl_protocols TLSv1.2 TLSv1.3;
  15. ssl_prefer_server_ciphers on;
  16. ssl_ciphers TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-256-GCM-SHA384:TLS13-AES-128-GCM-SHA256:TLS-CHACHA20-POLY1305-SHA256:TLS-AES-256-GCM-SHA384:TLS-AES-128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
  17. proxy_protocol on;
  18. proxy_pass 127.0.0.1:8443;
stream {
 log_format slog '$remote_addr - [$time_local] '
                 '$ssl_protocol/$ssl_cipher $ssl_server_name '
                 '$status $bytes_sent $bytes_received';

  server {
    listen 443 ssl reuseport;
    access_log /data/wwwlogs/trojan_nginx.log slog;

    ssl_preread on;
    ssl_certificate /data/ssl/trojan.pem;
    ssl_certificate_key /data/ssl/trojan.key;
    ssl_session_tickets         off;
    ssl_session_timeout         1440m;
    ssl_session_cache           shared:SSL:8m;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-256-GCM-SHA384:TLS13-AES-128-GCM-SHA256:TLS-CHACHA20-POLY1305-SHA256:TLS-AES-256-GCM-SHA384:TLS-AES-128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;

    proxy_protocol  on;
    proxy_pass 127.0.0.1:8443;
  }
}

如果不想使用443端口,可将listen 443处修改为其它未占用的端口号

2.2 配置证书

创建证书目录

mkdir -p /data/ssl
  1. mkdir -p /data/ssl
mkdir -p /data/ssl

将申请的证书文件与秘钥文件改名为trojan.pem、trojan.key,并放置于/data/ssl目录,如果有部署能力的话,强烈推荐使用acme.sh进行自动部署。

2.3 启动nginx服务

systemctl start nginx.service
systemctl enable nginx.service
  1. systemctl start nginx.service
  2. systemctl enable nginx.service
systemctl start nginx.service
systemctl enable nginx.service

系统配置

3.1 关闭FirewallD服务

systemctl stop firewalld
systemctl disable firewalld
  1. systemctl stop firewalld
  2. systemctl disable firewalld
systemctl stop firewalld
systemctl disable firewalld

3.2 配置iptables防火墙

vi /etc/sysconfig/iptables
  1. vi /etc/sysconfig/iptables
vi /etc/sysconfig/iptables

修改防火墙配置文件规则如下

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p udp -m udp --dport 443 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
  1. *filter
  2. :INPUT ACCEPT [0:0]
  3. :FORWARD ACCEPT [0:0]
  4. :OUTPUT ACCEPT [0:0]
  5. -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
  6. -A INPUT -p icmp -j ACCEPT
  7. -A INPUT -i lo -j ACCEPT
  8. -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
  9. -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
  10. -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
  11. -A INPUT -p udp -m udp --dport 443 -j ACCEPT
  12. -A INPUT -j REJECT --reject-with icmp-host-prohibited
  13. -A FORWARD -j REJECT --reject-with icmp-host-prohibited
  14. COMMIT
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p udp -m udp --dport 443 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

开启防火墙

systemctl enable iptables
systemctl restart iptables
  1. systemctl enable iptables
  2. systemctl restart iptables
systemctl enable iptables
systemctl restart iptables

(注:如果你的服务器提供商在web管理页面有防火墙,应前往开启TCP的443端口)

3.3 优化内核参数

vi /etc/sysctl.conf
  1. vi /etc/sysctl.conf
vi /etc/sysctl.conf

在文件最下方输入以下内容后保存

fs.file-max = 65535
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_slow_start_after_idle = 0
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_keepalive_time = 65
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.ip_local_port_range = 1024 65500
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 262144
net.core.netdev_max_backlog = 262144
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_fastopen = 2
  1. fs.file-max = 65535
  2. net.ipv4.tcp_synack_retries = 2
  3. net.ipv4.tcp_syn_retries = 2
  4. net.ipv4.tcp_slow_start_after_idle = 0
  5. net.ipv4.tcp_syncookies = 1
  6. net.ipv4.tcp_tw_reuse = 1
  7. net.ipv4.tcp_keepalive_time = 65
  8. net.ipv4.tcp_fin_timeout = 1
  9. net.ipv4.tcp_max_tw_buckets = 5000
  10. net.ipv4.ip_local_port_range = 1024 65500
  11. net.core.somaxconn = 65535
  12. net.ipv4.tcp_max_syn_backlog = 262144
  13. net.core.netdev_max_backlog = 262144
  14. net.core.rmem_max = 16777216
  15. net.core.wmem_max = 16777216
  16. net.core.wmem_default = 8388608
  17. net.core.rmem_default = 8388608
  18. net.ipv4.tcp_timestamps = 0
  19. net.ipv4.tcp_mem = 94500000 915000000 927000000
  20. net.ipv4.tcp_max_orphans = 3276800
  21. net.ipv4.tcp_fastopen = 2
fs.file-max = 65535
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_slow_start_after_idle = 0
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_keepalive_time = 65
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.ip_local_port_range = 1024 65500
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 262144
net.core.netdev_max_backlog = 262144
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_fastopen = 2

执行 sysctl -p 使配置立即生效

至此,一台透明代理服务器搭建完成


支持trojan协议的客户端,请参考:
https://www.v2ray.com/awesome/tools.html


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK