近日工作上有这样一个需求,某学校没有公网地址,但公司的业务对接需要公网地址的一个端口,而这边另一个学校有公网地址,可做映射。要求是在不影响业务正常运行的情况下实现本次映射。对端对接地址是:10.0.0.2 提供了一台可操作服务器 10.0.0.3 ,本地我提供了可操作服务器:10.100.101.115,公网 nat 映射一应俱全。仔细思考过后,决定使用OpenVPN。实现如下:
服务器端
添加epel源
1 | yum install epel-release |
安装openvpn easy-rsa firewalld
任选其一,以防火墙为基础的端口转发
- CentOS 6.5 iptables #这里对端提供的服务器是 CentOS 6.5,不支持firewalld
- CentOS 7 firewalld #本地服务器防火墙
1 | yum -y install openvpn easy-rsa firewalld |
配置easy-rsa
在这一步生成一些证书
- CA证书
- 服务器证书和密钥
- Diffie-Hellman密钥
- 客户端证书和密钥
1 | cp -r /usr/share/easy-rsa/ /etc/openvpn/ |
确保vars
中以下参数正确
1 | export KEY_SIZE=2048 |
生成服务器证书密钥和客户端证书密钥
1 | source ./vars #初始化证书授权中心 |
配置OpenVPN服务端
你可以从/usr/share/doc/openvpn-*.*.*/sample/sample-config-files
中拷贝出配置文件(..*是openvpn版本),也可以自己新建配置文件,
1 | cd /etc/openvpn/ |
1 | local 0.0.0.0 #监听地址 |
设置允许IP转发,在/etc/sysctl.conf
文件中添加一行net.ipv4.ip_forward = 1
sysctl -p
配置firewalld端口转发
1 | #启动防火墙 |
- 为什么这里添加1194和8080端口是写成openvpn和webcache,因为这两个服务的端口已经被写入linux系统了,映射服务名即可映射对应端口,便于识别,但也可以直接使用端口8080 2012 9090
1 | cat /etc/services | grep 8080 |
- 直接使用端口,这样的好处是可以自定义端口,还可以指定通过的协议。
1 | firewall-cmd --permanent --zone=public --add-port=1194/tcp |
- 在不停止服务的情况下重新加载防火墙
1 | firewall-cmd --reload |
查看防火墙配置
1 | public |
firewalld和OpenVPN开机启动
1 | ##防火墙设置开机启动 |
客户端设置
安装openvpn iptables
1 | yum install openvpn iptables nginx |
配置OpenVPN客户端
你可以从/usr/share/doc/openvpn-*.*.*/sample/sample-config-files
中拷贝出配置文件(..*是openvpn版本),也可以自己新建配置文件,
1 | cd /etc/openvpn/ |
- 拷贝服务器端的/etc/openvpn/easy-rsa/{ca.crt,client.crt,client.key}到客户端的主机 /etc/openvpn/keys/目录下,没有就新建一个
客户端做反向代理
1 | yum install |
配置iptables端口转发
1 | service iptables start |
iptables和nginx开机启动
1 | service nginx start #启动反向代理 |
常用命令
1 | /etc/init.d/iptables start # 开启防火墙,或者service iptables start,以下同理 |
至此访问服务器端映射的公网地址+端口 http://ip:port/ 即可访问没有公网的那台主机的服务
要求达成。