admin 发布的文章

  1. 前往 homebrew-core/Formula · Homebrew 官方仓库 找到要下载的软件,可以点击 Find 按钮输入名字查找。
  2. 点击找到的文件后再点击 History 按钮来查找历史版本。
  3. 选中想要的版本,然后点击 ... | View file 查看文件。
  4. 右键点 Raw 按钮,复制链接地址。
  5. 打开 RAW文件, 将这个rb原文件下载下来。
  6. 替换/usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula/ 下的文件。
  7. 再次执行brew install

官方仓库地址:https://github.com/Homebrew/homebrew-core/tree/master/Formula

网上经常说的直接 brew install 某个 rb的网址是不行的,会报错,类似下面这样:

Installation of tmux from a GitHub commit URL is unsupported! `brew extract tmux` to a stable tap on GitHub instead.

这是因为Windows 10 连接IKEv2后,默认启用了 splittunneling 选项。我们只要把 splittunneling 关闭即可。
操作如下:

1、使用管理员身份运行PowerShell;

2、输入命令:

get-vpnconnection

Name                  : test_IKEv2
ServerAddress         : vpn.xxx.net
AllUserConnection     : False
Guid                  : {A0E89525-9E64-43DE-8ECC-5E2DFC067C0D}
TunnelType            : Ikev2
AuthenticationMethod  : {MachineCertificate}
EncryptionLevel       : Required
L2tpIPsecAuth         :
UseWinlogonCredential : False
EapConfigXmlStream    :
ConnectionStatus      : Connected
RememberCredential    : True
SplitTunneling        : True
DnsSuffix             :
IdleDisconnectSeconds : 0

然后找到对应那个vpn连接名,比如我这里是"test_IKEv2";

3、然后输入命令:

set-vpnconnection "test_IKEv2" -splittunneling $false

记得把双引号里面的内容自行替换掉,不要照抄。

4、最后再输入:

get-vpnconnection

Name                  : test_IKEv2
ServerAddress         : vpn.xxx.net
AllUserConnection     : False
Guid                  : {A0E89525-9E64-43DE-8ECC-5E2DFC067C0D}
TunnelType            : Ikev2
AuthenticationMethod  : {MachineCertificate}
EncryptionLevel       : Required
L2tpIPsecAuth         :
UseWinlogonCredential : False
EapConfigXmlStream    :
ConnectionStatus      : Connected
RememberCredential    : True
SplitTunneling        : False
DnsSuffix             :
IdleDisconnectSeconds : 0

检查看split tunneling那一项是不是False,不是的话再试一次。像这样就成功了。

上一文讲到 IKEv2的配置,当时使用的是Windows 7作为客户端。然而使用Windows 10作客户端时,拨号时会产生“策略匹配错误”,在事件管理器里面查询,会得到一个13868的错误号。

这是因为Windows客户端提出了一个弱Diffie-Hellman(DH)组(1024位MODP)。除非用户明确配置,否则strongSwan不再使用该组。

解决方法:

在 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Rasman\Parameters 底下新增:

名称:"NegotiateDH2048_AES256"
类型:"REG_DWORD"
值:"1"

保存退出即可。

一、软件安装

ipsec 与 l2tp,一般常见的操作系统都直接支持,不需要额外安装软件。所以在选择上优先考虑。

在Debian 10下面安装非常容易,执行以下命令:

apt-get install strongswan xl2tpd strongswan-pki

二、软件配置

StrongSwan 的配置主要为 ipsec.conf、strongswan.conf;
xl2tpd 的配置主要为 xl2tpd.conf、options.xl2tpd;

以下为四个配置文件样例:

1、ipsec.conf

config setup
    uniqueids=no
    charondebug="cfg 2, dmn 2, ike 2, net 0"

conn %default
    dpdaction=clear
    dpddelay=300s
    rekey=no
    left=%defaultroute
    leftfirewall=yes
    right=%any
    ikelifetime=60m
    keylife=20m
    rekeymargin=3m
    keyingtries=1
    auto=add

