前言:由于项目部署的的环境是内外网隔离的模式,把网络分成内网和外网两部分。cas服务器及客户端部署在内网,通过端口映射的方式把服务端口向外网开放,外网用户只能通过外网IP访问客户端。因此会存在一个问题,我们的客户端配置casServer地址及回调的url使用的是内网的。用户通过外网ip访问后,跳转的cas登录地址为内网的地址,因此是访问失败的。而如果配置成外网ip的话,通过内网ip访问也是失败的,浏览器显示的是外网的地址。
我们的需求是,通过外网ip访问的客户端业务系统,重定向到外网的cas服务器,登录后跳转回来外网ip的业务系统,内网同样的需求。查阅资料发现,通过改源码去动态根据访问ip修改cas服务器的地址及客户端回调地址的方法,一是费时且找不到可用资料,二是业务系统太多,改了一套其它都得改,造成大面积的客户端业务系统更新,三是部分业务系统不是自己公司开发的,需要协调第三方去修改。因此采用通过反向代理方式处理cas单点登录内外网双ip访问的问题。实践证明,只需要短短半小时便解决问题。
一、通过apache进行反向代理
1.下载apache的安装包及apr的安装包
官网下载Apache的源码包,http://httpd.apache.org/
这里下载的版本是:httpd-2.4.41.tar.gz
到http://apr.apache.org/下载APR源码包和APR-util源码包
这里下载的版本分别是:apr-1.6.5.tar.gz、apr-util-1.6.1.tar.gz
把httpd-2.4.41.tar.gz、apr-1.6.5.tar.gz、apr-util-1.6.1.tar.gz上传到/opt/tools目录下
2.解压apr及apr-util源码包
# cd /opt/tools
# tar -zxvf httpd-2.4.41.tar.gz
# tar -zxvf apr-1.6.5.tar.gz
# tar -zxvf apr-util-1.6.1.tar.gz
3.安装相关组件
# yum -y install gcc gcc-c++ make
# yum -y install expat-devel
# yum -y install pcre-devel
# yum -y install mod_ssl openssl-devel
# yum -y install libtool-ltdl-devel
4.安装apr
# cd /opt/tools/apr-1.6.5
# ./configure --prefix=/usr/local/apr
# make
# make install
5.安装apr-util
# cd /opt/tools/apr-util-1.6.1
# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
# make
# make install
6.安装httpd
# cd /opt/tools/httpd-2.4.41
# ./configure --prefix=/opt/app/apache24 --enable-so --enable-ssl --enable-rewrite --enable-cgi --enable-cgid --enable-modules=most --enable-mods-shared=most --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util
# make
# make install
7.启动命令
为了方便以后使用apache可以将执行路径添加的PATH中,这样下次执行命令时,就不需要使用路径
# echo PATH=$PATH:/opt/app/apache24/bin/apachectl >> /etc/profile
# source /etc/profile
启动:
# apachectl start
停止:
# apachectl stop
重启:
# apachectl restart
8.修改httpd.conf配置文件
# vi /opt/app/apache24/conf/httpd.conf
把#ServerName www.example.com:80前面的#号去掉,并把www.example.com修改为内网ip加端口,保存退出
重启apache
# apachectl restart
9.配置反向代理
# vi /opt/app/apache24/conf/httpd.conf
在httpd.conf中把下三行配置放开(前面的#号去掉)
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
Include conf/extra/httpd-vhosts.conf
10.在conf/extra/httpd-vhosts.conf中配置虚拟主机(反向代理)
# vi /opt/app/apache24/conf/extra/httpd-vhosts.conf
在文件末尾添加以下配置:
# 外网地址
<VirtualHost *:8080>
ServerName 192.168.4.120
ServerAlias 192.168.4.120
ErrorLog "logs/error_log"
CustomLog "logs/access_log" common
# 关闭正向代理
ProxyRequests Off
# 反向代理时不保留原始Request中的HOST(即代理服务器自身Host)
ProxyPreserveHost Off
## 把服务器响应中的内网IP地址改成外网地址
Substitute "s|127.0.0.1:8083/dognet|192.168.4.120/dognet|n"
Substitute "s|127.0.0.1:8443/cas|192.168.4.120/cas|n"
Substitute "s|127.0.0.1:8081/ywjk|192.168.4.120/ywjk|n"
# SSO反向代理
ProxyPass /cas http://127.0.0.1:8443/cas
ProxyPassReverse /cas http://127.0.0.1:8443/cas
# Web应用反向代理
ProxyPass /dognet http://127.0.0.1:8083/dognet
ProxyPassReverse /dognet http://127.0.0.1:8083/dognet
# Web应用反向代理
ProxyPass /ywjk http://127.0.0.1:8081/ywjk
ProxyPassReverse /ywjk http://127.0.0.1:8081/ywjk
</VirtualHost>
11.重启apache
# apachectl restart
12.springboot客户端配置的是内网的cas服务器地址及客户端地址
#cas配置
cas:
client-name: ywjk
#测试工作机地址
server:
url: http://127.0.0.1:8443/cas
#本机ip地址
project:
url: http://127.0.0.1:8081/ywjk/
13.测试
通过访问192.168.4.120:8080/ywjk时,重定向到http://192.168.4.120:8080/cas/login?service=http%3A%2F%2F127.0.0.1%3A8081%2Fywjk%2F%2Fcallback%3Fclient_name%3Dywjk,登录后跳转回192.168.4.120:8080/ywjk。而通过127.0.0.1:8080/ywjk访问时,重定向到http://127.0.0.1:8080/cas/login?service=http%3A%2F%2F127.0.0.1%3A8081%2Fywjk%2F%2Fcallback%3Fclient_name%3Dywjk,登录后跳转回127.0.0.1:8080/ywjk。至此,内外网双ip问题得以解决。