小计 -- nginx/haproxy reverse proxy 解决公司专线没备案IP被封80和443端口的问题

最近,公司搬迁,专线更随着更换了。没有想到,新申请的专线是要备案的,不然专线IP对外的80和443是被封掉的。但备案基本上是要一周时间,这样,公司内部的exchange和OA服务器因为没有80和443端口而无法在公司外使用。解决方案是使用nginx或HAproxy反向代理。

The solution

  1. 在Firewall上设置端口映射,把专线对外IP的TCP 2443 map到 443,TCP 1080 map 到 80.
  2. 在Ucloud云主机上安装nginx ,reverse proxy 到公司专线的TCP 2443和 1080
  3. 在DNS上更改相应的A记录,指向新的nginx reverse proxy完成配置

Nginx reverse proxy configration

server {
       listen       80;
       server_name mail.corp.example.com autodiscover.corp.example.com;
       return 301 https://$host$request_uri;

}

server {
        listen   443 ssl;
        listen   [::]:443 ssl;
        client_max_body_size 0;
        ssl_certificate /etc/nginx/conf.d/ssl/mail.corp.example.com.crt;
        ssl_certificate_key /etc/nginx/conf.d/ssl/mail.corp.example.com.key;
        server_name mail.corp.example.com cas.corp.example.com autodiscover.corp.example.com;
        ssl_session_timeout  10m;
        access_log  /opt/log/nginx/mail.corp.example.com.log  main;
        error_log  /opt/log/nginx/mail.corp.example.com.error.log;
        open_log_file_cache max=100;
        location / {
            proxy_ssl_server_name on;
            proxy_ssl_session_reuse off;
            proxy_ssl_verify off;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header Host $http_host;
            proxy_set_header cookie $http_cookie;
            proxy_set_header Proxy-Connection "";
            proxy_http_version 1.1;
            proxy_pass https://xxx.xxx.xxx.xxx:2443;
        }
}

HAproxy reverse proxy configration

上面的配置有一个问题,用手机访问没有问题,但如果客户端是outlook2013以前的版本,那是无法认证通过的。因为 nginx 免费版本不支持 RPC over http.但是haproxy支持 RPC over http, 下面是用haproxy来实现的haproxy.conf配置文件:

global
    log /dev/log    local0
    log /dev/log    local1 notice
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon
    stats socket /var/lib/haproxy/stats
defaults
    mode                    http
    log                     global
#    option                  httplog
    option                  dontlognull
    option http-server-close
#    option forwardfor       except 127.0.0.0/8
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000
frontend ft_http
    bind            *:80
    mode            http
    log             global
    redirect scheme https if !{ ssl_fc }
frontend ft_https
    bind            *:443
    mode            tcp 
    log             global
    use_backend     example_com
backend example_com
    mode            tcp
    server ip_xxx.xxx.xxx.xxx_2443 xxx.xxx.xxx.xxx:2443 weight 1 maxconn 3000 check

在上面的配置文件中,我把所有http 转向了https,并用mode tcp 模式,在4层上,把所有tcp 443端口的数据转发到公司外网IP xxx.xxx.xxx.xxx:2443端口上。

Relevant matters needing attentions

  1. proxy_ssl_server_name on; 要记得加上,不然主机头会丢失,如果后端IIS有多个站点的话,会出404.
  2. windows 上的exchange 的证书要转换成nginx 可以识别的证书,放到nginx reserve proxy上。用haproxy的tcp mode方式没有这个问题,可以不用做证书转换。
  3. 上面的nginx配置,用手机访问没有问题,但如果客户端是outlook2013或以前的版本,那是无法认证通过的。因为 nginx 不收费版本不支持 RPC over http.但是haproxy支持 RPC over http, 大家可以用haproxy来实现。
    相关链接
坚持原创技术分享,您的支持将鼓励我继续创作!