给GitLab设置中转机
Pros: 优化链路,实际例子中拥有一个高配的机器跑GitLab,但路由绕美不理想,用直连线路机器中转。
Cons: 中转机器的ssh将无法跑在22端口上,需要一个新的端口。
0x0 gitlab机器设置
- 关闭gitlab自带的nginx
vim /etc/gitlab/gitlab.rb
# 关闭 nginx
nginx['enable'] = false
# 分配用户组
web_server['external_users'] = ['www-data']
# 关闭 Let's Encrypt 自动证书
letsencrypt['enable'] = false
# 设置 external_url 为最终站点链接
external_url = 'https://git.public.domain'
- 配置一个自己的nginx
apt install nginx
vim /etc/nginx/sites-available/git.public.domain
upstream gitlab-workhorse {
    server unix:/var/opt/gitlab/gitlab-workhorse/sockets/socket fail_timeout=0;
}
server {
    server_name git.public.domain;
    server_tokens off;
    root /opt/gitlab/embedded/service/gitlab-rails/public;
    access_log  /var/log/nginx/gitlab_access.log;
    error_log   /var/log/nginx/gitlab_error.log;
    set_real_ip_from <proxy-server-ip>;
    # 自定义端口
    listen GITLAB_PORT;
    location / {
        client_max_body_size 0;
        gzip off;
        proxy_read_timeout      300;
        proxy_connect_timeout   300;
        proxy_redirect          off;
        proxy_http_version 1.1;
        proxy_set_header    Host                $http_host;
        proxy_set_header    X-Real-IP           $remote_addr;
        proxy_set_header    X-Forwarded-Ssl     on;
        proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
        proxy_set_header    X-Forwarded-Proto   $scheme;
        proxy_pass http://gitlab-workhorse;
    }
}
- 配置工作站点的防火墙
ufw allow ssh
ufw allow ufw allow from <proxy-server-ip> to any port <GITLAB_PORT>
ufw enable
0x1 中转机设置
- nginx转发http流量
apt install nginx
vim /etc/nginx/sites-available/git.public.domain
server {
    server_name git.public.domain;
    listen 127.0.0.1:8082 proxy_protocol;
    listen 127.0.0.1:8083 proxy_protocol http2;
    location / {
        proxy_set_header    Host                $http_host;
        proxy_set_header    X-Real-IP           $proxy_protocol_addr;
        proxy_set_header    X-Forwarded-Ssl     on;
        proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
        proxy_set_header    X-Forwarded-Proto   $scheme;
        client_max_body_size 0;
        gzip off;
        proxy_read_timeout      300;
        proxy_connect_timeout   300;
        proxy_pass http://<gitlab-server-ip>:<GITLAB_PORT>;
    }
}
- 前级SNI分流
(略)。懂的都懂。
- 更改ssh端口
vim /etc/ssh/sshd_config
Port <new-ssh-port>
ufw allow <new-ssh-port>
systemctl restart sshd
- ufw转发ssh端口流量
vim /etc/default/ufw
DEFAULT_FORWARD_POLICY = "ACCEPT"
vim /etc/ufw/sysctl.conf
net.ipv4.ip_forward=1
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A PREROUTING -i eth0 -d <proxy-server-ip> -p tcp --dport 22 -j DNAT --to-destination <gitlab-server-ip>:22
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT
systemctl restart ufw
# 检查设置
iptables -t nat -L -n -v
- 验证ssh连接
ssh -T git@git.public.domain
# Output
Welcome to GitLab, @user!
        License: 
        
          CC BY 4.0