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秒!

通过python将阿里云DNS解析作为DDNS使用

域名结构如下:

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免费证书的朋友应该都是用数字证书认证自己身份的,这里也是通过这种方式进行认证。这正是因为用户名+密码的方式及其不安全。

1472490529

签发数字证书的过程比较繁琐,如下:

#自签发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文件加上一个可靠的密码!

请点击下面的链接继续查看:使用自签发证书与端口转发 安全地访问内网服务 二