#######################################
# L2TP Connections
#######################################

conn L2TP-IKEv1-PSK
    type=transport
    keyexchange=ikev1
    authby=secret
    leftprotoport=udp/l2tp
    left=%any
    right=%any
    rekey=no
    forceencaps=yes

#######################################
# PSK Connections
#######################################

# Cisco IPSec
conn IKEv1-PSK-XAuth
    keyexchange=ikev1
    leftid=@lostend.com
    leftauth=psk
    rightauth=psk
    rightauth2=xauth
    leftsubnet=0.0.0.0/0
    rightsubnet=10.0.0.0/24
    rightsourceip=10.0.0.0/24

#######################################
# Certificate Connections
#######################################

conn windows7
    keyexchange=ikev2
    rekey=no
    leftauth=pubkey
    leftid=@lostend.com
    leftsubnet=0.0.0.0/0
    leftcert=server.cert.pem
    right=%any
    rightauth=rsa
    rightsourceip=10.0.0.0/24
    rightsendcert=never
    eap_identity=%any

include /var/lib/strongswan/ipsec.conf.inc

2、strongswan.conf

charon {
    load_modular = yes
    send_vendor_id = yes
    plugins {
        include strongswan.d/charon/*.conf
        attr {
            dns = 1.2.4.8, 119.29.29.29
        }
    }
}

include strongswan.d/*.conf

3、xl2tpd.conf

[global]
port = 1701
auth file = /etc/xl2tpd/l2tp-secrets
debug avp = yes
debug network = yes
debug state = yes
debug tunnel = yes
[lns default]
ip range = 10.1.0.2-10.1.0.254
local ip = 10.1.0.1
require chap = yes
refuse pap = yes
require authentication = yes
name = l2tpd
;ppp debug = yes
pppoptfile = /etc/ppp/options.xl2tpd
length bit = yes

如上配置中,因为开启了chap的验证,拒绝了pap验证。所以验证文件是 /etc/ppp/chap-secrets ,在使用l2tp连接时,需要用到这个文件进行用户校验。上面的 /etc/xl2tpd/l2tp-secrets 文件是没什么用的。

以下是 /etc/ppp/chap-secrets 用户验证文件的示例:

# Secrets for authentication using CHAP
# client        server  secret                  IP addresses

"test" "*" "testpassword" "*"

"test"是用户名,"testpassword"是密码。多个的话,每个一行分开填写。

4、options.xl2tpd

ipcp-accept-local
ipcp-accept-remote
ms-dns 1.2.4.8
ms-dns 119.29.29.29
noccp
auth
idle 1800
mtu 1460
mru 1460
lcp-echo-failure 10
lcp-echo-interval 60
connect-delay 5000

其中mtu,mru 需要根据实际情况填写,不确定的话,填写1280是比较保险的值。

创建好四个配置文件后将其复制到指定位置即可:

# Strongswan Configuration
sudo cp ipsec.conf /etc/ipsec.conf
sudo cp strongswan.conf /etc/strongswan.conf

# XL2TPD Configuration
sudo cp xl2tpd.conf /etc/xl2tpd/xl2tpd.conf
sudo cp options.xl2tpd /etc/ppp/options.xl2tpd

三、证书创建

对于 Windows、Android 等设备可能不支持某些登录方式,比如 IKEv2 PSK,这时需要创建证书,以支持使用 IKEv2 证书登录:

1、生成一个私钥,并基于这个私钥自己签一个 CA 证书:

# create CA certificate
ipsec pki --gen --outform pem > ca.key.pem
ipsec pki --self --in ca.key.pem --dn "C=CN, O=StrongSwan, CN=StrongSwan CA" --ca --outform pem > ca.cert.pem

2、创建服务器证书,并用我们刚才自签的 CA 证书给自己发一个服务器证书:

# create server certificate
ipsec pki --gen --outform pem > server.key.pem 
ipsec pki --pub --in server.key.pem | ipsec pki --issue --cacert ca.cert.pem --cakey ca.key.pem --dn "C=CN, O=StrongSwan, CN=lostend.com" --san="lostend.com" --flag serverAuth --flag ikeIntermediate --outform pem > server.cert.pem 

其中 --san 可以指定多个,但一般一个是域名,一个是外网 IP,如果经过了路由,那么只需要写本机的对外暴露网卡的 IP 即可。

--dn, --san,--flag 是一些客户端方面的特殊要求:

iOS 客户端要求 CN 也就是通用名必须是你的服务器的 URL 或 IP 地址;
Windows 7 不但要求了上面,还要求必须显式说明这个服务器证书的用途(用于与服务器进行认证),--flag serverAuth;
非 iOS 的 Mac OS X 要求了「IP 安全网络密钥互换居间(IP Security IKE Intermediate)」这种增强型密钥用法(EKU),--flag ikdeIntermediate;
Android 和 iOS 都要求服务器别名(serverAltName)就是服务器的 URL 或 IP 地址,--san。

3、创建客户端证书,然后用刚才自签的 CA 证书来签客户端证书:

ipsec pki --gen --outform pem > client.key.pem 
ipsec pki --pub --in client.key.pem | ipsec pki --issue --cacert ca.cert.pem --cakey ca.key.pem --dn "C=CN, O=StrongSwan, CN=Test" --outform pem > test.cert.pem 

看懂了服务器的,客户端的也就不难理解了。除了没有那一堆特殊要求别的都一样。

客户端证书可以每个客户端签一个,也可以让它们共用一个。是否多签看用途,一般用于区分设备。

4、生成 pkcs12 证书(可选)

安卓等设备是不支持直接导入客户端证书的,需要转换成 p12 格式,转换过程中需要输入两次密码,该密码为证书使用密码,导入时需要输入:

openssl pkcs12 -export -inkey client.key.pem -in test.cert.pem -name "Test" -certfile ca.cert.pem -caname "StrongSwan CA" -out test.cert.p12 

5、安装证书

创建完成后将证书复制到指定目录即可

sudo cp -r ca.cert.pem /etc/ipsec.d/cacerts/
sudo cp -r server.cert.pem /etc/ipsec.d/certs/
sudo cp -r server.key.pem /etc/ipsec.d/private/
sudo cp -r test.cert.pem /etc/ipsec.d/certs/
sudo cp -r client.key.pem /etc/ipsec.d/private/

CA 证书、客户端证书和 .p12 证书复制出来给客户端用。有几种 Android 配置还需要服务器证书(server.cert.pem)。

四、用户验证文件

ipsec.secrets 文件示例:

ipsec.secrets文件是需要复制到/etc/ipsec.secrets 位置的,很多网上的教程都是错的。这点需要划重点注意。

: PSK "testpassword"                                                                                                                                                                                                  
: RSA server.key.pem                                                                                                                                                                                              
test : EAP "testpassword"                                                                                                                                                                                            
test : XAUTH "testpassword"

在上面的例子中,创建了认证用户test和test的密码。在添加用户的时候,请注意在冒号(:)左右两边都需要一个空格。
上面定义的是四种认证方法。它们之间是遵循「各找各妈」的原则的,可以任意混搭。
每种认证方式找各自的认证内容,具体可以参考官方说明:

https://wiki.strongswan.org/projects/strongswan/wiki/Ipsecsecrets

五、linux转发配置

使用iptables 来进行转发:

sudo iptables -A INPUT -p udp --dport 1701 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 500 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 4500 -j ACCEPT
sudo iptables -t nat -A POSTROUTING -s 10.1.0.0/24 -o eth0 -j MASQUERADE
sudo iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth0 -m policy --dir out --pol none -j MASQUERADE
sudo iptables -A FORWARD -s 10.1.0.0/24 -j ACCEPT
sudo iptables -A FORWARD -s 10.0.0.0/24 -j ACCEPT

sudo vi /etc/sysctl.conf 
net.ipv4.ip_forward=1 
sudo sysctl -p

其中 10.1.0.0/24 和 10.0.0.0/24 就是ipsec.conf 和xl2tpd.conf 里面配置的子网网段。自己根据情况进行修改。
eth0 的网卡名也要根据自己的机器情况作修改。

至此,所以配置就完成了。重启ipsec和xl2tpd 生效

sudo /etc/init.d/ipsec restart
sudo /etc/init.d/xl2tpd restart

六、Windows 7 ikev2 认证配置

使用自带客户端(Agile):

导入证书:

  1. 开始菜单搜索「cmd」,打开后输入 mmc(Microsoft 管理控制台)。
  2. 「文件」-「添加/删除管理单元」,添加「证书」单元
  3. 证书单元的弹出窗口中一定要选「计算机账户」,之后选「本地计算机」,确定。
  4. 在左边的「控制台根节点」下选择「证书」-「个人」,然后选右边的「更多操作」-「所有任务」-「导入」打开证书导入窗口。
  5. 选择刚才生成的 test.cert.p12 文件。下一步输入私钥密码。下一步「证书存储」选「个人」。
  6. 导入成功后,把导入的 CA 证书剪切到「受信任的根证书颁发机构」的证书文件夹里面。
  7. 打开剩下的那个私人证书,看一下有没有显示「您有一个与该证书对应的私钥」,以及「证书路径」下面是不是显示「该证书没有问题」。
  8. 然后关闭 mmc,提示「将控制台设置存入控制台1吗」,选「否」即可。

至此,证书导入完成。

注意 千万不要双击 .p12 证书导入!因为那样会导入到当前用户而不是本机计算机中,ipsec 守护精灵是访问不了它的。

建立连接:

  1. 「控制面板」-「网络和共享中心」-「设置新的连接或网络」-「连接到工作区」-「使用我的 Internet 连接」
  2. Internet 地址写服务器地址,使用 IP 或都是 URL。
  3. 描述随便写。
  4. 点击右下角网络图标,在新建的 VPN 连接上右键属性然后切换到「安全」选项卡。
  5. VPN 类型选 IKEv2
  6. 数据加密是「需要加密」
  7. 身份认证这里使用私人证书认证的话就选择「使用计算机证书」。

配置完成。

一、ftp 服务器的选择

上文我们配置好了LDAP服务,既然配置了这个服务,想要用的自然是它的统一认证功能。那么,安装FTP服务器自然优先选择支持LDAP认证的软件了。

vsftpd 本身并不支持 LDAP 认证,而是通过 PAM 认证提供和 LDAP 的整合。PAM?如果搞砸了,Linux 登录都会出现困难。所以首先将 vsftpd 排除。

Pure-FTPd 本身支持 LDAP 认证,在 Debian 中,甚至有 pure-ftpd-ldap 包是专门支持 LDAP 认证的 Pure-FTPd 编译。PureFTPd 其现有的 LDAP 支持比较弱。

要求 LDAP 的用户帐号必须包含 posixAccount 作为 objectClass

也就是说必须在 LDAP 中指定用户的用户ID和组ID(数字形式)

必须在 LDAP 中设定用户主目录

为了安全计,往往需要将所有登录帐号映射为一个低权限的系统帐号。Pure-FTPd 的LDAP认证在以前的版本是不能实现的,但是在新版本中,pureftpd.schema里面的FTPuid and FTPgid 属性已经支持这个功能。
有了这个功能,那么对于我来说已经够用了。

ProFTPD 对 LDAP 的支持相当的完善,几乎堪称完美。但是自己对ProFTPD不太熟悉,而且ProFTPD相对来说漏洞较多发,所以弃用。

二、Pure-ftpd的安装配置

在Debian 中安装非常容易,执行以下命令安装。

apt-get install pure-ftpd-ldap

修改配置文件:

创建文件/etc/pure-ftpd/conf/ChrootEveryone ,其中只包含字符串yes :

echo "yes" > /etc/pure-ftpd/conf/ChrootEveryone

这将使PureFTPd在其主目录中的每个虚拟用户都chroot,因此他将无法浏览其主目录之外的目录和文件。

还要创建文件/etc/pure-ftpd/conf/CreateHomeDir ,它再次只包含字符串yes :

echo "yes" > /etc/pure-ftpd/conf/CreateHomeDir

这将使PureFTPd在用户登录并且主目录不存在时创建用户的主目录。

创建文件/etc/pure-ftpd/conf/DontResolve ,它再次只包含字符串yes :

echo "yes" > /etc/pure-ftpd/conf/DontResolve

这将使PureFTPd不会查找可以显着加速连接并减少带宽使用的主机名。

修改文件/etc/pure-ftpd/conf/DontResolve ,它再次只包含字符串"HIGH:MEDIUM:+TLSv1:!SSLv2:+SSLv3" :

echo "HIGH:MEDIUM:+TLSv1:!SSLv2:+SSLv3" > /etc/pure-ftpd/conf/TLSCipherSuite

这将使PureFTPd可以兼容一些较老的客户端(在开启TLS加密的时候)

创建文件/etc/pure-ftpd/conf/TLS ,它再次只包含字符串2 :

echo "2" > /etc/pure-ftpd/conf/TLS

这将使PureFTPd强制启用TLS加密连接,这样密码就不会明文在网络上传输。

/etc/pure-ftpd/conf/PassivePortRange 可以修改Passive模式开的端口范围,可以根据需要修改。

然后,生成TLS加密连接需要的文件。

sudo openssl req -x509 -nodes -days 7200 -newkey rsa:2048 -keyout /etc/ssl/private/pure-ftpd.pem -out /etc/ssl/private/pure-ftpd.pem

sudo openssl dhparam -out /etc/ssl/private/pure-ftpd-dhparams.pem 2048

接下来,我们配置pure-ftpd的ldap.conf文件:

/etc/pure-ftpd/db/ldap.conf

主要修改下面三项,修改成上文的配置:

LDAPBaseDN cn=People,dc=lostend,dc=com
LDAPBindDN cn=admin,dc=lostend,dc=com
LDAPBindPW admin'sPassword

其它选项可以看说明酌情修改。

修改完成以后重启 pure-ftpd

/etc/init.d/pure-ftpd-ldap restart

接下来,配置pureftpd.schema
首先拷贝/usr/share/doc/pure-ftpd-common/pureftpd.schema 文件至/etc/ldap/schema/pureftpd.schema
然后建立文件/etc/ldap/schema/pureftpd.ldif ,内容如下:

dn: cn=pureftpd,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: pureftpd
olcAttributeTypes: {0}( 1.3.6.1.4.1.6981.11.3.1 NAME 'FTPQuotaFiles' DESC 'Q
 uota (in number of files) for an FTP user' EQUALITY integerMatch SYNTAX 1.3
 .6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
olcAttributeTypes: {1}( 1.3.6.1.4.1.6981.11.3.2 NAME 'FTPQuotaMBytes' DESC '
 Quota (in megabytes) for an FTP user' EQUALITY integerMatch SYNTAX 1.3.6.1.
 4.1.1466.115.121.1.27 SINGLE-VALUE )
olcAttributeTypes: {2}( 1.3.6.1.4.1.6981.11.3.3 NAME 'FTPUploadRatio' DESC '
 Ratio (compared with FTPRatioDown) for uploaded files' EQUALITY integerMatc
 h SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
olcAttributeTypes: {3}( 1.3.6.1.4.1.6981.11.3.4 NAME 'FTPDownloadRatio' DESC
  'Ratio (compared with FTPRatioUp) for downloaded files' EQUALITY integerMa
 tch SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
olcAttributeTypes: {4}( 1.3.6.1.4.1.6981.11.3.5 NAME 'FTPUploadBandwidth' DE
 SC 'Bandwidth (in KB/s) to limit upload speeds to' EQUALITY integerMatch SY
 NTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
olcAttributeTypes: {5}( 1.3.6.1.4.1.6981.11.3.6 NAME 'FTPDownloadBandwidth'
 DESC 'Bandwidth (in KB/s) to limit download speeds to' EQUALITY integerMatc
 h SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
olcAttributeTypes: {6}( 1.3.6.1.4.1.6981.11.3.7 NAME 'FTPStatus' DESC 'Accou
 nt status: enabled or disabled' EQUALITY caseIgnoreIA5Match SYNTAX 1.3.6.1.
 4.1.1466.115.121.1.26 SINGLE-VALUE )
olcAttributeTypes: {7}( 1.3.6.1.4.1.6981.11.3.8 NAME 'FTPuid' DESC 'System u
 id (overrides uidNumber if present)' EQUALITY integerMatch SYNTAX 1.3.6.1.4
 .1.1466.115.121.1.27 SINGLE-VALUE )
olcAttributeTypes: {8}( 1.3.6.1.4.1.6981.11.3.9 NAME 'FTPgid' DESC 'System u
 id (overrides gidNumber if present)' EQUALITY integerMatch SYNTAX 1.3.6.1.4
 .1.1466.115.121.1.27 SINGLE-VALUE )
olcObjectClasses: {0}( 1.3.6.1.4.1.6981.11.2.3 NAME 'PureFTPdUser' DESC 'Pur
 eFTPd user with optional quota, throttling and ratio' SUP top AUXILIARY MAY
  ( FTPStatus $ FTPQuotaFiles $ FTPQuotaMBytes $ FTPUploadRatio $ FTPDownloa
 dRatio $ FTPUploadBandwidth $ FTPDownloadBandwidth $ FTPuid $ FTPgid ) )

以上文件内容只是展示用。具体生成方法如下:

首先建立一个文件 pureftpd.txt :

include         /etc/ldap/schema/pureftpd.schema

现在我们将转换schema:

mkdir ldif
slaptest -f pureftpd.txt -F ldif

现在我们更改到包含转换模式的目录:

cd ldif/cn\=config/cn\=schema

该目录应包含以下文件:

cn={0}pureftpd.ldif

更改:

dn: cn={0}pureftpd
objectClass: olcSchemaConfig
cn: {0}pureftpd

至:

dn: cn=pureftpd,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: pureftpd

并删除:

structuralObjectClass: olcSchemaConfig
entryUUID: 18f5d9c2-5b7f-1039-91ac-0f367d4f1c38
creatorsName: cn=config
createTimestamp: 20190825122458Z
entryCSN: 20190825122458.522936Z#000000#000#000000
modifiersName: cn=config
modifyTimestamp: 20190825122458Z

现在我们将ldif文件复制到/etc/ldap/schema目录中(这是必要的,但是当需要ldif时,很方便找到)。

cp cn\=\{0\}pureftpd.ldif /etc/ldap/schema/pureftpd.ldif

现在我们将模式添加到OpenLDAP。

ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/pureftpd.ldif 

这样,我们就完成了pureftpd.schema 往LDAP里添加。

三、LAM 里面配置PureFTPdUser

在下图中,我们可以看到刚才添加的 PureFTPdUser objectClass。

20190825203315.png

然后,可以在用户信息那添加PureFTPdUser objectClass 和属性。

20190825203737.png

可以通过 FTPuid和FTPgid属性,将FTP账户登陆时映射成一个低权限的系统账号。一般会建立一个专属的 ftpuser和 ftpgroup,然后映射成对应的uid和gid。具体想映射成哪个,自己根据需要决定就可以了。

当然还有一些容量配额、上下载带宽配置的属性等。可根据需要开启。

具体可以参考官方文档:

https://download.pureftpd.org/pub/pure-ftpd/doc/README.LDAP

如果事先已经建立了比较多的账号,可能一个个的修改很累人,可以执行批量修改操作:

20190825204542.png