0x01 前言
继续折腾我的服务器。我使用许多开源软件监控我家里的网络和服务器状态,这些软件都包含有敏感的数据。可是我又想从家以外的地方访问这些数据,同时我不希望每次都通过VPN连接到家里的网络。
还好这些服务大多是通过网页进行浏览、操作的(B/S架构)。因此我可以使用nginx进行反向代理,让我能在任何地方访问。为什么要用反向代理?因为我将所有能通过nginx处理的软件都放置在一台内部域名为web.t.com的虚拟机上,数据库则在sql.t.com这台虚拟机上,可是ntopng这软件需要装在网关虚拟机上。
在内部配置好后还需要进行端口的转发,详细的iptables端口转发可以点击这里参考我之前写的文章(使用iptables进行端口转发)
等配置完成后,开放外部访问端口,这样我就能从任何地方访问这些服务了。我能访问,说明别人也可以,这样是极不安全的。那么还需要加上HTTPS和证书认证。
0x01 DNS
因为家里用的是电信宽带,没有固定IP,因此每一次拨号后的IP地址都会改变,这样就需要DDNS(动态域名解析)。这种服务有好多种选择,如果你用的是极路由,那么里面就又DNSPoD的DDNS服务,当然还有花生壳的DDNS服务。但这些的TTL都在600(10分钟)左右,TTL太大了!如果你喜欢折腾,可以点击下面的链接,使用阿里云的云解析,购买一个付费包,一年也就30块左右,TTL最小可达1秒!
域名结构如下:
home.proj.org.cn #主域名 |-- cacti.home.proj.org.cn #用于访问cacti |-- ntopng.home.proj.org.cn #用于访问ntopng
其中home.proj.org.cn由DDNS脚本每分钟进行更新,其他两个域名用CNAME指向home.proj.org.cn,TTL都是30(30秒)。
这样就能保证可以通过域名访问服务器了。
0x02 防火墙与转发
我的网关是由Centos7的iptables控制流量的出入,所以需要手动开放一个端口和设定转发。
假定我选用的端口是6000,那么放行的命令如下:
[root@base ~]# iptables -A INPUT -p tcp --dport 6000 -j ACCEPT
我需要将所有从这个端口传入的数据转发到web.t.com(10.1.1.14)这台虚拟机的443端口上,命令如下:
[root@base ~]# iptables -t nat -A PREROUTING -p tcp -m tcp --dport 6000 -j DNAT --to-destination 10.1.1.14:443
转发出去还需要能接收,并且通过网关转发出去,命令如下:
[root@base ~]# iptables -t nat -A POSTROUTING -p tcp -m tcp --dport 6000 -j SNAT --to-source 10.1.1.1
完成后还需要保存到iptables文件和重新加载:
#保存 [root@base ~]# service iptables save #重新加载 [root@base ~]# systemctl restart iptables.service
完成以上步骤后就可以通过 [domain:port] 的形式访问了。当然如果你还没有完成nginx的配置,是得不到任何响应的。
0x03 自签数字证书
使用过startssl免费证书的朋友应该都是用数字证书认证自己身份的,这里也是通过这种方式进行认证。这正是因为用户名+密码的方式及其不安全。
签发数字证书的过程比较繁琐,如下:
#自签发CA证书 生成CA密钥-->使用CA密钥签发CA证书 #用于部署在服务器上的web服务 生成服务器密钥-->使用服务器密钥生成CSR文件-->使用CSR文件与CA证书签发服务器证书 #用于生成.p12文件用于导入系统,访问网站时进行认证 生成用户密钥-->使用用户密钥生成CSR文件-->使用CSR文件与CA证书签发用户证书
注意!上面的服务器证书可以省略,但前提是你要有一个有效的数字证书。也就是说可以替换为你自己的数字证书,不影响登录时的证书认证。
0x03.1 自签发CA证书
#进入openssl文件夹 cd /etc/pki/CA/private #生成CA密钥 openssl genrsa -out cakey.pem 2048 #进入CA文件夹 cd /etc/pki/CA/ #使用CA密钥签发CA证书 openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3655
注意以下内容,其实自签发的证书也不需要太过正规:
[root@base CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3655 You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- #国家简写,两位字母 Country Name (2 letter code) [XX]:CN #州或省的全称 State or Province Name (full name) []:HongKong #城市的全称 Locality Name (eg, city) [Default City]:HongKong #组织或公司的全称 Organization Name (eg, company) [Default Company Ltd]:Odin #部门全称 Organizational Unit Name (eg, section) []:Odin IT #常用名,一般写域名或个人名称。我一般写通配符域名 Common Name (eg, your name or your server's hostname) []:OdinCA #联系邮箱 Email Address []:[email protected]
0x03.2 服务器证书
如果你不需要服务器证书,可以跳过这一步。
#生成服务器密钥 openssl genrsa -out self-issued.home.proj.org.cn.key 2048 #使用服务器密钥生成CSR文件 openssl req -new -key self-issued.home.proj.org.cn.key -out self-issued.home.proj.org.cn.csr #使用CSR文件与CA证书签发服务器证书 openssl ca -in self-issued.home.proj.org.cn.csr -out self-issued.home.proj.org.cn.crt -days 3650
注意!期间需要输入密码,如果你打算将证书用于web服务器或其他服务,如果重新加载服务或重启服务,都需要手动输入密码才能完成加载!如果不希望每次都手动输入密码,可以按两次回车设为空密码。
在最后一步可能出现如下错误:
[root@base CA]# openssl ca -in self-issued.home.proj.org.cn.csr -out self-issued.home.proj.org.cn.crt -days 3650 Using configuration from /etc/pki/tls/openssl.cnf /etc/pki/CA/index.txt: No such file or directory unable to open '/etc/pki/CA/index.txt' 140219025528736:error:02001002:system library:fopen:No such file or directory:bss_file.c:398:fopen('/etc/pki/CA/index.txt','r') 140219025528736:error:20074002:BIO routines:FILE_CTRL:system lib:bss_file.c:400:
请手动touch一个文件:
[root@base CA]# touch /etc/pki/CA/index.txt
还有一个错误如下:
[root@base CA]# openssl ca -in self-issued.home.proj.org.cn.csr -out self-issued.home.proj.org.cn.crt -days 3650 Using configuration from /etc/pki/tls/openssl.cnf /etc/pki/CA/serial: No such file or directory error while loading serial number 140559699199904:error:02001002:system library:fopen:No such file or directory:bss_file.c:398:fopen('/etc/pki/CA/serial','r') 140559699199904:error:20074002:BIO routines:FILE_CTRL:system lib:bss_file.c:400:
在这个文件里添加两个字符即可:
[root@base CA]# echo '00' > /etc/pki/CA/serial
完成后的记录如下:
[root@base CA]# openssl ca -in self-issued.home.proj.org.cn.csr -out self-issued.home.proj.org.cn.crt -days 3650 Using configuration from /etc/pki/tls/openssl.cnf Check that the request matches the signature Signature ok Certificate Details: Serial Number: 0 (0x0) Validity Not Before: Aug 29 17:47:30 2016 GMT Not After : Aug 27 17:47:30 2026 GMT Subject: countryName = CN stateOrProvinceName = HongKong organizationName = Odin organizationalUnitName = Odin IT commonName = OdinCA X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: 45:18:7C:39:C6:82:11:A4:0C:F0:30:6C:7E:8E:B5:08:0E:D7:06:34 X509v3 Authority Key Identifier: keyid:05:2D:FA:D8:26:06:41:F0:EC:5D:1A:B7:9C:E6:36:02:87:B2:27:A4 Certificate is to be certified until Aug 27 17:47:30 2026 GMT (3650 days) Sign the certificate? [y/n]:y 1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated
0x03.3 用户.p12证书
具体步骤和生成服务器证书一致,如下:
#生成用户密钥 openssl genrsa -out self-issued.home.proj.org.cn_client.key 2048 #使用用户密钥生成CSR文件 openssl req -new -key self-issued.home.proj.org.cn_client.key -out self-issued.home.proj.org.cn_client.csr #使用CSR文件与CA证书签发用户证书 openssl ca -in self-issued.home.proj.org.cn_client.csr -out self-issued.home.proj.org.cn_client.crt -days 3650 #使用用户证书和用户密钥生成p12文件 openssl pkcs12 -export -clcerts -in self-issued.home.proj.org.cn_client.crt -inkey self-issued.home.proj.org.cn_client.key -out self-issued.home.proj.org.cn_client.p12
如果你跳过了上面的服务器证书部分,那么在这一步会遇到两个错误,解决办法请在服务器证书部分查找。
如果你没跳过上面的服务器证书部分,那么在这一步会遇到另一个错误:
[root@base CA]# openssl ca -in self-issued.home.proj.org.cn_client.csr -out self-issued.home.proj.org.cn_client.crt -days 3650 Using configuration from /etc/pki/tls/openssl.cnf Check that the request matches the signature Signature ok Certificate Details: Serial Number: 1 (0x1) Validity Not Before: Aug 29 17:50:03 2016 GMT Not After : Aug 27 17:50:03 2026 GMT Subject: countryName = CN stateOrProvinceName = HongKong organizationName = Odin organizationalUnitName = Odin IT commonName = OdinCA X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: 76:C0:DA:CD:3C:80:BC:C6:32:DF:1A:25:A8:71:C2:41:A9:C2:E3:AF X509v3 Authority Key Identifier: keyid:05:2D:FA:D8:26:06:41:F0:EC:5D:1A:B7:9C:E6:36:02:87:B2:27:A4 Certificate is to be certified until Aug 27 17:50:03 2026 GMT (3650 days) Sign the certificate? [y/n]:y failed to update database TXT_DB error number 2
最后一行出现了:
TXT_DB error number 2
将这个文件里的内容清空即可:
/etc/pki/CA/index.txt
最后一步是将上面生成的self-issued.home.proj.org.cn_client.key和self-issued.home.proj.org.cn_client.crt合并为一个p12文件:
openssl pkcs12 -export -clcerts -in self-issued.home.proj.org.cn_client.crt -inkey self-issued.home.proj.org.cn_client.key -out self-issued.home.proj.org.cn_client.p12
注意!请问你的p12文件加上一个可靠的密码!
请点击下面的链接继续查看:使用自签发证书与端口转发 安全地访问内网服务 二