├── .gitignore ├── other ├── test │ ├── pku.cap │ ├── thu.cap │ ├── c9 │ │ ├── hit.png │ │ ├── nju.png │ │ ├── pku.png │ │ ├── zju.png │ │ ├── fudan.png │ │ ├── sjtu.png │ │ ├── ustc.png │ │ ├── xjtu.png │ │ └── tsinghua.png │ ├── pku-2.cap │ ├── thu-2.cap │ ├── img │ │ ├── nju.jpg │ │ ├── zju.png │ │ ├── pku-io.jpg │ │ ├── pku-ms.jpeg │ │ ├── pku-ts.jpg │ │ ├── thu-io.jpg │ │ ├── thu-ms.jpeg │ │ ├── thu-ts.jpg │ │ ├── pku-io-2.png │ │ ├── thu-io-2.png │ │ ├── pku_vs_thu.png │ │ ├── pkuvsthu-1.jpeg │ │ ├── pkuvsthu-ms.jpeg │ │ └── thupku-speed.png │ ├── pku_vs_thu.pptx │ ├── c9.md │ ├── README.md │ ├── pku_vs_thu.md │ └── pku-thu.md ├── wireshark │ ├── img │ │ ├── fd1-ts.png │ │ ├── fd2-io.png │ │ ├── fd2-ts.png │ │ ├── good-io.png │ │ ├── good-ts.png │ │ └── bad-ts-1.png │ └── README.md ├── bark │ └── README.md ├── util │ └── README.md ├── nfc │ └── README.md ├── dns │ └── README.md ├── live │ └── README.md └── eduroam │ └── README.md ├── app ├── ntp │ ├── gps │ │ ├── cgps.png │ │ ├── m8n.jpg │ │ ├── bs-70du.png │ │ ├── gpsmon.png │ │ └── README.md │ ├── README.md │ └── README-en.md ├── mail │ └── spf_dkim │ │ ├── 1.png │ │ └── README.md ├── dns │ ├── iptables │ │ ├── traffic.png │ │ └── README.md │ ├── dnssec │ │ ├── img │ │ │ └── dnssec.png │ │ └── README.md │ ├── dns_with_git │ │ ├── data_flow.jpg │ │ ├── data_flow.pptx │ │ └── README.md │ ├── whynoconntrack │ │ └── README.md │ └── coredns │ │ └── README.md ├── nextcloud │ ├── _image │ │ └── 1485678471943.png │ └── README.md ├── nginx │ ├── nginx-rrd │ │ ├── upload │ │ │ ├── nginx-rrd.png │ │ │ └── nginx-rrd-old.png │ │ └── README.md │ ├── nginx-opt │ │ └── README.md │ └── Cases.md ├── ftp │ ├── proftpd-tls.md │ └── proftpd-ldap.md ├── dhcp │ └── dhcpd-pool │ │ └── README.md └── www │ └── httpmonitor │ └── README.md ├── env └── modbus │ ├── modbus.jpg │ ├── modbus.pptx │ └── README.md ├── security ├── mfa │ ├── ekey.jpg │ ├── ga.png │ └── README.md ├── gpg │ ├── img │ │ ├── ase.png │ │ ├── ase.pptx │ │ ├── ass.png │ │ ├── gpg.png │ │ ├── gpg.pptx │ │ ├── sme.png │ │ └── sme.pptx │ └── README.md ├── bgp │ └── exabgp │ │ ├── DDoS.png │ │ └── README.md ├── yubikey │ ├── img │ │ ├── YubiKey-5C.png │ │ ├── YubiKey-5-NFC.png │ │ ├── YubiKey-5-Nano.png │ │ └── YubiKey-5C-Nano.png │ └── README.md ├── ssh-yubikey-otp │ ├── Jietu20190420-172240.png │ ├── Jietu20190420-172301.png │ └── README.md ├── anquanzerenshu.md ├── ca │ └── README.md ├── mail │ └── README.md ├── l1.md ├── checklist │ └── README.md ├── mine │ └── README.md ├── ssl │ ├── letsencrypt │ │ └── README.md │ └── acme.sh │ │ └── README.md ├── www │ └── git │ │ └── README.md ├── ipsec │ └── README.md └── gh0st │ └── README.md ├── network ├── ixcache │ ├── 14day.png │ ├── 7day.png │ └── README.md ├── switch │ ├── tap │ │ ├── tap.png │ │ ├── tap.pptx │ │ └── README.md │ ├── sflow │ │ └── README.md │ └── stptc │ │ └── README.md ├── vxlan │ ├── img │ │ ├── vxlan.png │ │ ├── vxlan.pptx │ │ └── vxlan2.png │ └── README.md ├── vpn │ └── l2tpvpn │ │ ├── img │ │ ├── l2tpvpn.png │ │ └── l2tpvpn.pptx │ │ └── README.md ├── firewall │ └── tcpstate │ │ └── README.md └── nat │ └── centos7 │ └── README.md ├── OS └── firewall │ ├── README.md │ └── linux_web.md ├── work.md └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | -------------------------------------------------------------------------------- /other/test/pku.cap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/other/test/pku.cap -------------------------------------------------------------------------------- /other/test/thu.cap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/other/test/thu.cap -------------------------------------------------------------------------------- /app/ntp/gps/cgps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/app/ntp/gps/cgps.png -------------------------------------------------------------------------------- /app/ntp/gps/m8n.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/app/ntp/gps/m8n.jpg -------------------------------------------------------------------------------- /env/modbus/modbus.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/env/modbus/modbus.jpg -------------------------------------------------------------------------------- /other/test/c9/hit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/other/test/c9/hit.png -------------------------------------------------------------------------------- /other/test/c9/nju.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/other/test/c9/nju.png -------------------------------------------------------------------------------- /other/test/c9/pku.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/other/test/c9/pku.png -------------------------------------------------------------------------------- /other/test/c9/zju.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/other/test/c9/zju.png -------------------------------------------------------------------------------- /other/test/pku-2.cap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/other/test/pku-2.cap -------------------------------------------------------------------------------- /other/test/thu-2.cap: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/other/test/thu-2.cap -------------------------------------------------------------------------------- /security/mfa/ekey.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/security/mfa/ekey.jpg -------------------------------------------------------------------------------- /security/mfa/ga.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/security/mfa/ga.png -------------------------------------------------------------------------------- /app/mail/spf_dkim/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/app/mail/spf_dkim/1.png -------------------------------------------------------------------------------- /app/ntp/gps/bs-70du.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/app/ntp/gps/bs-70du.png -------------------------------------------------------------------------------- /app/ntp/gps/gpsmon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/app/ntp/gps/gpsmon.png -------------------------------------------------------------------------------- /env/modbus/modbus.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/env/modbus/modbus.pptx -------------------------------------------------------------------------------- /other/test/c9/fudan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/other/test/c9/fudan.png -------------------------------------------------------------------------------- /other/test/c9/sjtu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/other/test/c9/sjtu.png -------------------------------------------------------------------------------- /other/test/c9/ustc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/other/test/c9/ustc.png -------------------------------------------------------------------------------- /other/test/c9/xjtu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/other/test/c9/xjtu.png -------------------------------------------------------------------------------- /other/test/img/nju.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/other/test/img/nju.jpg -------------------------------------------------------------------------------- /other/test/img/zju.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/other/test/img/zju.png -------------------------------------------------------------------------------- /network/ixcache/14day.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/network/ixcache/14day.png -------------------------------------------------------------------------------- /network/ixcache/7day.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/network/ixcache/7day.png -------------------------------------------------------------------------------- /network/switch/tap/tap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/network/switch/tap/tap.png -------------------------------------------------------------------------------- /other/test/c9/tsinghua.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/other/test/c9/tsinghua.png -------------------------------------------------------------------------------- /other/test/img/pku-io.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/other/test/img/pku-io.jpg -------------------------------------------------------------------------------- /other/test/img/pku-ms.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/other/test/img/pku-ms.jpeg -------------------------------------------------------------------------------- /other/test/img/pku-ts.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/other/test/img/pku-ts.jpg -------------------------------------------------------------------------------- /other/test/img/thu-io.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/other/test/img/thu-io.jpg -------------------------------------------------------------------------------- /other/test/img/thu-ms.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/other/test/img/thu-ms.jpeg -------------------------------------------------------------------------------- /other/test/img/thu-ts.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/other/test/img/thu-ts.jpg -------------------------------------------------------------------------------- /other/test/pku_vs_thu.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/other/test/pku_vs_thu.pptx -------------------------------------------------------------------------------- /security/gpg/img/ase.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/security/gpg/img/ase.png -------------------------------------------------------------------------------- /security/gpg/img/ase.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/security/gpg/img/ase.pptx -------------------------------------------------------------------------------- /security/gpg/img/ass.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/security/gpg/img/ass.png -------------------------------------------------------------------------------- /security/gpg/img/gpg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/security/gpg/img/gpg.png -------------------------------------------------------------------------------- /security/gpg/img/gpg.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/security/gpg/img/gpg.pptx -------------------------------------------------------------------------------- /security/gpg/img/sme.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/security/gpg/img/sme.png -------------------------------------------------------------------------------- /security/gpg/img/sme.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/security/gpg/img/sme.pptx -------------------------------------------------------------------------------- /app/dns/iptables/traffic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/app/dns/iptables/traffic.png -------------------------------------------------------------------------------- /network/switch/tap/tap.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/network/switch/tap/tap.pptx -------------------------------------------------------------------------------- /network/vxlan/img/vxlan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/network/vxlan/img/vxlan.png -------------------------------------------------------------------------------- /network/vxlan/img/vxlan.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/network/vxlan/img/vxlan.pptx -------------------------------------------------------------------------------- /network/vxlan/img/vxlan2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/network/vxlan/img/vxlan2.png -------------------------------------------------------------------------------- /other/test/img/pku-io-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/other/test/img/pku-io-2.png -------------------------------------------------------------------------------- /other/test/img/thu-io-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/other/test/img/thu-io-2.png -------------------------------------------------------------------------------- /security/bgp/exabgp/DDoS.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/security/bgp/exabgp/DDoS.png -------------------------------------------------------------------------------- /app/dns/dnssec/img/dnssec.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/app/dns/dnssec/img/dnssec.png -------------------------------------------------------------------------------- /other/test/img/pku_vs_thu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/other/test/img/pku_vs_thu.png -------------------------------------------------------------------------------- /other/test/img/pkuvsthu-1.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/other/test/img/pkuvsthu-1.jpeg -------------------------------------------------------------------------------- /other/test/img/pkuvsthu-ms.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/other/test/img/pkuvsthu-ms.jpeg -------------------------------------------------------------------------------- /other/test/img/thupku-speed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/other/test/img/thupku-speed.png -------------------------------------------------------------------------------- /other/wireshark/img/fd1-ts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/other/wireshark/img/fd1-ts.png -------------------------------------------------------------------------------- /other/wireshark/img/fd2-io.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/other/wireshark/img/fd2-io.png -------------------------------------------------------------------------------- /other/wireshark/img/fd2-ts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/other/wireshark/img/fd2-ts.png -------------------------------------------------------------------------------- /other/wireshark/img/good-io.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/other/wireshark/img/good-io.png -------------------------------------------------------------------------------- /other/wireshark/img/good-ts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/other/wireshark/img/good-ts.png -------------------------------------------------------------------------------- /other/wireshark/img/bad-ts-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/other/wireshark/img/bad-ts-1.png -------------------------------------------------------------------------------- /app/dns/dns_with_git/data_flow.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/app/dns/dns_with_git/data_flow.jpg -------------------------------------------------------------------------------- /app/dns/dns_with_git/data_flow.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/app/dns/dns_with_git/data_flow.pptx -------------------------------------------------------------------------------- /network/vpn/l2tpvpn/img/l2tpvpn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/network/vpn/l2tpvpn/img/l2tpvpn.png -------------------------------------------------------------------------------- /network/vpn/l2tpvpn/img/l2tpvpn.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/network/vpn/l2tpvpn/img/l2tpvpn.pptx -------------------------------------------------------------------------------- /security/yubikey/img/YubiKey-5C.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/security/yubikey/img/YubiKey-5C.png -------------------------------------------------------------------------------- /app/nextcloud/_image/1485678471943.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/app/nextcloud/_image/1485678471943.png -------------------------------------------------------------------------------- /security/yubikey/img/YubiKey-5-NFC.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/security/yubikey/img/YubiKey-5-NFC.png -------------------------------------------------------------------------------- /app/nginx/nginx-rrd/upload/nginx-rrd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/app/nginx/nginx-rrd/upload/nginx-rrd.png -------------------------------------------------------------------------------- /security/yubikey/img/YubiKey-5-Nano.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/security/yubikey/img/YubiKey-5-Nano.png -------------------------------------------------------------------------------- /security/yubikey/img/YubiKey-5C-Nano.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/security/yubikey/img/YubiKey-5C-Nano.png -------------------------------------------------------------------------------- /app/nginx/nginx-rrd/upload/nginx-rrd-old.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/app/nginx/nginx-rrd/upload/nginx-rrd-old.png -------------------------------------------------------------------------------- /security/ssh-yubikey-otp/Jietu20190420-172240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/security/ssh-yubikey-otp/Jietu20190420-172240.png -------------------------------------------------------------------------------- /security/ssh-yubikey-otp/Jietu20190420-172301.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bg6cq/ITTS/HEAD/security/ssh-yubikey-otp/Jietu20190420-172301.png -------------------------------------------------------------------------------- /OS/firewall/README.md: -------------------------------------------------------------------------------- 1 | ## 主机防火墙 2 | 3 | 主机防火墙是最后一道防线,必须严格设置,仅仅允许需要的流量(开放必要的端口),禁止非必需流量。 4 | 5 | Linux主机可以使用内置的iptables。 6 | Windows主机可以使用内置的防火墙。 7 | 8 | Linux主机设置请参考:[Linux WEB防火墙](linux_web.md) 9 | 10 | Windows主机可以使用以下两种方式来设置: 11 | 12 | 1. 适用于 Windows Vista、Windows 7 和 Windows Server 2008 13 | 14 | 以下过程通过使用具有高级安全 Microsoft 管理控制台 (MMC) 管理单元的 Windows 防火墙来配置该 Windows 防火墙。 15 | 16 | 1. 在 “开始” 菜单上,单击 “运行”,键入 WF.msc,然后单击 “确定”。 17 | 2. 在“高级安全 Windows 防火墙”的左窗格中,右键单击“入站规则”,然后在操作窗格中单击“新建规则”。 18 | 3. 在 “规则类型” 对话框中,选择 “端口”,然后单击 “下一步”。 19 | 4. 在 “协议和端口” 对话框中,选择 TCP/UDP。 选择“特定本地端口”,输入端口号。 单击“下一步” 。 20 | 5. 在 “操作” 对话框中,选择 “允许连接/禁止连接”,然后单击 “下一步”。 21 | 6. 在 “配置文件” 对话框中,选择在您想要连接到 配置文件,然后单击 “下一步”。 22 | 7. 在 “名称” 对话框中,输入此规则的名称和说明,再单击 “完成”。 23 | 24 | 25 | 您也可以参考这里 [Windows防火墙限制端口/IP/应用访问的方法以及例外的配置](https://help.aliyun.com/knowledge_detail/40699.html) -------------------------------------------------------------------------------- /network/switch/sflow/README.md: -------------------------------------------------------------------------------- 1 | ## [原创]交换机sflow抓包的简单说明 2 | 3 | 本文原创:**中国科学技术大学 张焕杰** 4 | 5 | 修改时间:2018.04.10 6 | 7 | 最近新买的H3C S5130交换机支持sflow功能,下面是使用sflow抓包的简单说明。 8 | 9 | ## 一、sflow原理 10 | 11 | 交换机支持sflow,可以将接口发送/接收的数据包按照一定比例抓包,通过sflow协议把抓到的数据包交给collector,collector收到后可以对数据包进行分析。 12 | 13 | 14 | ## 二、sflow collector 15 | 16 | 有很多sflow collector,最简单的是 [InMon sFlow Toolkit](https://inmon.com/technology/sflowTools.php)。 17 | 18 | 其中还有windows下的sflowtool.ext,下载执行即可(默认在UDP端口6343)。 19 | 20 | 21 | ## 三、H3C S5130交换机侧配置 22 | 23 | 假定运行sflowtool.exe的机器IP是x.x.x.x,采集 Gi1/0/1端口数据包(采集比例是1000:1,即每1000个包采集1个)的配置如下: 24 | 25 | ``` 26 | sflow collector 1 ip x.x.x.x description "CLI Collector" 27 | 28 | interface GigabitEthernet1/0/1 29 | sflow flow collector 1 30 | sflow sampling-rate 1000 31 | ``` 32 | 33 | ## 四、运行效果 34 | 35 | 运行 `sflowtool.exe` ,可以看到有sflow数据。 36 | 37 | 运行 `sflowtool.exe -t > t.cap`,运行一段时间,`CTRL-C`终止,使用wireshark打开t.cap可以看到抓取的数据包。 38 | 39 | 40 | *** 41 | 欢迎 [加入我们整理资料](https://github.com/bg6cq/ITTS) 42 | -------------------------------------------------------------------------------- /OS/firewall/linux_web.md: -------------------------------------------------------------------------------- 1 | ## [原创]web服务器iptables防火墙设置 2 | 3 | 山东大学信息化工作办公室 陈军 4 | 20170408 5 | 6 | 用CentOs6.6自带的apache作web服务器,用iptables设置主机防火墙。防火墙规则如下: 7 | 8 | 1. TCP 80端口完全开放,允许ping本服务器。 9 | 2. 仅允许信息办办公网段192.168.100.0通过ssh访问本服务器。 10 | 3. 允许本服务器向外发送dns解析请求,允许本服务器向外发送时间同步请求。 11 | 12 | 通过shell脚本设置上述防火墙规则。代码如下: 13 | 14 | 15 | #!/bin/bash 16 | # Set firewall rules 17 | DST="192.168.1.1" 18 | # iptables rules: 19 | iptables -P INPUT ACCEPT 20 | iptables -F 21 | iptables -A INPUT -i lo -j ACCEPT 22 | iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT 23 | iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT 24 | iptables -A INPUT -s 192.168.100.0/24 –dport 22 -d $DST -j ACCEPT 25 | iptables -A INPUT -p tcp --dport 80 -d $DST -j ACCEPT 26 | # allow this host to visit other sever(dns,ntp) as client. 27 | iptables -A INPUT -p tcp --sport 53 -j ACCEPT 28 | iptables -A INPUT -p udp --sport 53 -j ACCEPT 29 | iptables -A INPUT -p udp --sport 123 -j ACCEPT 30 | iptables -P INPUT DROP 31 | iptables -P FORWARD DROP 32 | iptables -P OUTPUT ACCEPT 33 | -------------------------------------------------------------------------------- /network/ixcache/README.md: -------------------------------------------------------------------------------- 1 | ## [原创] IXCache使用介绍 2 | 3 | 本文原创:**中国科学技术大学 张焕杰** 4 | 5 | 修改时间:2019.04.12 6 | 7 | 本文介绍中国科学技术大学IXCache的使用情况。 8 | 9 | ## 一、设立IXCache的考虑 10 | 11 | IXCache,可以将用户访问的热点内容缓存在硬盘中,再有用户访问同样的内容时,直接发送重定向给用户,引导用户从IXCache中获取内容,从而提高用户的下载速度,节省出口带宽。 12 | 13 | IXCache将各类资源分了上百个门类,管理员针对自己网络的用户情况选择缓存哪些资源。比如我校的校园网,经测试应用商店和软件下载的缓存效果很好,而各类视频的缓存效果不好,我们主要对应用商店和软件下载门类资源进行缓存。 14 | 15 | 16 | ## 二、服务器硬件 17 | 18 | 采购了一台服务器,128G内存,2个120GB SSD硬盘用于系统,10个 2TB SSD硬盘用于缓存数据。 19 | 20 | SSD硬盘不由RAID卡管理,直接由IXCache(FreeBSD)管理。 21 | 22 | ## 三、部署方式 23 | 24 | 我校采用对现有网络改造最小的部署方式: 25 | 26 | IXCache 服务器有2个10G网卡: 27 | 28 | * 1个为正常上网网卡,用来下载资源和向用户提供资源。需要注意的是,IXCache发出重定向时需要伪造IP,因此网络设备不能设置urpf之类的过滤,以便允许伪造IP地址的数据包通过。 29 | * 1个网卡用来获取用户上网的访问请求,只要将用户发出校外的上行流量镜像到该接口即可 30 | 31 | ## 四、使用效果 32 | 33 | 下图是安装至今14天的效果 34 | 35 | ![14天](14day.png) 36 | 37 | 下图是最近7天的效果 38 | 39 | ![7天](7day.png) 40 | 41 | 我校同学大量时间用于学习,观看视频的流量不多,因此对视频类资源缓存效果不好。我们暂时禁用了视频类资源的缓存。 42 | 43 | 从中可以看到,IXCache峰值服务超过1.4G,每天可节约500M左右出校带宽。 44 | 45 | 按照我校带宽采购成本约 1GBPS/月 2万元计算,20个月可以收回软硬件成本。20个月后,每月可为学校节省1万元的带宽费。 46 | 47 | 对用户来说,进行应用商店和windows更新时,大部分来自校内缓存服务器,速度更快,体验更好。 48 | 49 | *** 50 | 欢迎 [加入我们整理资料](https://github.com/bg6cq/ITTS) 51 | -------------------------------------------------------------------------------- /app/dns/iptables/README.md: -------------------------------------------------------------------------------- 1 | ## [原创] DNS服务器的iptables规则 2 | 3 | 本文原创:**中国科学技术大学 张焕杰** 4 | 5 | 修改时间:2018.03.19 6 | 7 | 自己建立的DNS服务器,很容易出现如下的无效流量: 8 | 9 | * 部分IP发来大量的查询,浪费服务器资源 10 | * 非授权IP发来的查询,服务器会返回 非授权拒绝 应答包,浪费服务器对外带宽 11 | * 部分攻击者伪造源地址发送 ANY 查询来进行反射式攻击,浪费服务器带宽 12 | 13 | 为解决以上攻击,我校对内提供DNS服务的iptables规则和简单说明如下,供参考。 14 | 15 | ![DNS traffic](traffic.png) 16 | 17 | 上图是我校 [202.38.64.56](http://202.38.64.56) DNS 服务器在增加iptables前后的流量图, 18 | 可以看到增加iptables规则后流量下降了很多。 19 | 20 | 21 | ``` 22 | #!/bin/sh 23 | 24 | iptables -F 25 | 26 | iptables -N dnsin 27 | iptables -N dnsout 28 | 29 | #对收到的包,记录最近10秒钟的IP, 限制每个IP每秒钟20个查询 30 | iptables -A dnsin -j ACCEPT -m hashlimit --hashlimit-name dns --hashlimit 20/sec --hashlimit-burst 10 \ 31 | --hashlimit-mode srcip --hashlimit-htable-expire 10000 32 | iptables -A dnsin -j DROP 33 | 34 | #对非授权拒绝查询应答包限速每秒10个 35 | iptables -A dnsout -j ACCEPT -m limit --limit 10/sec 36 | iptables -A dnsout -j DROP 37 | 38 | iptables -I INPUT -j dnsin -p udp --dport 53 39 | 40 | #对非授权拒绝查询的应答包限速 41 | iptables -A OUTPUT -j dnsout -m u32 -p udp --sport 53 --u32 "28&0xFFFF=0x8105" 42 | 43 | #禁止大包应答 44 | iptables -A OUTPUT -j DROP -p udp --sport 53 -m length --length 1300: 45 | 46 | ``` 47 | 48 | *** 49 | 欢迎 [加入我们整理资料](https://github.com/bg6cq/ITTS) 50 | -------------------------------------------------------------------------------- /security/anquanzerenshu.md: -------------------------------------------------------------------------------- 1 | 本文原创:沈阳农大 刘占文 2 | 3 | 修改时间:2017.11.22 4 | 5 | ## xxxx大学网络安全工作责任书 6 | 7 | 为进一步落实网络安全安全管理责任,确保学校网络安全和信息安全,根据《中华人民共和国网络安全法》, 8 | 结合学校情况,特制订本责任书。 9 | 10 | ## 一、责任范围 11 | 12 | 各党委、各部、处、学院(直属单位)党政主要负责同志作为网络安全的第一责任人。按照“谁主管谁负责、 13 | 谁运维谁负责、谁使用谁负责”的原则,负责建立健全本单位网络安全组织和管理制度,制定网络安全事件 14 | 应急处置措施和预案,配备专兼职网络安全员,组织师生学习网络安全法,提升师生网络安全意识,做好本 15 | 单位网络安全工作。 16 | 17 | ## 二、责任内容 18 | 19 | (一)对归属于本单位的机房、设备间等加强管理,经常检查网络设施的防火、防水、防盗措施落实情况, 20 | 保障网络设施物理安全。 21 | 22 | (二)强化网络信息安全管理和防范措施,加强关键信息基础设施、信息系统和网站的防护。开展信息系统 23 | 漏洞扫描和病毒查杀工作,并对网站异常流量、恶意程序进行监测和检查。定期备份信息系统数据,分析信 24 | 息系统日志,严防攻击、入侵、篡改、窃密等安全事件的发生,做到提前防范、尽早补救,迅速消除隐患。要 25 | 加强重要敏感时期网站的监管工作,安排专人定期定时查看网站安全状况。一旦遇到网络安全事件应采取果 26 | 断措施进行处置、报告、整改,做到应急处置迅速、报告及时、整改到位。 27 | 28 | (四)加强网站内容的发布管理和内容审核,实行信息发布审核制度,防范个人敏感信息和涉密信息泄露。 29 | 不在网上制作、复制、发布、传播有害信息。若发现有害信息,按照有关规定及时处理和上报。 30 | 31 | (五)健全网络安全值守制度和应急报告与处置机制,建立网络安全责任人、安全员联系制度,及时关注 32 | 学校网络安全信息动态,关键敏感时期确保24小时联络通畅。 33 | 34 | ## 三、责任追究 35 | 36 | 严格实行网络安全责任追究制度。如因管理不善致使本部门内发生重大网络安全事故,按有关规定对部门 37 | 和有关责任人进行处理,情节特别严重的依法追究相关责任人的法律责任。 38 | 39 | ## 四、签订本责任书的责任人若工作变动,本责任书的责任由继任者履行。 40 | 41 | 42 | 单位(公章): 主要负责人(签字): 43 | 44 | 年 月 日 45 | 46 | *** 47 | 欢迎 [加入我们整理资料](https://github.com/bg6cq/ITTS) 48 | -------------------------------------------------------------------------------- /app/ftp/proftpd-tls.md: -------------------------------------------------------------------------------- 1 | # 在 ProFTPd 中配置 FTPS (FTP over TLS) 2 | 3 | 作者:西北农林科技大学 卞一帆 4 | 5 | ## 为什么要配置 TLS 6 | 7 | 类似于 HTTP 和 HTTPS ,建立在 TLS 上的应用层传输提供了更高的安全性,可以避免用户的凭据被通过窃听的方式获得,也可保证文件传输的安全性。 8 | 9 | ## 环境准备 10 | 11 | 1. Linux 服务器( CentOS 和 Debian 系均可,本例中使用 CentOS 6.9 ) 12 | 2. 安装 ProFTPd (本例中使用编译安装,参考[官方文档](http://www.proftpd.org/docs/howto/Compiling.html)) 13 | 14 | ## 配置 TLS 15 | 16 | 本例选择在 `proftpd.conf` 中配置一个 VirtualHost 。如果需要配置到全局,只需要将 TLS 相关指令放到全局配置里。用方括号包括的内容需要根据实际情况修改。 17 | 18 | ``` 19 | 20 | ServerName [Your Server Name] 21 | DefaultRoot [Path To FTP Root] 22 | 23 | ExtendedLog [Path to extended log] 24 | TransferLog [Path to transfer log] 25 | UseEncoding on 26 | 27 | TLSEngine on 28 | TLSLog [Path to TLS log] 29 | TLSProtocol TLSv1.1 TLSv1.2 30 | TLSRequired off 31 | TLSRSACertificateFile [Path to certificate] 32 | TLSRSACertificateKeyFile [Path to private key] 33 | TLSVerifyClient off 34 | TLSRenegotiate none 35 | 36 | # Your own configuration goes here 37 | 38 | ``` 39 | 40 | 其中,FTPS 使用的证书和 nginx 配置 HTTPS 的证书可以是一样的。Common Name 字段应为用户连接 FTP 服务器时输入的主机名(建议域名)。 41 | 在实际测试中,FileZilla 会在初次连接时将证书信息显示给用户,让用户选择是否信任此证书。 -------------------------------------------------------------------------------- /app/dhcp/dhcpd-pool/README.md: -------------------------------------------------------------------------------- 1 | ## [原创] Linux下ISC dhcpd分配状态显示 2 | 3 | 本文原创:**中国科学技术大学 张焕杰** 4 | 5 | 修改时间:2017.12.27 6 | 7 | Linux下的ISC dhcpd是最常用的dhcp服务器,本文记录一个显示dhcpd分配状态的程序dhcpd-pool安装过程。 8 | 9 | dhcpd-pool可以显示dhcpd的分配状态,项目主页在 [http://dhcpd-pools.sourceforge.net/](http://dhcpd-pools.sourceforge.net/)。 10 | 11 | 安装过程: 12 | 13 | 1. 下载文件 14 | 15 | ``` 16 | cd /usr/src 17 | 从 [https://sourceforge.net/projects/dhcpd-pools/files/](https://sourceforge.net/projects/dhcpd-pools/files/) 下载,我下载的是 dhcpd-pools-3.0.tar.xz 18 | ``` 19 | 20 | 2. 解压文件 21 | 22 | `tar zxvf dhcpd-pools-3.0.tar.xz` 23 | 24 | 3. 下载需要的uthash.h 25 | 26 | `curl https://raw.githubusercontent.com/troydhanson/uthash/master/src/uthash.h > /usr/include/uthash.h` 27 | 28 | 4. 编译 29 | 30 | ``` 31 | cd dhcpd-pools-3.0 32 | ./configure --with-dhcpd-leases=/var/lib/dhcpd/dhcpd.leases 33 | make 34 | ``` 35 | 36 | 5. 测试运行 37 | ``` 38 | ./dhcpd-pools 39 | ``` 40 | 41 | 注意:如果使用shared-network, 在dhcpd.conf中 `shared-network xxx {`,xxx与后面的{一定要有空格。 42 | 43 | 6. 定时运行,输出html 44 | 45 | crontab 46 | ``` 47 | * * * * * /usr/src/dhcpd-pools-3.0/dhcpd-pools -f H > /var/www/html/dhcp.html 48 | ``` 49 | 50 | 7. 案例 51 | 52 | [http://202.38.64.17/dhcp.html](http://202.38.64.17/dhcp.html) 53 | 54 | 8. 汉化版本 55 | 56 | [https://github.com/bg6cq/dhcpd-pools-cn](https://github.com/bg6cq/dhcpd-pools-cn) 有我汉化了html输出的版本,如果需要可以安装。 57 | 58 | *** 59 | 欢迎 [加入我们整理资料](https://github.com/bg6cq/ITTS) 60 | -------------------------------------------------------------------------------- /app/dns/whynoconntrack/README.md: -------------------------------------------------------------------------------- 1 | ## [原创] 为何DNS服务器要禁用连接跟踪 2 | 3 | 本文原创:**中国科学技术大学 张焕杰** 4 | 5 | 修改时间:2017.12.21 6 | 7 | # 一、什么是连接跟踪 8 | 9 | 连接跟踪(conntrack)是Linux kernel中的一个功能,可以记录通过Linux kernel处理的数据包的连接信息。 10 | 11 | 启动连接跟踪后,每个连接的第一个数据包经过Linux时,会在连接表中增加一个表项。如果一段时间后没有这 12 | 个连接的数据包,连接表项会超时删除。这些处理不光会消耗CPU处理,而且由于默认的连接表项并 13 | 不多,当连接表项用光后,会出现丢包现象。 14 | 15 | 如果Linux开启了NAT功能或状态防火墙(iptables 中使用state模块),连接跟踪必须要启动,其他情况下可以禁用。 16 | 17 | [这里](http://www.10tiao.com/html/488/201701/2247484116/1.html) 有个稍微详细的说明,有兴趣可以去看看。 18 | 19 | # 二、为何DNS服务器与连接跟踪关系密切 20 | 21 | DNS是轻量级服务,几乎每个数据包都是独立的新连接,因此启用连接跟踪时, 22 | 会占用大量的连接表项,白白浪费CPU时间,并且连接表满了后,导致丢包,引起DNS查询异常。 23 | 24 | 如果`dmesg`看到诸如`table full, dropping packet`,说明连接表已经满了。 25 | 26 | # 三、DNS服务器可以不用连接跟踪吗 27 | 28 | 当然可以不用。由于DNS服务器开启的tcp/udp端口较少,不使用连接跟踪也照样可以很安全。 29 | 30 | 比如我们的DNS,`netstat -anp`查看服务器进程,仅仅在tcp/udp 53和tcp 22有监听, 31 | 因此iptables增加有对tcp 22端口限制的规则,其他都允许: 32 | ``` 33 | #!/bin/sh 34 | iptables -F 35 | iptables -A INPUT -j ACCEPT -s 202.38.64.x -p tcp --dport 22 36 | iptables -A INPUT -j DROP -p tcp --dport 22 37 | ``` 38 | 39 | # 四、如果不得不启用连接跟踪,有解决办法吗 40 | 41 | 1. 增加连接表项 42 | 43 | 加载nf_conntrack时增加参数hashsize,最大连接数是hashsize*8。 44 | 每个连接数大约占用200多个字节,可以根据自己的内存算一算最多能支持多少。 45 | ``` 46 | # 加载连接跟踪模块,设置最大连接数为40*8=320万 47 | modprobe nf_conntrack hashsize=400000 48 | ``` 49 | 50 | 2. 修改超时时间 51 | 52 | 可以修改连接跟踪的超时时间,让连接尽快删除。对于UDP,完全可以设置超时时间5秒。 53 | 54 | 55 | *** 56 | 欢迎 [加入我们整理资料](https://github.com/bg6cq/ITTS) 57 | -------------------------------------------------------------------------------- /app/nginx/nginx-rrd/README.md: -------------------------------------------------------------------------------- 1 | ## nginx-rrd绘图参数 2 | 3 | **西安财经学院 王伟** 4 | 5 | 创建时间:2017.10.13 6 | 7 | nginx-rrd工具为nginx提供了一个简单的监控图,但是默认生成的监控图实在不好看。 8 | ![image](upload/nginx-rrd-old.png) 9 | 10 | 这里不提如何下载及安装,教程及源码网上很多,对于`rrdtool`图像参数的例子非常少。这里主要讲几个绘图可以使用参数。 11 | 12 | nginx-rrd 生成图像的文件是 `nginx-graph.pl`,其中 13 | ```` 14 | RRDs::graph "$img/requests-$ServerName-$period.png", 15 | ..... 16 | ```` 17 | 这里开始就是绘图的参数了,每个参数一行。每行`,`结束,语句`;`结束。 18 | 19 | #### 1. 中文支持 20 | 21 | 添加一行 22 | 23 | ``` 24 | "-n","TITLE:10:'/usr/share/fonts/zh_CN/SIMHEI.TTF'", 25 | ``` 26 | `SIMHEI.TTF`从Windows系统拷贝就可以。 27 | 28 | #### 2. 修改样式 29 | 30 | 原始的参数: 31 | 32 | ``` 33 | "LINE2:total#FFD300:Total:STACK", 34 | ``` 35 | 其中 36 | 37 | `LINE2`代表线条的粗细(像素),可选1-3。其实3个粗细都不好看,默认是`LINE2`(每个点2像素)。 38 | 39 | `total`代表`.rdd`文件中对应的变量 40 | 41 | `#FFD300`当然是代表颜色了 42 | 43 | `Total`是图例的名字 44 | 45 | `STACK`是堆叠图,默认不带这个参数 46 | 47 | 这个样式不像MRTG或者Cacti,仅仅会画出线条。 48 | 49 | 修改`LINE2`为`AREA`,变成类似MRTG或Cacti的样式: 50 | 51 | ``` 52 | "AREA:total#FFD300:连接数(Total):STACK", 53 | ``` 54 | #### 3. 增加平滑 55 | 56 | ``` 57 | "--slope-mode", 58 | ``` 59 | 默认`rrdtool`绘图是画水平线,这个参数可以画比较流畅的线性。 60 | 61 | #### 4. 效果图 62 | 63 | ![image](upload/nginx-rrd.png) 64 | 65 | #### 5.数据抓取 66 | 67 | 一些基本参数是由`nginx-rrd.conf`文件完成,可以监控多个nginx主机,用空格分隔。 68 | 69 | ``` 70 | # server_url;server_name 71 | SERVERS_URL="http://127.0.0.1/status;127.0.0.1 http://localhost/status;localhost" 72 | ``` 73 | 对于每个目标,用`;`分隔,`server_url`是nginx-rrd可以访问的url地址,`server_name`是生成图像的标题,可以随便命名。 74 | 75 | *** 76 | 欢迎 [加入我们整理资料](https://github.com/bg6cq/ITTS) 77 | -------------------------------------------------------------------------------- /security/yubikey/README.md: -------------------------------------------------------------------------------- 1 | ## [原创] 人人都需要一个yubikey 2 | 3 | 本文原创:**中国科学技术大学 张焕杰** 4 | 5 | 修改时间:2019.01.29 6 | 7 | ## 一、啥是yubikey 8 | 9 | 就是下图的东西,带有一个触摸按键。可以是USB-A接口,也可以是USB-C接口;可以挂在钥匙链上,也可以一直插在计算机的USB口。 10 | 11 | | YUBIKEY 5 NFC | YUBIKEY 5 Nano | YUBIKEY 5C | YUBIKEY 5C NANO | 12 | | :----------------- | :-------- | :-------- | :-------- | 13 | | ![5NFC](img/YubiKey-5-NFC.png) | ![5Nano](img/YubiKey-5-Nano.png) | ![5C](img/YubiKey-5C.png) | ![5C](img/YubiKey-5C-Nano.png) 14 | 15 | 以上四种型号功能几乎相同,唯独5NFC增加了NFC通信支持(手机使用方便)。 16 | 17 | 原厂分别是45$、50$、50$、60$,taobao价格在400元-500元。我买了最左和最右边的。 18 | 19 | ## 二、yubikey有啥用 20 | 21 | 非对称加密算法是目前解决各种安全问题的基石,它依赖于以下几点: 22 | 23 | | 要点 | 内容 | 24 | | :----- | :----- | 25 | | 公钥无法推算出私钥 | 算法保证 | 26 | | 私钥保密存放 | 一旦私钥泄漏,所有基础都没了 | 27 | 28 | yubikey用来存放私钥,且只能灌入私钥,永远不能读出,彻底解决私钥泄漏问题。 29 | 30 | 需要加密、签名、认证等操作时,计算机把信息通过USB口发给yubikey,由yubikey完成具体工作。 31 | 32 | ## 三、yubikey能干啥 33 | 34 | | 功能 | 应用场景 | 35 | | :----------------- | :-------- | 36 | | 身份认证 | yubikey支持FIDO U2F、FIDO2等身份认证,Google、Facebook、Github、Dropbox等大厂均已支持 | 37 | | SSH | 支持ssh私钥认证,这可是系统管理员最常用的功能 | 38 | | OpenPGP | 支持GPG的加密、签名等操作,用gpg签名代码再也不怕私钥泄漏 | 39 | 40 | 敲重点:使用SSH或PGP时,有个agent forwarding功能非常好用,太方便了。 41 | 也就是自己的PC机上插了yubikey,利用ssh登录到服务器S,在服务器S上执行ssh连接其他服务器或者 42 | 使用gpg时,仍旧可以使用PC机上的yubikey里存放的私钥来完成工作。 43 | 44 | ## 四、yubikey安全吗 45 | 46 | * yubikey宣称私钥永远不能被读出。 47 | * 有PIN码保护,使用私钥前要输入PIN码。PIN码错误几次后锁死。 48 | * 有admin PIN码保护,灌入私钥或解锁PIN码需要输入admin PIN码。admin PIN码错误几次后彻底锁死,可以扔了。 49 | * 有触摸确认过程,每次使用私钥前可以增加触摸按键确认动作,避免私钥被偷偷利用。 50 | 51 | 52 | *** 53 | 欢迎 [加入我们整理资料](https://github.com/bg6cq/ITTS) 54 | -------------------------------------------------------------------------------- /app/www/httpmonitor/README.md: -------------------------------------------------------------------------------- 1 | ## [原创] 使用httptest监测网站服务 2 | 3 | 本文原创:**宣城职业技术学院 刘石** 4 | 5 | 修改时间:2019.05.06 6 | 7 | 8 | ## 前言 9 | 10 | 为保证站点在访问异常的情况下管理员可实时收到通知,及时进行处理,快速恢复站点访问。 11 | 12 | 使用中国科学技术大学 张焕杰 开发的 [httptest](https://github.com/bg6cq/httptest),在站点异常时实时发送短信给管理员,管理员第一时间得到服务正常异常报告。 13 | 14 | 程序详细代码见:https://github.com/bg6cq/httptest 15 | 16 | ## 安装配置 17 | 18 | ### 系统环境 19 | 20 | * 系统:CentOS7 64位 21 | * CPU:2核 22 | * 内存:2G 23 | * 硬盘:30G 24 | 25 | ### 安装过程 26 | 27 | ``` 28 | yum -y update 29 | reboot 30 | yum -y install git curl gcc openssl-devel 31 | cd /usr/src 32 | git clone https://github.com/bg6cq/httptest 33 | cd httptest 34 | make 35 | cd httpmonitor 36 | ``` 37 | 38 | ### 配置服务 39 | 40 | /usr/src/httptest/httpmonitor 目录下共有monitor.sh、urllist.txt两个文件 41 | 42 | * monitor.sh为Shell执行程序,用户可在里面自定义各项参数 43 | * urllist.txt为要监控的站点信息文件 44 | 45 | urllist.txt 46 | ``` 47 | # 格式为: 要监测的URL 记数文件名 手机号码 48 | https://www.baidu.com www.baidu.com 18905630000 49 | https://www.qq.com www.qq.com 18905630000 50 | https://www.xcvtc.edu.cn www.xcvtc.edu.cn 18905630000 51 | ``` 52 | 53 | monitor.sh 54 | ``` 55 | COUNT=2 # 设置出现几次连续错误才开始发通知,未恢复前只发一次 56 | 57 | log () 58 | { a=`date`; 59 | echo $a $1 >> ${LOGFILE} 60 | #sendsms $2 $1, $2是手机号码,$1是消息 这里可根据自己的情况设置发送短信的内容,我的设置如下 61 | curl "http://www.test.com/SendSms?phone=$2&content=$1" 62 | } 63 | ``` 64 | 65 | 两个msg为定义异常和恢复正常发送短信内容的变量,可根据自己的情况进行设置。 66 | 67 | ### 设置定时任务 68 | 69 | ``` 70 | crontab -e 71 | */1 * * * * sh /usr/src/httptest/httpmonitor/monitor.sh >/dev/null 2>/dev/null 72 | ``` 73 | 74 | 此时系统已可正常运行,当有站点访问异常时,便会发送短信进行通知。 75 | 76 | 77 | *** 78 | 欢迎 [加入我们整理资料](https://github.com/bg6cq/ITTS) 79 | -------------------------------------------------------------------------------- /other/bark/README.md: -------------------------------------------------------------------------------- 1 | ## [原创] 自建bark-server向苹果手机发送通知消息 2 | 3 | 本文原创:**中国科学技术大学 张焕杰** 4 | 5 | 修改时间:2024.12.04 6 | 7 | [Bark](https://apps.apple.com/cn/app/bark-给你的手机发推送/id1403753865) 是苹果手机上方便接收通知信息的轻量级App,经常被用于发送日常管理中的通知消息,本文简介自建服务器的方法。 8 | 9 | ### 1. 软件获取 10 | 11 | [https://github.com/Finb/bark-server](https://github.com/Finb/bark-server)可以下载编译好的版本,或使用docker运行。 12 | 13 | ### 2. 运行 14 | 15 | 直接运行程序或使用docker运行程序。 16 | ``` 17 | ./bark-server --addr 0.0.0.0:8080 --data ./bark-data 18 | ``` 19 | 20 | bark-server不支持https,为了方便,可以使用nginx代理提供https访问 21 | ``` 22 | location ^~ /bark/ { 23 | keepalive_timeout 0; 24 | proxy_pass http://127.0.0.1:8080/; 25 | } 26 | ``` 27 | 使用以上配置,将来可以用 https://x.x.x.x/bark/ 来访问。 28 | 29 | ### 3. 工作原理 30 | 31 | #### 3.1 注册过程 32 | 33 | 手机有一个64字节长的Device Token,使用该Device Token访问 34 | 35 | ``` 36 | http://x.x.x.x:8080/register?devicetoken=64字节长的device_token 37 | ``` 38 | 在Bark Server中注册,返回长度22字节的device_key。 39 | 40 | 成功会显示如下内容 41 | ``` 42 | {"code":200,"message":"success","data":{"key":"af6kyzEXwb3wfV7fwThbhB","device_key":"af6kyzEXwb3wfV7fwThbhB","device_token":"********"},"timestamp":1733282760} 43 | ``` 44 | 45 | 查看手机的Device Token,可以在苹果手机安装Bark app后,在 设置/Device Token 处单击,将手机的Device Token拷贝到粘贴板,长度为64字节。 46 | 47 | #### 3.2 发信息过程 48 | 49 | ``` 50 | curl http://x.x.x.x:8080/af6kyzEXwb3wfV7fwThbhB/title/msg 51 | ``` 52 | 其中af6kyzEXwb3wfV7fwThbhB是上一步的device_key,访问上述URL后,手机可以收到消息。 53 | 54 | 55 | ### 4. 使用 56 | 57 | 安装自己的Bark Server后,在手机Bark App中点击右上角 + 号,添加自己的服务器。 58 | 59 | 添加后,Bark App会自动完成register注册过程,将发送消息的URL显示在 App 中。 60 | 61 | 62 | 63 | 参考: 64 | 65 | * https://github.com/Finb/bark-server 66 | 67 | 68 | 69 | *** 70 | 欢迎 [加入我们整理资料](https://github.com/bg6cq/ITTS) 71 | -------------------------------------------------------------------------------- /other/test/c9.md: -------------------------------------------------------------------------------- 1 | ## C9高校网站传输速度大比拼 2 | 3 | 本文原创:**中国科学技术大学 张焕杰** 4 | 5 | 修改时间:2019.05.27 6 | 7 | ### 1. 测试方法 8 | 9 | 使用 http://17ce.com ,依次对以下URL测试,截图并记录中位数的访问速度。 10 | 11 | ``` 12 | https://www.tsinghua.edu.cn/publish/thu2018en/11490/20190514123145278682465/20190514123259685120480.jpg 13 | https://www.pku.edu.cn/images/content/2019-05/20190504221013750682.jpg 14 | https://www.sjtu.edu.cn/resource/upload/201904/20190429_021503_628.jpg 15 | http://www.zju.edu.cn/_upload/article/images/5f/cf/bb95e0f64feab2d04209db15ee13/c530f85b-f404-4f40-9b46-b3772e540ac0.jpg 16 | http://www.fudan.edu.cn/files/slider/1920/1457.jpg 17 | https://www.ustc.edu.cn/.well-known/test.png 18 | http://www.hit.edu.cn/_upload/article/images/1d/a3/a4fadc444265acc4d52187808806/856dadb5-1dc8-472a-a656-dbf5a575e8b4.jpg 19 | https://www.nju.edu.cn/_upload/article/images/6e/50/94c71d314c6ab0d168e3eace12bd/6bd7e24e-9126-459c-9558-d2d46ce4d0cb.jpg 20 | http://www.xjtu.edu.cn/images/14/12/11/1tf5znre9c/20190506011.jpg 21 | 22 | ``` 23 | 24 | ### 2. 测试结果 25 | 26 | 注: fudan 实际访问很快,不知道为何17ce测速异常慢,因此不列入下面结果。 27 | 28 | | 学校 | 传输速度 | 说明 | 29 | | --- | -----: | ----- | 30 | |ustc | 4.3MB/s | 多ISP服务 | 31 | |pku | 3.0MB/s | 多ISP服务 | 32 | |tsinghua |1.5MB/s | | 33 | |zju | 1.5MB/s | 多ISP服务,但是部分节点不稳定 | 34 | |sjtu | 1.4MB/s | | 35 | |nju | 0.9MB/s | | 36 | |xjtu | 0.8MB/s | | 37 | |hit | 0.4MB/s | | 38 | 39 | ### 3. 各校测试截图 40 | 41 | ![](c9/ustc.png) 42 | 43 | ![](c9/pku.png) 44 | 45 | ![](c9/tsinghua.png) 46 | 47 | ![](c9/zju.png) 48 | 49 | ![](c9/sjtu.png) 50 | 51 | ![](c9/nju.png) 52 | 53 | ![](c9/xjtu.png) 54 | 55 | ![](c9/hit.png) 56 | 57 | ![](c9/fudan.png) 58 | 59 | 60 | 61 | *** 62 | 欢迎 [加入我们整理资料](https://github.com/bg6cq/ITTS) 63 | -------------------------------------------------------------------------------- /app/ftp/proftpd-ldap.md: -------------------------------------------------------------------------------- 1 | # 在 ProFTPd 中配置 LDAP 认证 2 | 3 | 作者:西北农林科技大学 卞一帆 4 | 5 | ## 为什么要配置 LDAP 认证 6 | 7 | 通过 LDAP 方式接入学校的统一身份认证,使得服务器的审计更加准确,便于追踪用户的行为。 8 | 9 | ## 环境准备 10 | 11 | 1. Linux 服务器( CentOS 和 Debian 系均可,本例中使用 CentOS 6.9 ) 12 | 2. 安装 ProFTPd (本例中使用编译安装,参考[官方文档](http://www.proftpd.org/docs/howto/Compiling.html)) 13 | 14 | ## 配置 TLS 15 | 16 | 本例选择在 `proftpd.conf` 中配置一个 VirtualHost 。如果需要配置到全局,只需要将 TLS 相关指令放到全局配置里。用方括号包括的内容需要根据实际情况修改。 17 | 18 | ``` 19 | 20 | ServerName [Your Server Name] 21 | ServerIdent on "Use Central Authentication System to access this FTP Server" 22 | DefaultRoot [Path To FTP Root] 23 | 24 | User ftp # change this to adapt this to your server 25 | Group ftp # change this to adapt this to your server 26 | # only use LDAP 27 | AuthOrder mod_ldap.c 28 | LDAPServer [LDAP Server IP or domain] 29 | LDAPBindDN [LDAP login user] [LDAP login user password] 30 | LDAPUsers [Base DN] [User selector] 31 | # example: LDAP Users "dc=nwafu,dc=edu,dc=cn" "(uid=%u)" 32 | LDAPSearchScope subtree 33 | LDAPDefaultUID 15 # change this to adapt this to your server, uid of user ftp 34 | LDAPDefaultGID 50 # change this to adapt this to your server, gid of group ftp 35 | LDAPForceDefaultGID on 36 | LDAPForceDefaultUID on 37 | RequireValidShell off 38 | LDAPGenerateHomedir on 39 | LDAPGenerateHomedirPrefix [FTP Root] 40 | LDAPForceGeneratedHomedir on 41 | LDAPGenerateHomedirPrefixNoUsername on 42 | 43 | LDAPLog [Path to LDAP log] 44 | 45 | # Your own configuration goes here 46 | 47 | ``` 48 | -------------------------------------------------------------------------------- /security/ca/README.md: -------------------------------------------------------------------------------- 1 | ## [原创]自建CA签发证书 2 | 3 | 本文原创:**中国科学技术大学 张焕杰** 4 | 5 | 修改时间:2018.12.23 6 | 7 | 8 | 仅仅使用openssl,不依赖其他配置文件,自建CA并签发服务器证书。 9 | 10 | ## 一、CA私钥和自签证书 11 | 12 | 执行以下命令,回答提示问题,生成CA的证书。 13 | 14 | ``` 15 | openssl genrsa -out rootCA.key 4096 16 | openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 7000 -out rootCA.crt 17 | ``` 18 | rootCA.key 是CA私钥,要存好了。 19 | 20 | rootCA.crt 是自签的证书,有效期7000天。这个文件可以交给每个客户端,加到信任根证书CA。 21 | 22 | 执行`openssl x509 -in rootCA.crt -text`可以查看证书。 23 | 24 | 25 | ## 二、签发服务器证书 26 | 27 | 创建一个配置文件 `mycert.conf`,内容如下: 28 | ``` 29 | [ req ] 30 | default_bits = 2048 31 | default_md = sha256 32 | distinguished_name = req_distinguished_name 33 | attributes = req_attributes 34 | x509_extensions = v3_ca # The extentions to add to the self signed cert 35 | string_mask = utf8only 36 | 37 | [ req_distinguished_name ] 38 | 39 | [ req_attributes ] 40 | 41 | [ v3_ca ] 42 | subjectKeyIdentifier=hash 43 | authorityKeyIdentifier=keyid:always,issuer 44 | basicConstraints = CA:true 45 | ``` 46 | 47 | 创建一个签发脚本 `gencrt.sh`,内容如下(请修改C=CN...): 48 | 49 | ``` 50 | #!/bin/bash 51 | 52 | openssl genrsa -out $1.key 2048 53 | 54 | openssl req -new -subj "/C=CN/ST=Anhui/L=Hefei/O=USTC/OU=NIC/CN=$1" \ 55 | -reqexts SAN \ 56 | -config <(cat mycert.conf <(printf "[SAN]\nsubjectAltName=DNS:$1")) \ 57 | -key $1.key -out $1.csr 58 | 59 | openssl x509 -req -CA rootCA.crt -CAkey rootCA.key -CAcreateserial \ 60 | -sha256 -days 3650 -extfile <(printf "subjectAltName=DNS:$1") \ 61 | -in $1.csr -out $1.crt 62 | ``` 63 | 64 | 执行 `bash gencrt.sh test.ustc.edu.cn`既可以产生3个文件,分别是: 65 | ``` 66 | test.ustc.edu.cn.key 服务器私钥 67 | test.ustc.edu.cn.csr 证书申请文件,无用了 68 | test.ustc.edu.cn.crt 服务器证书 69 | ``` 70 | 71 | 执行`openssl x509 -in test.ustc.edu.cn.crt -text`可以查看证书。 72 | 73 | 74 | *** 75 | 欢迎 [加入我们整理资料](https://github.com/bg6cq/ITTS) 76 | -------------------------------------------------------------------------------- /other/wireshark/README.md: -------------------------------------------------------------------------------- 1 | ## [原创] 2张图1分钟快速定位TCP故障原因 2 | 3 | 本文原创:**中国科学技术大学 张焕杰** 4 | 5 | 修改时间:2019.05.29 6 | 7 | 影响TCP性能的因素有链路带宽、链路延迟、链路丢包率、双方流控算法等4个因素。当TCP实际传输带宽远低于链路带宽时,我们称为TCP有故障。 8 | 9 | 本文介绍的方法,使用wireshark绘制的2张图,可以在1分钟内快速判断TCP故障原因。 10 | 11 | Wireshark是一个免费数据包抓取和分析软件,它绘制的两种图可以用来快速判断TCP故障的原因。 12 | 13 | ### 一、帮助定位TCP故障的图 14 | 15 | * I/O Graph 16 | 17 | I/O Graph显示的某个时间间隔内传输的数据包数,可以快速判断是否因为链路丢包引起TCP故障。为了有效查看TCP故障,我们可以把间隔设置为1ms。 18 | 19 | 下图是一个正常的I/O Graph,数据包相对均匀的传输。中间有空档是因为链路延迟,等待对方确认。 20 | 21 | ![Good](img/good-io.png) 22 | 23 | 下图是相对异常的I/O Graph,中间有若干时间(长达0.5秒)没有数据包传输,说明链路存在间歇性丢包严重的情况。 24 | 25 | ![Bad](img/fd2-io.png) 26 | 27 | * TCP流序列号图 28 | 29 | TCP流序列号图显示某个方向的TCP序列号随时间的变化情况,可以快速判断是否因为流控问题引起TCP故障。为了有效查看TCP故障,我们需要单击"切换方向"选择从服务器-->客户端的流方向。 30 | 31 | 下图是一个正常的TCP流序列号图,序列号随时间逐步增长,且增幅越来越大(传输窗口越来越大)。 32 | 33 | ![Good](img/good-ts.png) 34 | 35 | 下图是一个异常的TCP流序列号图,序列号随时间逐步增长,但是增幅保持不变,说明传输窗口被限制了,导致实际传输慢。 36 | 37 | ![Bad-1](img/bad-ts-1.png) 38 | 39 | 下图是有重传现象的TCP流序列号图。实际网络中,少量重传是正常的。 40 | 41 | ![Bad-2](img/fd1-ts.png) 42 | 43 | 下图是有较多丢包,大量重传现象的TCP流序列号图(Wireshark中可以通过鼠标缩放查看)。 44 | 45 | ![Bad-2](img/fd2-ts.png) 46 | 47 | 通过以上两种图,可以很方便的分析TCP故障原因。 48 | 49 | 下面介绍生成以上两种图的步骤和方法。 50 | 51 | ### 二、获取数据包抓包文件 52 | 53 | 生成上述两种图,首先需要获取数据包抓包文件。获取数据包抓包文件有两种方式: 54 | 55 | 1. 直接使用Wireshark抓包 56 | 57 | 可以方便的抓取本机收发的数据包 58 | 59 | 2. 使用tcpdump抓包 60 | 61 | `tcpdump -i ethx -s0 -w dump.cap host x.x.x.x`可以抓取与x.x.x.x主机通信的数据包并存入文件 dump.cap 62 | 63 | Wireshark 可以直接打开文件 dump.cap 64 | 65 | ### 三、获取需要关注的TCP流 66 | 67 | Wireshark获取到抓包后,选中需要关注TCP流中任一数据包时,单击鼠标右键,选择"对话过滤器/TCP",可以将该TCP流的所有数据包选中。 68 | 69 | 此时在菜单 "文件/导出特定分组" 中可以将需要关注的TCP流数据包存为单独文件。 70 | 71 | ### 四、生成图表 72 | 73 | Wireshark打开仅仅包含一个TCP流数据包的单独文件,使用菜单 "统计/IO图表" 即可绘制I/O Graph,建议选择间隔为 1ms 以方便观察。 74 | 75 | 使用菜单 "统计/TCP流图形/时间序列(Stevens)" 即可绘制TCP流序列号图,需要单击"切换方向"选择从服务器-->客户端的流方向。 76 | 77 | 78 | 79 | *** 80 | 欢迎 [加入我们整理资料](https://github.com/bg6cq/ITTS) 81 | -------------------------------------------------------------------------------- /app/dns/dns_with_git/README.md: -------------------------------------------------------------------------------- 1 | ## [原创] git辅助DNS服务器的运行 2 | 3 | 本文原创:**中国科学技术大学 张焕杰** 4 | 5 | 修改时间:2018.06.21 6 | 7 | DNS服务器一般有若干台,这些服务器间需要数据同步。 8 | 9 | 传统的方式使用zone transfer,其中一台DNS服务器做为主服务器,其他服务器作为从服务器。 10 | 从服务器定时查询主服务器的zone文件SOA处的序列号,一旦发现序列号比自己的大,就是用zone transfer协议获取最近的zone文件。 11 | 12 | 我们使用git来做这些同步,相比之下优点如下: 13 | 14 | * 使用多种hook机制,可以做到主DNS服务器文件变更后,立即触发其他服务器更新配置,并重启bind进程,立即生效 15 | * 每个服务器上均保留有所有变更记录,任何服务器损坏都不会丢失配置 16 | 17 | 具体做法如下: 18 | 19 | 首先有套可以工作的git,我们是自己建立的gitlab ce服务器。 20 | 21 | ![data_flow](data_flow.jpg) 22 | 23 | ## 一、主DNS服务器 24 | 25 | 1.1 设置`pre-commit` hook,只有一条命令,用于检查配置是否正确,只有正确的配置,才会允许commit 26 | ``` 27 | #!/bin/sh 28 | /sbin/service named configtest 29 | ``` 30 | 31 | 1.2 设置`post-commit` hook,用于重启自己的bind进程,并push到 git 服务器 32 | 33 | ``` 34 | #!/bin/sh 35 | /sbin/service named restart 36 | 37 | git push origin master 38 | ``` 39 | 40 | ## 二、git server 41 | 42 | 我们使用的是gitlab ce,在DNS项目的Settings/Integrations中对每个辅助DNS服务器增加一个WEB hook,触发条件是 43 | `Push events`,URL是 http://x.x.x.x/cgi-bin/dnshook,其中x.x.x.x是每个辅助DNS服务器的IP地址。 44 | 45 | ## 三、辅助DNS服务器 46 | 47 | 3.1 webook的cgi程序 48 | 49 | `vi dnshook.c`,内容如下(假定named配置文件在/named目录下): 50 | ``` 51 | #include 52 | #include 53 | 54 | void main() 55 | { 56 | setuid(0); 57 | system("cd /named; git pull"); 58 | } 59 | ``` 60 | 执行如下命令,编译并放到www服务器目录下: 61 | ``` 62 | gcc -o dnshook dnshook.c 63 | cp dnshook /var/www/cgi-bin 64 | chmod u+s /var/www/cgi-bin/dnshook 65 | ``` 66 | 67 | 3.2 设置`post-merge`和`post-update` hook,内容相同,均为如下: 68 | ``` 69 | #!/bin/sh 70 | 71 | /sbin/service named configtest 72 | if [ $? = 0 ] ; then 73 | killall -9 named 74 | /sbin/service named start 75 | fi 76 | ``` 77 | 78 | ## 四、使用 79 | 80 | 管理员修改主域名服务器上配置后,只要执行 81 | ``` 82 | git commit -a -m "msg" 83 | ``` 84 | 即可触发工作流程,完成配置文件检查、重启bind、commit、push到git服务器,并由git服务器触发其他辅助域名服务器来pull变更,并检查配置后,重启各自的bind,实现域名配置的生效。 85 | 86 | *** 87 | 欢迎 [加入我们整理资料](https://github.com/bg6cq/ITTS) 88 | -------------------------------------------------------------------------------- /app/nginx/nginx-opt/README.md: -------------------------------------------------------------------------------- 1 | ## nginx服务器优化 2 | 3 | **中国科学技术大学 张焕杰** 4 | 5 | 创建时间:2018.12.20 6 | 7 | nginx服务器优化有两方面工作,一是增加nginx单个进程打开的文件数,二是优化Linux系统的网络参数。 8 | 9 | 10 | ### 1. nginx打开文件数优化 11 | 12 | Linux系统默认的单个进程可以打开1024个文件,这对nginx来说远远不够。如果不调整,很容易因为连接多占满文件数,导致出现明显的异常。 13 | 14 | 检查运行的nginx进程打开文件数,可以用`ps ax | grep nginx`找到nginx的pid,然后 `grep "Max open files" /proc/$pid/limits` 看到限制值。 15 | 16 | 注意nginx有多个进程,要分别检查master和worker进程的打开文件数。 17 | 18 | 网上查到的很多文档有错误和误导的地方,表现在下面的地方: 19 | 20 | * 修改 /etc/security/limits.conf 系统重启时对nginx无效 21 | 22 | limits.conf只在用户执行login时生效,而系统重启nginx启动时并未执行login过程,因此无效。 23 | 24 | 系统启动后,使用root用户执行 service nginx restart可以生效。也就是修改limits.conf后,每次系统重启,都需要root执行一次service nginx restart才行。 25 | 26 | * nginx.conf中设置worker_rlimit_nofile 会带来隐患 27 | 28 | nginx.conf中设置worker_rlimit_nofile虽然可以加大nginx worker进程的文件数,但是并不加大nginx master进程的文件数,导致在nginx reload时碰到错误无法正常生效。 29 | 30 | 修改配置后,使用service nginx reload可以不中断服务而生效。如果nginx reload无法使用,对nginx的持续服务有严重影响。 31 | 32 | 正确的增加nginx打开文件数分2步: 33 | 34 | #### 1.1 编辑文件`/etc/sysctl.d/file-max.conf`,增加1行: 35 | ``` 36 | echo "fs.file-max = 655360" > /etc/sysctl.d/file-max.conf 37 | ``` 38 | 39 | #### 1.2 想办法在启动nginx前执行`ulimit -HSn 655360` 40 | 41 | 不同的系统具体配置方式不一样,主要有: 42 | 43 | * CentOS 6等使用sysvinit的系统 44 | 45 | 修改`/etc/sysconfig/nginx`,增加一行即可。 46 | ``` 47 | ulimit -HSn 655360 48 | ``` 49 | 50 | * CentOS 7、Ubuntu 18.04 等使用systemd的系统 51 | 52 | 编辑文件`/etc/systemd/system/nginx.service.d/my-limit.conf`,增加[Service]段并添加行: 53 | ``` 54 | mkdir /etc/systemd/system/nginx.service.d/ 55 | echo "[Service]" > /etc/systemd/system/nginx.service.d/my-limit.conf 56 | echo "LimitNOFILE=655360" >> /etc/systemd/system/nginx.service.d/my-limit.conf 57 | ``` 58 | 59 | ### 2. Linux网络参数优化 60 | 61 | 如果可能,最好不开启conntrack连接跟踪。如果开启conntrack,可以参考以下链接优化 62 | 63 | * https://github.com/bg6cq/nginx-centos-6 64 | * https://github.com/bg6cq/nginx-centos-7 65 | 66 | 67 | *** 68 | 欢迎 [加入我们整理资料](https://github.com/bg6cq/ITTS) 69 | -------------------------------------------------------------------------------- /app/ntp/README.md: -------------------------------------------------------------------------------- 1 | # 搭建 NTP 服务器 2 | 3 | 本文原创:**西北农林科技大学 卞一帆** 4 | 5 | 修改时间:2017/12/21 6 | 7 | ## 优点 8 | 9 | 减少各服务器时间同步时的延迟,让服务器时间更加准确。 10 | 11 | ## 步骤 12 | 13 | ### 使用 Docker Container 14 | 15 | #### 安装 Docker 16 | 17 | 请参考 Docker 官方文档:[https://docs.docker.com/engine/installation/](https://docs.docker.com/engine/installation/) 18 | 19 | #### 更换 Docker Hub 镜像源 (可选) 20 | 21 | 受国内网络环境影响,直接连接 Docker Hub Registry 速度很慢。可以将 Docker Hub Registry 更换为阿里云提供的镜像以提升部署速度。 22 | 23 | 获取方法: 24 | 25 | 1. 使用阿里云账号登录 [阿里云容器 Hub 服务控制台](https://cr.console.aliyun.com/),左面的加速器帮助页面会显示为每个账号独立分配的镜像地址,格式为 `<系统分配前缀>.mirror.aliyuncs.com`。 26 | 27 | 2. 修改 Docker 配置文件 `/etc/docker/daemon.json` 为: 28 | 29 | ``` 30 | { 31 | "registry-mirrors": [""] 32 | } 33 | ``` 34 | 35 | 本方法仅适用于 Docker 1.10 以上版本。老版本需要修改不同的配置文件。 36 | 37 | 3. 重启 Docker 服务:`sudo systemctl restart docker` 38 | 39 | #### 更换 Docker 容器 IP 段 40 | 41 | Docker 默认为容器分配 `172.17.0.0/16` 网段的 IP 地址。由于我校内网有线接入分配 IP 段为 `172.16.0.0/12` 会与容器 IP 冲突导致部分 IP 段用户无法访问,因此需要更换。编辑 `/etc/docker/daemon.json` : 42 | ``` 43 | { 44 | "registry-mirrors": [""], 45 | "bip": "192.168.128.1/17" 46 | } 47 | ``` 48 | 保存后应重启 Docker 服务。 49 | 50 | #### 拉取镜像 51 | 52 | 执行 `sudo docker pull cloudwattfr/ntpserver:latest`。 53 | 54 | #### 启动容器 55 | 56 | 执行 `docker run -d --name ntpservice -p 123:123 cloudwattfr/ntpserver`。 57 | 58 | 参数解释: 59 | - `-d`: 即 `--detach`,使容器以非交互形式在后台运行。 60 | - `--name ntpservice`: 将容器名字指定为 `ntpservice` 。 61 | - `-p 123:123`: 在主机 123 端口与容器 123 端口间建立映射。 62 | 63 | ### 使用软件包 64 | 65 | 1. 安装 ntp : `sudo apt-get install -y ntp` (Ubuntu/Debian) 或 `sudo yum install ntp` (CentOS) 66 | 2. 配置 `/etc/ntp.conf` ,将上游修改为中国境内的 NTP 服务器: 67 | ``` 68 | pool 0.cn.pool.ntp.org iburst 69 | ``` 70 | 可以在后面添加多个服务器。 71 | 72 | 3. 启动 ntp 服务: `sudo systemctl enable ntp && sudo systemctl start ntp` 73 | 74 | ### 配置防火墙 75 | 76 | 这里使用 `firewalld` 配置防火墙规则,默认区域为 dmz 。 77 | 78 | ``` 79 | sudo firewall-cmd --zone=dmz --add-service=ntp --permanent 80 | sudo firewall-cmd --reload 81 | ``` 82 | -------------------------------------------------------------------------------- /other/util/README.md: -------------------------------------------------------------------------------- 1 | ## [原创] 常用脚本 2 | 3 | 本文原创:**中国科学技术大学 张焕杰** 4 | 5 | 修改时间:2025.08.13 6 | 7 | ### 1. sshd pubkey 与sshd日志的SHA256显示对应 8 | 9 | sshd登录日志中会显示pubkey的SHA256 经过base64编码的结果,如下: 10 | 11 | ``` 12 | Accepted publickey for root from ... port 45344 ssh2: RSA SHA256:cmGGoa7Ft4vrgd+Zi1NSRODBzcRGTjtM3GMOdgsKsl0 13 | ``` 14 | 这一段对应的是pubkey 15 | ``` 16 | ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDMIOGPraZIjr+a7pmzar/X2iQy/oS6LvNazVTRfYB1TOQpnWHjDPwJOJseapVxH9Rka2ODJonHvbhJzl/KKqyzay1GY82PRWoj2QXNGhPgNpQd3hztKV2ukP403+wFFbyBvdp3CTfIEmK35vXraGZWmpZXlYIOtPxbI/1pYQTRYd2xFpjOorAQBdUKIzDfK+jQplqcjfoffIs8E2dvcKRgtXSpsNbbqye97h8+GCA2SI3D0l51zbMqSOw+54a8mMPIcBftk8PHcHjPxbjaWfOEAzk9/Ly4cYwZ51+BdEWu5ed5paNNLHr7ty2jJJTSlSF8+PoAc73x+r5JIC4Yxt436iEVYk8DjeVmBzGD1xL112y6XqoyVeey9RbkmdrUon3NVD/yLu86DWVHqvyt6JY+6V/LKYUGT0okR78K0Xho4/rXD7NtME3hDBquC6QqkPdKWwfdCB9fDoGfq6BGxanH2T9lnOMX2WnN7QOsJ1BBqtQDx2Ruhc20xPvYmPaxUwC7Wxd4F4zCEAsbD46oLaWlC5hc6DhTnv/kLU89RGinv/pUDXhxqoqQi5YmGVt1Pnw+nK6Ixz/BhEQmCvRJwSK1vrNoKkasQOqEkK8V51HHRPaeTl/54YZccKT+T/kOw6t4oGjFlws60VjxPHrn6uukQBrsX30TPcVl2P+VgDKOjQ== 17 | ``` 18 | 19 | 将pubkey转换成SHA256的base64脚本如下: 20 | ``` 21 | cat authorized_keys | 22 | awk '{ print $2 }' | # Only the actual key data without prefix or comments 23 | base64 -d | # decode as base64 24 | sha256sum | # SHA256 hash (returns hex) 25 | awk '{ print $1 }' | # only the hex data 26 | xxd -r -p | # hex to bytes 27 | base64 28 | ``` 29 | 输出的结果是 30 | ``` 31 | cmGGoa7Ft4vrgd+Zi1NSRODBzcRGTjtM3GMOdgsKsl0 32 | ``` 33 | 34 | 35 | ### 2. 显示文件在系统中的建立时间 36 | 37 | 黑客入侵系统时经常会修改文件的修改时间,而很少去修改文件的建立时间。下面的脚本`show_birthtime.sh`可以显示一个目录下文件的建立时间。 38 | ``` 39 | #!/bin/bash 40 | # 显示一个目录下文件的创建时间 41 | # 定义要遍历的目录,如果没有参数,则使用当前目录 42 | dir=${1:-.} 43 | 44 | find "$dir" -type f -print | while read file; do 45 | birth_time=$(stat -c '%w' "$file") 46 | printf "%s %s\n" "$birth_time" "$file" 47 | done 48 | ``` 49 | 使用例子:获取/usr下的文件建立时间 50 | 51 | ``` 52 | ./show_birthtime.sh /usr | sort -n 53 | ``` 54 | 55 | 56 | 57 | *** 58 | 欢迎 [加入我们整理资料](https://github.com/bg6cq/ITTS) 59 | -------------------------------------------------------------------------------- /network/switch/tap/README.md: -------------------------------------------------------------------------------- 1 | ## [原创] 初试盛科TAP交换机 2 | 3 | 本文原创:**中国科学技术大学 张焕杰** 4 | 5 | 修改时间:2019.04.18 6 | 7 | 网络出口处需要各种流量镜像,而普通交换机提供的流量镜像功能往往不怎么好用。为此我校采购了上海交大姜开达老师推荐的盛科V580-32X-TAP交换机,专门用于出口流量的镜像分流使用。 8 | 9 | http://www.centecnetworks.com/cn/SolutionList.asp?ID=95 有关于V580-TAP系列设备的介绍相关文档。 10 | 11 | 昨天TAP交换机到货后,进行了配置并上线,初步体验了TAP交换机的基本功能。 12 | 13 | ## 一、镜像需求 14 | 15 | 长期计划是将学校出口链路分光后引入TAP交换机,然后根据需要分流至不同的设备。因分光器还没有采购,目前的流量来自核心交换机镜像口。 16 | 17 | 我校核心交换机有2个镜像输出口,其中第1个接口的流量,需要发送给2台设备,做流量分析使用;第2个接口的TCP流量,需要发送给1台IXCache 缓存服务器的采集口,用来采集用户发出的URL请求。 18 | 19 | 在使用TAP交换机之前,这2个镜像输出口接至1台普通10G交换机,在10G交换机上设置2个镜像组,分别输出给3台设备。在使用普通10G交换机镜像时,有以下不便: 20 | 21 | * 输入接口需要设置隔离,不然1个接口接收的数据包会从另1个输入接口发出 22 | * 镜像组有数量限制,很快可能不够用 23 | * 镜像不灵活,比如第2组输入,只能全镜像输出,无关的UDP流量也被输出了 24 | 25 | ## 二、TAP交换机使用 26 | 27 | V580-32X-TAP交换机共有32个10G接口。连接方式如下图: 28 | 29 | ![TAP](tap.png) 30 | 31 | 交换机上设置了2个tap组,第1个是简单的全镜像,第2个镜像时增加了flow规则,仅仅对tcp流量镜像,相关配置如下: 32 | ``` 33 | flow ixcache-tcp 34 | sequence-num 10 permit tcp src-ip any dst-ip any 35 | exit 36 | ! 37 | tap-group alldump 1 38 | ingress eth-0-1 39 | egress eth-0-2 40 | egress eth-0-4 41 | ! 42 | tap-group ixcache 2 43 | ingress eth-0-17 flow ixcache-tcp 44 | egress eth-0-18 45 | ``` 46 | 47 | 下面是运行一段时间后,show interface看到的接口输出(仅保留统计信息)。 48 | 49 | 从这些统计可以看到,eth-0-1接口的输入,被全镜像到eth-0-2和eth-0-4接口;而eth-0-17接口的输入,TCP包被镜像到eth-0-18接口。 50 | 51 | ``` 52 | tap-switch# show interface eth-0-1 53 | Interface eth-0-1 54 | 5 minutes input rate 8189271675 bits/sec, 1137138 packets/sec 55 | 56 | tap-switch# show interface eth-0-2 57 | Interface eth-0-2 58 | 5 minutes output rate 8186949127 bits/sec, 1136862 packets/sec 59 | 60 | tap-switch# show interface eth-0-4 61 | Interface eth-0-4 62 | 5 minutes output rate 8191219149 bits/sec, 1137600 packets/sec 63 | 64 | tap-switch# show interface eth-0-17 65 | Interface eth-0-17 66 | 5 minutes input rate 5598891465 bits/sec, 884350 packets/sec 67 | 68 | tap-switch# show interface eth-0-18 69 | Interface eth-0-18 70 | 5 minutes output rate 2656587822 bits/sec, 493620 packets/sec 71 | ``` 72 | 73 | *** 74 | 欢迎 [加入我们整理资料](https://github.com/bg6cq/ITTS) 75 | -------------------------------------------------------------------------------- /other/test/README.md: -------------------------------------------------------------------------------- 1 | ## [原创] 网站测试中发现的有趣现象 2 | 3 | 本文原创:**中国科学技术大学 张焕杰** 4 | 5 | 修改时间:2019.05.25 6 | 7 | 2018年建设了 http://ipv6.ustc.edu.cn ,测试跟踪各站点对 IPv6/v4 的 HTTP/HTTPS/HTTP2支持情况。 8 | 9 | 学校的网站,自己校内访问总觉得很满意。但是从其他地方访问,速度、稳定性满意吗?特别是跟兄弟单位网站的对比情况,总是值得探究的话题。 10 | 11 | 近期做了个分布式网站访问测试系统,运行了半个月,发现了一些有趣的现象,分享给大家。 12 | 13 | ### 一、分布式测试系统简介 14 | 15 | 分布式测试系统分两部分: 16 | 17 | 1. 中心端 18 | 19 | 中心端主要是存放测试结果的influxdb和web展示的grafana。 20 | 21 | 2. 测试点(SITE) 22 | 23 | 测试点定期对制定的URL访问测试,记录dns查询时间、tcp连接建立时间、获得第一个响应的时间、传输字节数、传输时间、传输速度等信息。 24 | 并将这些信息提交给中心端,存放到influxdb中。 25 | 26 | 测试点上使用 https://github.com/bg6cq/httptest 完成具体的测试,提交给中心端使用 curl。 27 | 28 | 测试点可参考 https://github.com/bg6cq/ahstatus 建设。 29 | 30 | 为了简化测试点的部署,使用docker方式部署,可以实现完全的自动更新。 31 | 32 | 测试时,为了让结果更有代表性,选择每个网站上大约500KB大小的文件进行测试。 33 | 34 | 向提供测试点运行的学校相关老师表示诚挚感谢! 35 | 36 | 下面是测试结果中一些比较有趣的现象。 37 | 38 | ### 二、为何PKU站点比THU慢 39 | 40 | ![PKU-THU](img/pkuvsthu-1.jpeg) 41 | 42 | 上图是从科大测试点通过IPv6线路访问PKU和THU的下载速度,THU一直稳定4MB/s,而PKU一直稳定2MB/s,每个点是原始数据。 43 | 44 | 科大到PKU/THU间IPv6通信延迟约26ms,带宽很宽也不应该有设备限制带宽,为何测试结果很像是带宽被限制呢? 45 | 46 | 经过抓包分析,发现是TCP窗口大小引起的。 47 | 48 | 抓包发现,PKU的服务器不支持tcp window scale选项,因此服务器端发送的最大窗口是64KB,链路延迟26ms左右。 49 | 也就是每26ms,服务器最多发送64KB,折合速度大约是64/0.026=2.4MB/s(实测2.2MB/s)。按照每ms统计数据包,是下面的图: 50 | 51 | ![PKU-ms](img/pku-ms.jpeg) 52 | 53 | 而THU服务器,一上来发送tcp window scale选项7,也就是可以支持>64KB的窗口。实际传输时,窗口大小在130KB左右变化,因此速度比pku高了近一倍。 54 | 下午是每ms统计数据包对比,左边是PKU下载的数据包,右边是THU下载的数据包: 55 | 56 | ![PKU-THU](img/pkuvsthu-ms.jpeg) 57 | 58 | THU自己的每ms统计是下图: 59 | 60 | ![THU-ms](img/thu-ms.jpeg) 61 | 62 | 从图里看,由于TCP窗口不够大,带宽远没有被占满。 63 | 64 | 初步估计测试点到服务器端有1G的带宽,26ms延迟,填满整个链路需要2.6MB,因此需要有2.6MB的窗口大小,才会完全用满链路带宽。 65 | 66 | ### 三、pku网站的兼容性 67 | 68 | 下图是从多个测试点访问THU和PKU的速度: 69 | 70 | ![PKU-THU-speed](img/thupku-speed.png) 71 | 72 | 从中可以看到PKU的访问速度抖动很厉害。 73 | 74 | 经对比测试,如果用docker常用的alpine linux中的OpenSSL 1.1.1b 26 Feb 2019库,访问PKU时,https传输过程中会偶尔中断,其他高校未发现该现象,原因未知。 75 | 76 | ### 四、ZJU网站的怪异行为 77 | 78 | 下图是从多个测试点访问ZJU的速度和返回码。正常的返回码是10,返回码6的含义是非200应答。 79 | 80 | ![ZJU](img/zju.png) 81 | 82 | 从中可以看到ZJU的访问比较慢,而且有大量非200返回码。 83 | 84 | 经详细测试,发现www.zju.edu.cn访问确实不快。它似乎是通过某个CDN服务的,速度慢,而且访问IPv6地址时,还经常给出302重定向到某个IPv4地址的响应。 85 | 86 | ### 五、NJU网站的不稳定 87 | 88 | 下图是从多个测试点访问NJU的速度和返回码。正常的返回码是10,返回码7的含义是未读取到正确的HTTP应答: 89 | 90 | ![NJU](img/nju.jpg) 91 | 92 | 从中可以看到NJU的访问有大量非200返回码。 93 | 94 | 经详细测试,发现www.nju.edu.cn访问不稳定,表现在tls协商后,发送HTTP GET请求后,服务器不响应的情况。 95 | 96 | 97 | 98 | 99 | *** 100 | 欢迎 [加入我们整理资料](https://github.com/bg6cq/ITTS) 101 | -------------------------------------------------------------------------------- /security/mail/README.md: -------------------------------------------------------------------------------- 1 | ## [原创]自动修改同一天从30个IP发送邮件账号的密码 2 | 3 | 本文原创:**中国科学技术大学 张焕杰** 4 | 5 | 修改时间:2017.10.16 6 | 7 | ## 一、目的 8 | 9 | 有人专门通过尝试或撞库的方式获取邮件系统密码,并利用这些账号发送垃圾邮件。 10 | 11 | 本脚本定时运行,统计coremail系统当日每个用户发信的IP来源个数,如果超过30,这种一般是发送垃圾邮件的行为,直接修改用户的密码。 12 | 13 | ## 二、相关代码 14 | 15 | 假定程序放在`/home/coremail/auto_stop_spam_send`目录下,脚本名字是`auto_stop_spam_send.sh` 16 | 17 | ``` 18 | #!/bin/bash 19 | 20 | cd /home/coremail/auto_stop_spam_send 21 | 22 | #管理员的邮箱,以便发送通知邮件 23 | OPMAIL=*****@ustc.edu.cn 24 | #修改的密码 25 | NEWPWD=xyz12345 26 | 27 | MFILE=spamsend.eml 28 | 29 | #如果存在文件norun,直接退出 30 | if [ -f norun ] 31 | then 32 | exit 33 | fi 34 | 35 | date >> run.log 36 | 37 | #统计当日用户的发信来源IP个数,格式是 数量 邮件地址 38 | grep -h cmd:DATA /home/coremail/logs/mtatrans/mta`date +%Y_%m_%d`/* | grep Local:1 | grep ",Result:Deliver," \ 39 | | sed -e "s/.*,ClientIp://" -e "s/,FreeIP.*Sender:/ /" -e "s/,SenderEmail.*//" | sort | uniq \ 40 | | cut -f2 -d' ' | sort | uniq -c | sort -n -r |awk '$1>30 {print $2}' | sort > send30.txt 41 | 42 | #如果单日超过20个帐号需要禁止,可能有问题,给管理员发邮件,并退出不再执行 43 | cnt=`cat send30.txt | wc -l` 44 | if [ $cnt -gt 20 ] 45 | then 46 | echo "From: " > $MFILE 47 | echo "Subject: $cnt mailaccounts will be blocked due to mail send, need you check" >> $MFILE 48 | echo >> $MFILE 49 | echo "Dear admin user:" >> $MFILE 50 | echo >> $MFILE 51 | echo " too many accounts was sending mails from 30+ IPs one day, I will not block them." >> $MFILE 52 | echo " please login and check the reason, delete norun, and I will run next time." >> $MFILE 53 | cat send30.txt >> $MFILE 54 | /home/coremail/bin/userutil --put-msg $OPMAIL $MFILE 55 | touch norun 56 | date >> blockuser.log 57 | echo "too many users" >> blockuser.log 58 | exit 59 | fi 60 | 61 | #对每个新的异常帐号修改密码 62 | 63 | #blocked.txt 存放的是已经修改过密码的用户,修改一次后就不再修改了 64 | sort blocked.txt > sortblocked.txt 65 | 66 | for u in `comm -13 sortblocked.txt send30.txt`; do 67 | date >> blockuser.log 68 | echo $u >> blockuser.log 69 | echo $u >> blocked.txt 70 | echo "From: " > $MFILE 71 | echo "Subject: mail account blocked due to mail send" >> $MFILE 72 | echo >> $MFILE 73 | echo "Dear user $u:" >> $MFILE 74 | echo >> $MFILE 75 | echo " Your mail account was blocked due to send mails from 30+ IPs one day." >> $MFILE 76 | /home/coremail/bin/userutil --put-msg $u $MFILE 77 | /home/coremail/bin/userutil --put-msg $OPMAIL $MFILE 78 | /home/coremail/bin/userutil --set-user-attr $u password=$NEWPWD 79 | done 80 | 81 | ```` 82 | 83 | ## 三、程序的运行 84 | 85 | 在 `crontab -e`中增加以下内容,每10分钟运行一次即可 86 | ```` 87 | */10 * * * * /home/coremail/auto_stop_spam_send/auto_stop_spam_send.sh 88 | ```` 89 | 90 | *** 91 | 欢迎 [加入我们整理资料](https://github.com/bg6cq/ITTS) 92 | -------------------------------------------------------------------------------- /app/ntp/README-en.md: -------------------------------------------------------------------------------- 1 | # Set up a NTP server 2 | 3 | Author: **Yifan Bian, Northwest A&F University** 4 | 5 | Last modified: 2017/12/21 6 | 7 | ## Advantages 8 | 9 | A private NTP server can reduce delay of synchronizing time on servers and make time on servers more accurate. 10 | 11 | ## Steps 12 | 13 | ### Use Docker Container 14 | 15 | #### Install Docker 16 | 17 | Please refer to official documentation of Docker: [https://docs.docker.com/engine/installation/](https://docs.docker.com/engine/installation/). 18 | 19 | #### Change Docker Hub Registry (Optional) 20 | 21 | Affected by domestic network environment, it will be very slow to directly connect to Docker Hub Registry. You may want to accelerate the speed by changing it to the mirror provided by Aliyun. 22 | 23 | Steps: 24 | 25 | 1. Sign in [Aliyun Container Hub Service Console](https://cr.console.aliyun.com/) with your Aliyun account. Your mirror address will be shown in the help page and seem like `.mirror.aliyuncs.com`. 26 | 27 | 2. Modify the configuration of Docker (`/etc/docker/daemon.json`): 28 | ``` 29 | { 30 | "registry-mirrors": [""] 31 | } 32 | ``` 33 | This can only apply to Docker with version greater than 1.10. 34 | 35 | 3. Restart Docker service: `sudo systemctl restart docker` 36 | 37 | #### Modify IP range of Docker containers 38 | 39 | By default, Docker will assign addresses in `172.17.0.0/16` to containers. Because it will make collisions when a user from West Student Dorm Area of the North campus attempting to access the server, we have to modify that. Modify `/etc/docker/daemon.json`: 40 | ``` 41 | { 42 | "registry-mirrors": [""], 43 | "bip": "192.168.128.1/17" 44 | } 45 | ``` 46 | A restart of Docker service is required after you modified that. 47 | 48 | #### Pull the image 49 | 50 | Execute `sudo docker pull cloudwattfr/ntpserver:latest`. 51 | 52 | #### Start the container 53 | 54 | Execute `docker run -d --name ntpservice -p 123:123 cloudwattfr/ntpserver`. 55 | 56 | Explanation of parameters: 57 | - `-d`: aka `--detach`, makes the container run in the background. 58 | - `--name ntpservice`: name the container 59 | - `-p 123:123`: establish a map between host's port 123 and container's port 123. 60 | 61 | ### Use software package of your distro 62 | 63 | 1. Install ntp: `sudo apt-get install -y ntp` (Ubuntu/Debian) or `sudo yum install ntp` (CentOS) 64 | 2. Modify `/etc/ntp.conf` and set the upstream to ntp servers in China: 65 | ``` 66 | pool 0.cn.pool.ntp.org iburst 67 | ``` 68 | You can add other servers after that. 69 | 70 | 3. Start the ntp service: `sudo systemctl enable ntp && sudo systemctl start ntp` 71 | 72 | ### Configure the firewall 73 | 74 | I use `firewalld` to configure the firewall. The default zone of `firewalld` has been set to `dmz`. 75 | 76 | ``` 77 | sudo firewall-cmd --zone=dmz --add-service=ntp --permanent 78 | sudo firewall-cmd --reload 79 | ``` 80 | -------------------------------------------------------------------------------- /other/nfc/README.md: -------------------------------------------------------------------------------- 1 | ## [原创] CentOS 6 php 使用ACS ACR1252U USB NFC读卡器 读取卡UID 2 | 3 | 本文原创:**中国科学技术大学 张焕杰** 4 | 5 | 修改时间:2020.04.30 6 | 7 | 本文记录在CentOS 6环境下,ACR 1252U USB NFC读卡器读取卡UID的过程。 8 | 9 | 1. 硬件设备 10 | 11 | ACS ACR1252U USB NFC读卡器,使用USB接口连接到安装CentOS 6的机器。 12 | 13 | 2. 软件安装 14 | 15 | ``` 16 | yum install -y wget pcsc-lite pcsc-lite-devel php-pear php-devel libusb1 unzip 17 | 18 | pecl install pcsc-alpha 19 | 20 | ## 注意,这个版本的pcsc有内存泄漏,可以安装 https://github.com/bg6cq/pcsc.git 21 | # cd /usr/src/ 22 | # git clone https://github.com/bg6cq/pcsc.git 23 | # cd pcsc 24 | # phpize 25 | # ./configure 26 | # make 27 | # make install 28 | 29 | wget https://www.acs.com.hk/download-driver-unified/12131/ACS-Unified-PKG-Lnx-118-P.zip 30 | unzip ACS-Unified-PKG-Lnx-118-P.zip 31 | rpm -i ACS-Unified-PKG-Lnx-118-P/epel/6/pcsc-lite-acsccid-1.1.8-1.el6.x86_64.rpm 32 | 33 | service messagebus start 34 | service pcscd start 35 | service haldaemon start 36 | 37 | #修改/etc/php.ini, 把 38 | ;enable_dl = Off 改为 39 | enable_dl = On 40 | #并增加 41 | extension=pcsc.so 42 | 43 | #一段简单的测试程序 44 | wget -O test.php http://linux.ustc.edu.cn/test.phps 45 | ``` 46 | 47 | test.php内容 48 | 49 | ```php 50 | 96 | ``` 97 | 98 | 参考: 99 | 100 | * http://ludovicrousseau.blogspot.com/2010/04/pcsc-sample-in-different-languages.html 101 | * https://www.acs.com.hk/cn/driver/351/acr1252u-nfc%E8%AF%BB%E5%86%99%E5%99%A8iii-nfc%E8%AE%BA%E5%9D%9B%E8%AE%A4%E8%AF%81%E8%AF%BB%E5%86%99%E5%99%A8/ 102 | * https://pecl.php.net/package/pcsc 103 | 104 | *** 105 | 欢迎 [加入我们整理资料](https://github.com/bg6cq/ITTS) 106 | -------------------------------------------------------------------------------- /security/l1.md: -------------------------------------------------------------------------------- 1 | ## [原创] 高校等保一级应用系统的管理模式探究 2 | 3 | 本文原创:**中国科学技术大学 张焕杰** 4 | 5 | 修改时间:2018.06.12 6 | 7 | 高校信息系统需要支持学校种类繁多的业务,因此普遍存在大量的等保一级业务系统。 8 | 这些系统是网络安全工作中最难处理的部分。 9 | 10 | 这些一级业务系统数量众多,单个系统功能简单,多由校内业务部门分散建设。系统常 11 | 由不同的软件公司开发,采用的技术手段迥异。学校的系统管理员技术水平参差不齐,往往 12 | 需要依赖软件公司公司进行运维,运维流程不严谨。由于软件公司的技术人员变动快,文档 13 | 缺失,交接随意。 14 | 15 | 这些系统一方面运维力量不足,容易存在大量的安全隐患,另一方面部分系统存放有涉 16 | 及个人隐私的信息,存在隐私泄漏不可控的危险。因此这些数量庞大的等保一级信息系统的 17 | 存在,对高校的网络安全管理工作是极大的挑战。 18 | 19 | 从系统架构上看,这些系统由于功能简单,数据量不大,普遍运行在一台虚拟机内,虚 20 | 拟机充当了数据库 + 应用服务的功能,虚拟机内存放了数据库、程序、数据文件、日志文 21 | 件等四部分信息内容。在进行备份时,为了简化备份工作,往往对整个虚拟机做完整备份, 22 | 备份的有效信息少,效率低。 23 | 24 | 由于这类数量多,安全管理部门没有足够人力深入到业务系统的管理,缺乏有效的管理 25 | 手段,安全管理部门长期把这类系统当作“黑盒子”处理,采取责任转移的方法,由系统的业 26 | 务使用部门承担安全责任。业务使用部门很少有合格的系统管理员能承担起真正的系统安全 27 | 管理工作。最终的后果就是这些系统带着极大的安全隐患运行,给学校的网络安全管理工作 28 | 带来了极大的不确定性。 29 | 30 | 即使学校意识到这个隐患,试图通过服务外包的模式交由其他专业公司运维,也缺乏有 31 | 效的手段对运维过程进行控制,即使有运维也无法避免这些安全隐患。 32 | 33 | 为了有效管理这类等保一级应用系统,我们提出如下管理模式: 34 | 35 | ## 一、应用数据库服务集中化 36 | 37 | 根据各业务系统数据库软件版本、功能需求、数据量大小,由学校信息化管理部门统一 38 | 规划、建设和运维若干数据库服务器,向各个业务系统提供一致的数据库服务。这些数据库 39 | 服务器由学校信息化管理部门集中管理,各业务系统仅仅使用即可。数据库服务器的日常管 40 | 理,特别是备份、安全管理等专业性要求较强的工作由信息化管理部门集中进行。这样一来 41 | 可以确保数据的安全性,避免业务系统被入侵或其他原因损坏后数据丢失的风险。集中建设 42 | 的数据服务器前可以增加数据库防火墙等设备,集中审计应用访问数据库的行为,极大增强 43 | 数据库的安全性。 44 | 45 | ## 二、程序代码文件版本化管理 46 | 47 | 所谓程序代码,指的是服务器上业务系统软件不常变化的软件系统类文件,包含可执行 48 | 程序、部分脚本化语言源代码、html、css、js 等静态文件。这些文件一般不发生变化,除 49 | 非业务软件更新升级才会有变化。在系统运行期间,这些文件发生了变化,如文件被修改, 50 | 增加或删除了文件,一般是系统被入侵引起的。 51 | 52 | 将程序代码文件纳入版本化管理,可以有效跟踪这些文件的变化过程,特别能在第一时 53 | 间得到被入侵后遭到修改的信息,对于提高系统安全性有极大好处。 54 | 55 | 具体办法是建立校内集中的版本服务器,如使用`gitlab-ce`。并要求各等保一级系统的 56 | 程序代码集中放置到版本服务器。此外,在业务系统中设置定时任务定时执行,检查相关目 57 | 录中是否有代码文件的变化,一旦有变化,通知系统管理员和安全管理员关注处理。如果是 58 | 正常的变更,将变更提交到版本库;如果是非正常变更,要查找是被入侵还是其他原因引起 59 | 的,针对性进行处理。 60 | 61 | 将程序代码文件版本化管理,可以有效记录程序变更历史,及时发现入侵事件。 62 | 63 | ## 三、数据文件集中备份与审核 64 | 65 | 业务系统中还存放有大量频繁变化的数据文件,最常见的是上传的附件文件。这些文件 66 | 相比程序代码变更比较频繁,随着系统的运行越来越多。大部分附件文件,是一些文档、图 67 | 片。这些文件,通过备份或复制机制,保存到稳妥的其他服务器集中存放。 68 | 69 | [https://github.com/bg6cq/hbackup] 是一个正在开发的数据文件集中备份程序。它 70 | 使用文件的md5sum和长度识别相同的文件,相同的文件仅仅保存1份。 71 | 72 | 安全管理员定期对这些文件进行扫描审核,如果发现有程序或脚本文件,则要追踪文件 73 | 的来源,查看是否对系统运行有安全隐患。 74 | 75 | 将数据文件集中备份与审核,可以有效做好备份工作,并及时得到系统是否有安全威胁 76 | 的信息。 77 | 78 | ## 四、日志文件集中存放与处理 79 | 80 | 业务系统的运行日志,含www日志、应用日志,通常都存放在业务系统虚拟机中。一旦 81 | 虚拟机遭到入侵,入侵者往往会删除日志文件以便隐藏行踪。因此需要将日志直接远程记录 82 | 到独立的日志服务器或者定时转储到专用的日志服务器。 83 | 84 | [https://github.com/bg6cq/translog] 是一个正在开发的日志文件转储程序。 85 | 它允许服务器通过认证后,已仅写的方式把日志文件上传到日志服务器。 86 | 87 | 转储的日志除了可以独立分析获取入侵信息外,还可以将多个系统的日志联合进行关联 88 | 分析,获取对学校的安全威胁。 89 | 90 | ## 五、安全管理的闭环运行 91 | 92 | 对信息系统采取以上措施后,系统处于一个闭环运行模式: 93 | 94 | ``` 95 | 数据库运维 ---> 程序代码提交 ---> 程序代码变更审核 ---> 数据文件备份 ---> 96 | <---- 日志分析 <---- 日志转储 <---- 数据文件审核 <--- 97 | ``` 98 | 99 | 在这样的闭环运行下,数据库、程序代码、数据文件、日志信息采取不同的方式针对性 100 | 处理,确保每个部分运行过程都做到可控,从而确保整个系统的可控安全运行。 101 | 102 | 103 | *** 104 | 欢迎 [加入我们整理资料](https://github.com/bg6cq/ITTS) 105 | -------------------------------------------------------------------------------- /work.md: -------------------------------------------------------------------------------- 1 | ## 参与我们的工作 2 | 3 | 如果您对git不熟悉,建议参考 [大家一起学git](https://github.com/bg6cq/learngit) 花2个小时熟悉git基本概念和操作。 4 | 5 | 如果您使用国内的gitee.com,请将下面的github替换为gitee即可。 6 | 7 | 由于github的存在,参与我们的工作非常简单,只需要3步: 8 | 1. fork代码,得到自己的拷贝 9 | 2. 在自己的拷贝里修改 10 | 3. 创建合并申请,等上游接受了合并,修改就更新到 [https://github.com/bg6cq/ITTS](https://github.com/bg6cq/ITTS)。 11 | 12 | ## 前期准备工作 13 | 14 | 1. 在github.com上申请账号(Sing up,其他略) 15 | 16 | 2. 在github.com上fork一份代码 17 | 18 |    登录自己的github账号,访问[https://github.com/bg6cq/ITTS](https://github.com/bg6cq/ITTS),单击右侧的Fork,现在https://github.com/xxx/ITTS 就是你自己的拷贝,在里面可以随意修改。 19 | 20 | ## 修改文档 21 | 22 | 可以在 github.com 在线修改文档,在 https://github.com/xxx/ITTS 自己的拷贝里可以创建文件、上传文件、修改文件,这里修改的都是自己拷贝中的。 23 | 直接在master中修改即可。 24 | 25 | 也可以将文件下载回自己的机器修改,请参见下面的 离线修改文件。 26 | 27 | ## 创建合并申请 28 | 创建一个pull request,等待上游接受合并 29 | 30 |    访问 https://github.com/xxx/ITTS/pulls,“New pull request", 最右边方框选head fork:xxx/ITTS compare:master, 然后 "Create pull request" 31 | 32 | ## 与上游保持更新 33 | 上游更新后,访问 https://github.com/xxx/ITTS/ 自己的拷贝,会提示“This branch is ? commit behind bg6cq:master."。 34 | 35 | 最好的解决办法是使用命令行更新,最简单的办法是把自己的拷贝删除,重新fork。 36 | 37 | 单击提示右侧的"Compare", 单击 "bg6cq:master is up to date with all commits from xxx:master. Try switching the base for your comparison." 这里的 "switching the base",单击"Create pull request", 在出来的页面单击"Merge pull request", "Confirm merge" 38 | 39 | 请参考[https://stackoverflow.com/questions/7244321/how-do-i-update-a-github-forked-repository](https://stackoverflow.com/questions/7244321/how-do-i-update-a-github-forked-repository) 40 | 41 | ## 离线修改文件 42 | 43 | 1. 安装git软件 44 | 45 | Linux可以安装git,windows建议到 [https://git-for-windows.github.io/](https://git-for-windows.github.io/) 下载安装 46 | 设置好自己的邮件地址和姓名: 47 | ``` 48 | git config --global user.email "my@mail.org" 49 | git config --global user.name "My Name" 50 | ``` 51 | 52 | 2. 安装文本编辑器 53 | 54 | Linux可以使用自带的编辑器如vim等,windows系统下建议安装 [Notepad++](https://notepad-plus-plus.org/download/) 55 | 56 | 3. 在github.com上申请账号(略) 57 | 58 | 4. 在github.com上fork一份代码 59 | 60 | 登录自己的github账号,访问[https://github.com/bg6cq/ITTS](https://github.com/bg6cq/ITTS),单击右侧的Fork 61 | 62 | 5. 下载自己的代码 63 | 64 | 在某个目录下,执行 `git clone https://github.com/xxx/ITTS.git` (其中xxx是自己的github账号)下载自己的代码,下载后的代码在目录ITTS下。 65 | 66 | 6. 设定上级源 67 | 68 | ``` 69 | git remote add bg6cq https://github.com/bg6cq/ITTS.git 70 | ``` 71 | 72 | 7. 创建一个分支 73 | ``` 74 | cd ITTS 75 | git checkout -b xxx 76 | ``` 77 | 78 | 8. 在这个分支上修改 79 | 80 | 9. 提交到服务器 81 | ``` 82 | git add ??.md 83 | git commit -m commit_message 84 | git push origin xxx 85 | ``` 86 | 87 | 10. 到服务器上可以看到效果,注意要选择branch xxx 88 | 89 | 11. 创建一个pull request 90 | 91 | 访问 https://github.com/xxx/ITTS/pulls,“New pull request", 最右边方框选 compare:xxx, 然后 "Create pull request" 92 | 93 | 12. 等修改被接收后,执行以下命令 94 | ``` 95 | git pull bg6cq master 96 | git push origin xxx 97 | ``` 98 | 99 | 100 | ## 推荐阅读 101 | 102 | 1. [Pro Git 第二版(中文版)](https://www.kancloud.cn/kancloud/progit/70158) 103 | -------------------------------------------------------------------------------- /app/dns/coredns/README.md: -------------------------------------------------------------------------------- 1 | ## [原创] CoreDNS 尝试 2 | 3 | 本文原创:**中国科学技术大学 张焕杰** 4 | 5 | 修改时间:2020.02.18 6 | 7 | Core DNS是一个go语言开发的DNS服务器,主要用来提供权威解析服务。详细请见 https://github.com/coredns/coredns 8 | 9 | 本次尝试使用Core DNS软件搭建ah.edu.cn域的DNS权威解析服务器,从以下步骤可以看到针对一个独立域名的配置,比bind要简单很多。 10 | 11 | Core DNS支持很多plugin,本文仅仅使用最简单的file、errors、log。 12 | 13 | Core DNS还不直接支持view等功能。 14 | 15 | ## 一、CentOS 7 安装 16 | 17 | CentOS 7 安装后,更新并安装常用软件 18 | ``` 19 | yum update -y 20 | yum install -y wget bind-utils net-tools git 21 | ``` 22 | 23 | ## 二、CoreDNS安装 24 | 25 | 到 https://github.com/coredns/coredns/releases 下载,我下载的命令: 26 | ``` 27 | wget https://github.com/coredns/coredns/releases/download/v1.6.7/coredns_1.6.7_linux_amd64.tgz 28 | tar xzf coredns_1.6.7_linux_amd64.tgz 29 | mv coredns /usr/local/bin 30 | ``` 31 | 32 | ## 三、CoreDNS配置 33 | 34 | 3.1 创建用户 35 | 36 | ``` 37 | useradd coredns -s /sbin/nologin 38 | ``` 39 | 40 | 3.2 编辑/etc/coredns/Corefile 41 | 42 | ``` 43 | mkdir /etc/coredns 44 | 45 | vi /etc/coredns/Corefile 46 | ``` 47 | Corefile内容如下: 48 | 49 | ``` 50 | ah.edu.cn { 51 | file /etc/coredns/ah.edu.cn.db 52 | errors 53 | log 54 | } 55 | 56 | 224.45.210.in-addr.arpa { 57 | file /etc/coredns/210.45.224.db 58 | errors 59 | log 60 | } 61 | ``` 62 | 63 | 3.3 编辑 /etc/coredns/ah.edu.cn.db 64 | 65 | vi /etc/coredns/ah.edu.cn.db 文件是bind格式,内容如下: 66 | ``` 67 | $TTL 600 68 | 69 | @ IN SOA ns.ah.edu.cn. root.ustc.edu.cn. ( 70 | 116 600 1600 360000 800 ) 71 | IN NS ns.ah.edu.cn. 72 | IN NS ns2.ah.edu.cn. 73 | IN MX 0 smtp.ustc.edu.cn. 74 | ns IN A 210.45.224.1 75 | ns2 IN A 210.45.224.2 76 | 77 | www IN A 218.22.21.21 78 | 79 | ``` 80 | 81 | 3.4 编辑 /etc/coredns/210.45.224.db 82 | 83 | vi /etc/coredns/210.45.224.db 文件是bind格式,内容如下: 84 | ``` 85 | $TTL 600 86 | 87 | @ IN SOA ns.ah.edu.cn. root.ustc.edu.cn. ( 88 | 87 600 1600 360000 800 ) 89 | IN NS ns.ah.edu.cn. 90 | IN NS ns2.ah.edu.cn. 91 | 92 | 1 IN PTR ns.ah.edu.cn. 93 | 2 IN PTR ns2.ah.edu.cn. 94 | ``` 95 | 96 | 97 | 3.5 编辑/usr/lib/systemd/system/coredns.service 98 | 99 | vi /usr/lib/systemd/system/coredns.service 内容如下 100 | ``` 101 | [Unit] 102 | Description=CoreDNS DNS server 103 | Documentation=https://coredns.io 104 | After=network.target 105 | 106 | [Service] 107 | PermissionsStartOnly=true 108 | LimitNOFILE=1048576 109 | LimitNPROC=512 110 | CapabilityBoundingSet=CAP_NET_BIND_SERVICE 111 | AmbientCapabilities=CAP_NET_BIND_SERVICE 112 | NoNewPrivileges=true 113 | User=coredns 114 | ExecStart=/usr/local/bin/coredns -conf=/etc/coredns/Corefile 115 | ExecReload=/bin/kill -SIGUSR1 $MAINPID 116 | Restart=on-failure 117 | 118 | [Install] 119 | WantedBy=multi-user.target 120 | ``` 121 | 122 | 3.6 启动CoreDNS 123 | 124 | ``` 125 | systemctl enable coredns 126 | systemctl start coredns 127 | systemctl status coredns 128 | ``` 129 | 130 | 3.7 允许53端口 131 | 132 | ``` 133 | firewall-cmd --permanent --add-service=dns 134 | firewall-cmd --reload 135 | ``` 136 | 137 | 注意:上述配置,DNS查询日志记录在/var/log/message 138 | 139 | 140 | *** 141 | 欢迎 [加入我们整理资料](https://github.com/bg6cq/ITTS) 142 | -------------------------------------------------------------------------------- /security/checklist/README.md: -------------------------------------------------------------------------------- 1 | ## [原创]系统上线前安全评测技术要求 2 | 3 | 本文原创:**哈尔滨工业大学 辛毅** 4 | 5 | 参与修改: 6 | *上海交通大学 章思宇* 7 | *中国科学技术大学 张焕杰* 8 | 9 | 修改时间:2017.10.04 10 | 11 | ## 一、系统上线流程 12 | 13 | 1. 系统责任单位提交测评信息,交由网络信息中心进行安全测试和评估 14 | 15 | 2. 网络信息中心进行技术测试和评估,反馈系统安全评估报告(内含整改建议) 16 | 17 | 3. 系统责任单位按照整改建议对系统进行整改,并提供详实的整改报告 18 | 19 | 4. 网络与信息中心验证整改报告,认为系统达到安全条件后,方可上线 20 | 21 | ## 二、基础软件和系统部署基本要求 22 | 23 | 1. 系统必须保证为正常上线系统,须更新为最新 24 | 25 | 禁止采用失去技术升级的系统(如windows 2003等)。 26 | 27 | 禁止采用含有已知漏洞的组件、应用程序、框架(如:Struts 2.5 - Struts 2.5.10)、应用程序服务器、web 服务器、 28 | 数据库服务器和平台定义。以上系统必须执行安全配置,禁止默认安装。所有的软件应该保持及时更新。 29 | 30 | 以上系统必须执行安全配置,禁止默认安装。所有的软件应该保持及时更新。 31 | 32 | 2. 启用本机防火墙关闭不必要端口 33 | 34 | 从本机关闭不需要的端口(如:关闭 windows netbios 等服务),设置本机防火墙如 iptable 对于访问的源地址进行限制, 35 | 同时相关服务设置类似 host.allow,host.deny 等策略。 36 | 37 | 3. 数据库服务器防护 38 | 39 | 数据库和应用系统如在同一台服务器,须采用本机回路进行访问,如前端及数据库分为不同服务器,须设置本机防火墙访问规则, 40 | 禁止非前端服务器访问数据库网络端口。 41 | 42 | 4. 用户权限最小化 43 | 44 | 使用最低权限的数据库用户作为 web 应用所需,禁止具有不必要的额外权限。 45 | 46 | 5. 系统安装规范化 47 | 48 | 使用标准端口提供http或https服务,避免使用非标准端口。 49 | 50 | 保证系统服务正常与上线系统一致,无各种调试、报错信息(如:断点,printf 等调试信息)及注释信息,系统需删除系统默认安装的各种例程、文档及管理程序。 51 | 52 | 6. 系统配置防护 53 | 54 | 系统中禁止暴露配置信息(如数据库连接信息),源码备份文件,.git或.svn 仓库等。 55 | 56 | 7. 系统和数据备份措施 57 | 58 | 对系统应用和数据有切实可行的备份措施。建议使用git跟踪系统应用的变化和修改情况。 59 | 60 | 8. 网站系统源码措施 61 | 62 | 网站系统源码应采用相对路径,禁止使用绝对路径。 63 | 64 | 网站系统源码禁止绑定域名、端口等。 65 | 66 | 采用第三方cms模板生产网站,应采用最小化安装,去除调试、数据库配置、说明文档等源文件。 67 |     68 | 69 | ## 三、应用软件技术基本要求 70 | 71 | 1. 对用户输入内容有效过滤 72 | 73 | 对用户输入进行严格有效过滤,防止sql注入,xss跨站脚本,命令执行,crsf 跨站请求伪造等,建议采用白名单过滤策略。 74 | 75 | 2. 使用安全的SQL调用方式 76 | 77 | 严禁通过POST/GET方式传递SQL语句,避免使用拼接方式组合SQL语句,应尽量使用安全的调用方式。 78 | 79 | 3. 严控控制上传点 80 | 81 | 严格控制上传点,尽量禁止让web用户直接访问传文件夹,改用程序输出访问。 82 | 83 | 上传目录不能有执行权限,原则上不允许有未经登陆验证的上传点。 84 | 85 | 应对于上传文件类型和目录进行严格控制(禁止用前端的 js 进行控制),文件同时上传目录不能有执行权限。 86 | 87 | 4. 有效的身份认证措施 88 | 89 | 设置有效的身份认证、会话管理及访问控制机制,防止越权及提权,禁止利用 js 进行控制及验证。 90 | 91 | 5. 密码复杂度要求 92 | 93 | 系统必须有密码复杂度检查模块,设置有效的验证码或者滑动等手段防止暴力破解,严格限制密码长度大于 8 位,含字母(大小写)、数字及符号组合,重要系统须采用二次认证。禁止在数据库中明文存放用户密码,需进行带 salt 的哈希之后入库。对于多次错误登陆进行封堵。 94 | 95 | 6. 个人隐私信息保护 96 | 97 | 对于身份信息、单位职务、财务信息、健康信息、讯通信息等等敏感信息禁止在数据库中明文存放。 98 | 99 | 100 | ## 四、评测信息: 101 | 102 | 系统责任单位应提交以下信息供评测使用: 103 | 104 | 1. 操作系统、版本号 105 | 106 | 如:CentOS 6.9 107 | 108 | 2. 开放的网络端口及用途 109 | 110 | | 端口 | 开放范围 | 用途 | 111 | | ------| ------ | ------ | 112 | | tcp 80 | all | web服务 | 113 | | tcp 443 | all | web服务 | 114 | | tcp 22 | 200.100.99.0/24 | 管理 | 115 | 116 | 3. 提供所有第三方的中间件、开发包、数据库、服务版本及管理地址,密码(必须为复杂密码评测后更改) 117 | 118 | | 第三方中间件 | 版本 | 账号 | 密码 | 备注 | 119 | | -------------| ---- | ---- | ---- | ---- | 120 | | Tomcat7.0 | 7.0以上 | 无 | 无 | 121 | | Oracle10g | 10g | zhang | *** | DBA权限 | 122 | | Jdk1.7 | 1.7以上 | 无 | 无 | 123 | 124 | 4. 系统访问路径和登录信息; 125 | 126 | 访问路径:http://***.***.edu.cn 127 | 128 | 用户名和密码:**** 129 | 130 | 5. 系统的管理端路径和登录信息; 131 | 132 | 管理端访问路径:http://**.**.edu.cn/admin 133 | 134 | 管理用户账号: admin 密码:**** 135 | 136 | *** 137 | 欢迎 [加入我们整理资料](https://github.com/bg6cq/ITTS) 138 | -------------------------------------------------------------------------------- /security/mfa/README.md: -------------------------------------------------------------------------------- 1 | ## [原创] 两步(多因素)认证原理及应用 2 | 3 | 本文原创:**中国科学技术大学 张焕杰** 4 | 5 | 修改时间:2018.01.07 6 | 7 | ## 一、单因素认证 8 | 9 | 通常的身份认证依靠密码来验证,密码称为一个认证因素。一旦这个认证因素泄漏,拿到密码的攻击者就可以 10 | 直接登录。 11 | 12 | 有时候使用一个私钥来认证,其作用与密码基本相同,可以认为是一种机器识别的密码,以下不再单独说明。 13 | 14 | ## 二、两步(多因素)认证 15 | 16 | 为了提高安全性,提出了两步认证(2-Step Verification,又称多因素认证,Multi-Factor Authentication)方式。 17 | 18 | 除了使用密码认证外,再增加一个认证因素,只有两步认证都通过,用户身份的认证过程才算完成。 19 | 20 | 第二种认证因素的形态和传输渠道与密码差异很大,如银行常见的有通过短信发送认证码,定时变化的数字token(Time-based One-Time Password)等。 21 | 22 | 增加了一种认证因素,增加了攻击者的难度。 23 | 24 | ## 三、TOTP认证原理 25 | 26 | 多因素认证中,使用最方便的就是TOTP,国内有些银行在用的TOTP是一个实体的key,如下图所示: 27 | 28 | ![eky](ekey.jpg) 29 | 30 | 也有APP可以提供TOTP认证功能,如RedHat公司维护的[FreeOTP Authenticator](https://freeotp.github.io/)和Google Authenticator,这种TOTP可以以几乎0成本使用,非常方便,下图是Google Authenticator的截图: 31 | 32 | ![ga](ga.png) 33 | 34 | 服务器侧认证用户身份的工作过程和原理如下: 35 | 36 | 前提条件: 37 | * 服务器侧和用户的TOTP设备预先有个双方约定的同一个密钥K(每个人的均不同)和一个算法 38 | * 算法可以根据时间戳和密钥K计算出6位数字 (RFC6238 TOTP: Time-Based One-Time Password Algorithm) 39 | 40 | 验证过程: 41 | * TOTP设备: 根据时间戳和密钥K计算出6位数字,显示给用户 42 | * 用户: 将这6位数字交给服务器 43 | * 服务器: 使用同样的算法计算出6位数字,如果与用户提交的相同,用户认证成功,否则认证失败 44 | 45 | 考虑到双方时间可能有偏差,用户输入也需要时间,因此服务器在验证时往往会计算当前时刻前后几分钟的6位数字,只要有 46 | 一个相同即认为认证成功。 47 | 48 | ## 四、FreeOTP Authenticator/Google Authenticator使用 49 | 50 | 1. 用户手机安装FreeOTP或Google Authenticator 51 | 52 | 手机端下载一个即可: 53 | 54 | * FreeOTP Authenticator 55 | 56 | Android手机 可以从 [Google Play](https://play.google.com/store/apps/details?id=org.fedorahosted.freeotp) 直接安装,也可以从[这里](https://f-droid.org/repo/org.fedorahosted.freeotp_17.apk)下载。 57 | 58 | Apple手机 可以从 [Appstore](https://itunes.apple.com/us/app/freeotp-authenticator/id872559395?mt=8)下载。 59 | 60 | * Google Authenticator 61 | 62 | Android手机 可以从 [Google Play](https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2) 直接安装,也可以从[这里](http://lastpass.com/google-authenticator.apk)下载。 63 | 64 | Apple手机 可以从 [Appstore](https://itunes.apple.com/gw/app/google-authenticator/id388497605?mt=8)下载。 65 | 66 | 2. 服务器侧安装相关的软件,并将密钥K交给FreeOTP Authenticator或Google Authenticator APP 67 | 68 | 由于协议是公开的,也有很多开源实现,因此很多服务器端都可以使用,如: 69 | * [Github上各种语言版本](https://github.com/search?utf8=%E2%9C%93&q=GoogleAuthenticator&type=) 70 | * Linux pam 模块,常用于ssh登录认证等 71 | 72 | 服务器侧生成密钥K后,可以直接显示给用户以便输入FreeOTP或Google Authenticatorp,也可以产生二维码, 73 | 由FreeOTP或Google Authenticator扫码自己记录。 74 | 75 | 具体各种服务器的配置请自行google,一般来说都不复杂。 76 | 77 | 对于Linux服务器的ssh增加两步认证,安装配置很快(注意SELinux的影响),几分钟就可以。 78 | 79 | 比如对于Ubuntu系统,参照参考资料中的链接很快就可以设置好。 80 | 81 | 需要注意的是,Google Authenticator仅仅使用TOTP中的SHA1 HASH算法,而FreeOTP则支持更多的HASH算法,此外FreeOTP还支持HOTP(RFC4226 HMAC-based One-Time Password (HOTP) algorithm)。 82 | 83 | 3. 安全要点 84 | 85 | 双方共享的密钥K需安全保存,一旦泄漏,两步认证就无法起到认证的作用。 86 | 87 | 以Linux服务器的ssh两步认证为例,用户目录下`.google_authenticator`文件存放有密钥K,如果这个密钥泄漏,两步认证就没有意义了。 88 | 89 | ## 五、参考资料 90 | 91 | * [谷歌验证 (Google Authenticator) 的实现原理是什么?](https://www.zhihu.com/question/20462696) 92 | * [How To Set Up Multi-Factor Authentication for SSH on Ubuntu 16.04](https://www.digitalocean.com/community/tutorials/how-to-set-up-multi-factor-authentication-for-ssh-on-ubuntu-16-04) 93 | 94 | 95 | *** 96 | 欢迎 [加入我们整理资料](https://github.com/bg6cq/ITTS) 97 | -------------------------------------------------------------------------------- /other/test/pku_vs_thu.md: -------------------------------------------------------------------------------- 1 | ## 深入数据包分析pku和thu网站传输速度差异 2 | 3 | 本文原创:**中国科学技术大学 张焕杰** 4 | 5 | 修改时间:2019.05.27 6 | 7 | ### 1. pku和thu网站传输速度测试环境 8 | 9 | 从我的PC机(Mac MINI)对PKU/THU网站上500KB左右的文件测试,2个网站的传输速度有较大差异。 10 | 11 | 2019.05.26测试时,PKU比THU的传输速度慢,原因是PKU的发送窗口不超过64KB(请见 [PKU比THU慢的真相大白](pku_thu.md))。 12 | 13 | 2019.05.27 PKU管理员调整设备参数后,PKU比THU传输速度快了近1倍。 14 | 15 | 我的PC机到PKU/THU服务器使用IPv6协议,中间带宽接近1G,延迟大约26ms。 16 | 17 | 为了弄清楚差异的来源,有了本篇文章。 18 | 19 | ### 2. 测试过程 20 | 21 | httptest在Mac OS下编译,需要`brew install glibc-openssl`,并在Makefile中增加 `-I... -L...`等选项。 22 | 23 | 测试过程如下(测试时tcpdump抓包,文件请见 [pku-2.cap](pku-2.cap) 和 [thu-2.cap](thu-2.cap) ): 24 | ``` 25 | $ ./httptest https://www.pku.edu.cn/images/content/2019-05/20190504221013750682.jpg 26 | 0 0.0582 0.0828 0.0283 0.0818 526119 6434683 https://www.pku.edu.cn/images/content/2019-05/20190504221013750682.jpg 27 | 28 | $ ./httptest -d https://www.tsinghua.edu.cn/publish/thu2018en/11490/20190514123145278682465/20190514123259685120480.jpg 29 | 0 0.0293 0.0811 0.0522 0.1575 562687 3572911 https://www.tsinghua.edu.cn/publish/thu2018en/11490/20190514123145278682465/20190514123259685120480.jpg 30 | ``` 31 | 32 | 上述结果含义如下: 33 | 34 | | 站点 | DNS解析时间 | TCP/TLS协商时间| 响应时间 | 传输时间 | 内容长度 | 传输速度 | 35 | | --- | ----------: | -------------: | -------: | -------: | ----------: | --------: | 36 | | PKU | 0.0582s | 0.0828s | 0.0283s | 0.0818s | 526119 Byte | 6434683 B/s | 37 | | THU | 0.0293s | 0.0811s | 0.0522s | 0.1575s | 562687 Byte | 3572911 B/s | 38 | 39 | ### 3. IO图表 40 | 41 | Wireshark中打开 tcpdump 获取的 .cap 文件,选择菜单 统计(Statistics)/IO图表(I/O Graph),将间隔改为 1ms, 可以看到以下2个传输过程的图表: 42 | 43 | ![pku-io-2](img/pku-io-2.png) 44 | 45 | ![thu-io-2](img/thu-io-2.png) 46 | 47 | 这个图大致可以看到传输分若干批完成,其中PKU分4批传输,而THU分8批传输。 48 | 49 | 仔细分析数据包可以发现httptest对THU的统计有误,原因在于PKU/THU的TLS传输采用的分组方式不同。 50 | 51 | PKU刚开始时把1408字节长度的TLS包放入一个TCP包传输,如抓包中的第18个数据包。 52 | 53 | 而THU刚开始时把16408字节长度的TLS包放入若干TCP包传输,如抓包中的第13-32包。 54 | 55 | 由于TLS分包传输的原因,THU抓包中的第13-32是一组长度为16408字节的加密分组,httptest读到TLS解密的响应时,必须等到这一组包全部收到, 56 | 这时距离收到第1个响应包已经经过了大约0.0260s,修正结果后: 57 | 58 | | 站点 | DNS解析时间 | TCP/TLS协商时间| 响应时间 | 传输时间 | 内容长度 | 传输速度 | 59 | | --- | ----------: | -------------: | -------: | -------: | ----------: | --------: | 60 | | PKU | 0.0582s | 0.0828s | 0.0283s | 0.0818s | 526119 Byte | 6434683 B/s | 61 | | THU | 0.0293s | 0.0811s | 0.0262s | 0.1836s | 562687 Byte | 3064744 B/s | 62 | 63 | 这样修正后,PKU比THU快了近一倍,大家的网络都差不多,IPv6网络不拥堵,这个大的传输速度差异是什么原因导致的呢? 64 | 65 | ### 4. 传输数据对比 66 | 67 | 为了方便对比,将发送请求后(PKU是第16个包,THU是第12个包)返回的4批数据包汇总如下: 68 | 69 | ![pku_vs_thu](img/pku_vs_thu.png) 70 | 71 | 从中可以看到,PC机发送RWND 128KB左右时,PKU都能填满这个接收窗口。而THU的服务器,会慢慢的从14280(MSS*10)开始增长,逐步填满窗口。 72 | 73 | 由于链路延迟比较大有26ms,从发出请求时刻开始计算,PKU仅仅用110ms即完成了531985字节的传输,而THU使用210ms完成563734字节的传输。两个服务器的TCP层传输速度分别是4.8MB/s和2.7MB/s。 74 | 75 | ### 5. 结论 76 | 77 | TCP传输过程中,窗口的管理对实际传输速度影响很大。对于大带宽/大延迟的链路,使用大的接收/发送窗口才能获得较高的传输速度。 78 | 79 | THU马云龙老师提醒:使用过大的接收发送窗口,存在一定的浪费带宽漏洞。 80 | 81 | 如果服务器端完全接受PC端发来的RWND,PC端可以利用这一点进行CC攻击:使用较大的RWND,发起HTTP GET请求,服务器端在收到ACK前会发送RWND字节的数据,占用网络带宽。 82 | 以上面的抓包为例,攻击者仅仅需要发送3个数据包(SYN,ACK,HTTP GET,加起来300个字节以内,并设置RWND为128KB),服务器会送出128KB字节的TCP包,攻击放大率达到400多倍。 83 | 84 | USTC的反向代理选择使用较大接收/发送窗口,从而取得了较快的访问速度。毕竟USTC的网络带宽有空余,如果将来观察到利用大RWND窗口攻击行为,可能会考虑减少接收/发送窗口。 85 | 86 | 87 | *** 88 | 欢迎 [加入我们整理资料](https://github.com/bg6cq/ITTS) 89 | -------------------------------------------------------------------------------- /network/firewall/tcpstate/README.md: -------------------------------------------------------------------------------- 1 | ## [原创] TCP状态防火墙带来的故障 2 | 3 | 本文原创:**中国科学技术大学 张焕杰** 4 | 5 | 修改时间:2019.04.11 6 | 7 | 防火墙支持所谓的TCP状态跟踪,不幸的是这个功能在应用中会带来不容易定位或处理的疑难杂症。 8 | 9 | ## 一、状态防火墙 10 | 11 | 最早的防火墙是无状态方式工作,仅仅根据数据包中的信息来判断是否允许一个数据包通过。 12 | 13 | 所谓的状态防火墙,会记录连接的状态,只有符合一定时序状态的数据包,才允许通过。 14 | 15 | 比如,某个IP_server是web服务器,开放了tcp 80端口。对于无状态防火墙,任何发送给IP_server的tcp 80端口数据包,都会被允许通过。 16 | 17 | 但是对于状态防火墙,如果IP_Client和IP_server有如下的4个数据包通信,则第3个数据包经过防火墙后, 18 | 防火墙会认为对应的TCP连接已经处于建立状态。此后一段时间(所谓的TCP超时时间)内,如果有第4个数 19 | 据包试图经过防火墙,则会被禁止通过,原因是处于TCP连接建立状态时,不应该出现带有SYN标志的数据包。 20 | 21 | ``` 22 | IP_client:2000 --> IP_server:80 SYN 23 | IP_client:2000 <-- IP_server:80 SYN+ACK 24 | IP_client:2000 --> IP_server:80 ACK 25 | IP_client:2000 --> IP_server:80 SYN (这个包会被禁止通过) 26 | ``` 27 | 28 | 当存在NAT时,状态防火墙是必须的,否则无法工作。 29 | 30 | 其他情况下,状态防火墙不是必须的。一般来说,当启用状态防火墙时,一旦一个连接允许建立,后续的数据包都会允许 31 | 通过防火墙,也就是启用状态防火墙时仅仅考虑新建连接的数据包,不必太多考虑返回的数据包,可以简化防火墙的配置。 32 | 33 | 状态防火墙工作时最容易带来故障的是连接跟踪的超时时间。这类故障的出现有一定的随机性,不容易定位。根据应用环境的不同,要调整合适的超时时间,才能解决故障。 34 | 35 | 下面以几个案例来详细说明和分析。 36 | 37 | ## 二、Linux iptables设置不当引起的Nginx 504错误 38 | 39 | 如下非常简单的网络结构,NginxServer对外提供服务,转发给Apache_Server: 40 | 41 | ``` 42 | NginxServer ---> Apache_Server 43 | ``` 44 | 45 | Apache_Server上设置了如下的iptables规则: 46 | 47 | ``` 48 | iptables -A INPUT -j ACCEPT -m state --state NEW -p tcp --dport 80 -s NginxServer 49 | iptables -A INPUT -j REJECT 50 | ``` 51 | 52 | 系统比较繁忙,大部分时候工作正常,偶尔会碰到Nginx 504错误,特别是一旦重启NginxServer,出现504错误的几率会高很多。 53 | 54 | 504错误往往是Nginx无法连接Apache_Server引起的。经过抓包,发现出现错误时NginxServer收到了REJECT引发的不可达icmp包。 55 | 56 | 未匹配第一行ACCEPT规则与Linux中netfilter的conntrack连接跟踪默认超时时间太长(432000秒,5天)有关。 57 | 一旦出现某些异常,如重启NginxServer,会导致大量的tcp连接仍被认为处于已经建立状态,需要等5天后才会从Apache_server中删除。 58 | 在状态删除之前,NginxServer新建立的连接,如果源端口使用的是处于已经建立状态的连接,会不匹配NEW状态,从而被REJECT,也就是 59 | 回应icmp不可达包。 60 | 61 | 解决办法: 62 | 1. 修改iptables规则,不检查状态。对于高并发的服务器,建议都这样做: 63 | ``` 64 | iptables -A INPUT -j ACCEPT -p tcp --dport 80 -s NginxServer 65 | iptables -A INPUT -j REJECT 66 | ``` 67 | 68 | 2. 如果不涉及NAT,建议完全禁用conntrack连接跟踪,对于高并发的服务器,建议都这样做 69 | 70 | 3. 如果一定要启用连接跟踪,修改conntrack中有关超时时间,可以参考以下链接优化 71 | 72 | * https://github.com/bg6cq/nginx-centos-6 73 | * https://github.com/bg6cq/nginx-centos-7 74 | 75 | 延伸问题: 76 | 77 | 对于高并发的环境,一旦其中牵涉了连接跟踪,重启设备时需要多考虑。比如上面的环境,如果先重启NginxServer, 78 | 再重启Apache_Server,一切正常。如果先重启Apache_Server,再重启NginxServer,就会带来问题。 79 | 80 | ## 三、某防火墙tcp默认超时时间引起的Nginx 504错误 81 | 82 | 如下网络结构,NginxServer对外提供服务,转发给 防火墙 后面的Web_server,防火墙做了NAT。 83 | 84 | ``` 85 | NginxServer ---> 防火墙(NAT) ---> Web_Server 86 | ``` 87 | 88 | NginxServer上观察到偶尔有504错误,某个时间段会突然一分钟出现上百次错误。 89 | 90 | 在Nginx日志中增加 `TIME:$request_time/$upstream_connect_time/$upstream_header_time/$upstream_response_time`,记录处理时间。日志中显示 91 | 出现504错误的访问,$upstream_connect_time全部是设置的proxy_connect_timeout时间10秒。也就是因为Nginx连接Web_Server超时引发了504错误。 92 | 93 | 经检查Web_Server上未开启iptables,仅仅在 防火墙 上有拦截过滤。 94 | 95 | 调整防火墙的超时时间后,未再出现504错误。 96 | 97 | ## 四、某防火墙连接跟踪超时处理bug引起的故障 98 | 99 | 这是10多年前的故障,现在防火墙厂家早就修复了bug。 100 | 101 | 一个防火墙,工作了很久,某一天突然发现连接数持续增多。后重启防火墙后恢复。 102 | 103 | 分析该防火墙内部用32位无符号数存放时间计数器,计数器每秒钟增加100,32位计数器在2^32/100/3600/24=497天,也就是16个半月后就会溢出。时间计数器溢出后,处理超时的代码有bug不再将超时的连接删除,导致连接数越来越多。 104 | 105 | 经检查该防火墙设备上一次重启是在497天左右,将情况向防火墙公司反馈,后升级软件,故障不再出现。 106 | 107 | 108 | 109 | *** 110 | 欢迎 [加入我们整理资料](https://github.com/bg6cq/ITTS) 111 | -------------------------------------------------------------------------------- /network/vxlan/README.md: -------------------------------------------------------------------------------- 1 | ## [原创] 使用vxlan实现校区间vlan透传 2 | 3 | 本文原创:**中国科学技术大学 张焕杰** 4 | 5 | 修改时间:2025.04.27 6 | 7 | # 一、使用vxlan实现校区间vlan透传 8 | 9 | ![vxlan](img/vxlan.png) 10 | 11 | 如上网络拓扑,3台支持VXLAN功能的交换机放置在3个校区,交换机loopback 接口IP是192.168.0.1、192.168.0.2、192.168.0.3。3台交换机的loopback 接口间互相IP可达。 12 | 13 | 实现vlan 100、vlan 200 在校区间透传。 14 | 15 | 下图是使用VXLAN传输以太网包的简单解释。原始的数据包使用UDP发送到对端设备,一般使用UDP端口4789。因此使用VXLAN时,沿途链路的MTU要比通常的1500大,建议不少于1600字节。 16 | 17 | ![vxlan](img/vxlan2.png) 18 | 19 | 以下为使用华为S5731-H交换机作为VTEP交换机的配置示例。 20 | 21 | # 二、交换机1配置 22 | 23 | 以下仅仅展示vxlan有关配置。实现loopback接口互通的配置未提供。 24 | ``` 25 | vlan batch 100 200 26 | 27 | bridge-domain 100 28 | l2 binding vlan 100 29 | vxlan vni 100 30 | bridge-domain 200 31 | l2 binding vlan 200 32 | vxlan vni 200 33 | 34 | interface GigabitEthternet0/0/1 35 | port link-type trunk 36 | port trunk allow-pass vlan 100 200 37 | stp disable 38 | 39 | interface LoopBack0 40 | ip address 192.168.0.1 255.255.255.255 41 | 42 | interface Nve1 43 | source 192.168.0.1 44 | vni 100 head-end peer-list 192.168.0.2 45 | vni 100 head-end peer-list 192.168.0.3 46 | vni 200 head-end peer-list 192.168.0.2 47 | vni 200 head-end peer-list 192.168.0.3 48 | ``` 49 | 50 | # 三、交换机2配置 51 | 52 | 以下仅仅展示vxlan有关配置。实现loopback接口互通的配置未提供。 53 | ``` 54 | vlan batch 100 200 55 | 56 | bridge-domain 100 57 | l2 binding vlan 100 58 | vxlan vni 100 59 | bridge-domain 200 60 | l2 binding vlan 200 61 | vxlan vni 200 62 | 63 | interface GigabitEthternet0/0/1 64 | port link-type trunk 65 | port trunk allow-pass vlan 100 200 66 | stp disable 67 | 68 | interface LoopBack0 69 | ip address 192.168.0.2 255.255.255.255 70 | 71 | interface Nve1 72 | source 192.168.0.2 73 | vni 100 head-end peer-list 192.168.0.1 74 | vni 100 head-end peer-list 192.168.0.3 75 | vni 200 head-end peer-list 192.168.0.1 76 | vni 200 head-end peer-list 192.168.0.3 77 | ``` 78 | 79 | 80 | # 四、交换机3配置 81 | 82 | 以下仅仅展示vxlan有关配置。实现loopback接口互通的配置未提供。 83 | ``` 84 | vlan batch 100 200 85 | 86 | bridge-domain 100 87 | l2 binding vlan 100 88 | vxlan vni 100 89 | bridge-domain 200 90 | l2 binding vlan 200 91 | vxlan vni 200 92 | 93 | interface GigabitEthternet0/0/1 94 | port link-type trunk 95 | port trunk allow-pass vlan 100 200 96 | stp disable 97 | 98 | interface LoopBack0 99 | ip address 192.168.0.3 255.255.255.255 100 | 101 | interface Nve1 102 | source 192.168.0.3 103 | vni 100 head-end peer-list 192.168.0.1 104 | vni 100 head-end peer-list 192.168.0.2 105 | vni 200 head-end peer-list 192.168.0.1 106 | vni 200 head-end peer-list 192.168.0.2 107 | ``` 108 | 109 | # 五、VTEP交换机loopback接口IP可达的实现 110 | 111 | VTEP交换机loopback接口IP可达可以采用多种方式实现。 112 | 113 | 如果VTEP交换机接口2层可达,使用OSPF等动态路由是最简单的方式,这里不再说明。 114 | 115 | 如果VTEP交换机接口间2层不可达,同时有多条链路,可以使用nqa辅助静态路由来实现。如下是一种配置,当ping通对方接口地址时,增加loopback接口IP的静态路由: 116 | 117 | ``` 118 | ip route-static 192.168.0.2 255.255.255.255 192.168.23.2 preference 5 track nqa user test1 119 | 120 | source-interface GigabitEthernet0/0/12 121 | start now 122 | 123 | nqa test-instance user test1h 124 | test-type icmp 125 | destination-address ipv4 192.168.22.1 126 | frequency 11 127 | interval seconds 5 128 | timeout 4 129 | probe-count 2 130 | source-interface GigabitEthernet0/0/12 131 | start now 132 | ``` 133 | 134 | 135 | 136 | 137 | *** 138 | 欢迎 [加入我们整理资料](https://github.com/bg6cq/ITTS) 139 | -------------------------------------------------------------------------------- /security/bgp/exabgp/README.md: -------------------------------------------------------------------------------- 1 | ## [原创]使用ExaBGP发送BGP路由信息和清洗DDoS流量 2 | 3 | 本文原创:**中国科学技术大学 张焕杰** 4 | 5 | 修改时间:2017.11.18 6 | 7 | ## 一、BGP介绍 8 | 9 | BGP是路由协议,通过BGP协议可以方便的控制路由器上的路由表,运维中最常用是用于引流或黑洞路由。 10 | 11 | 把某个IP的next-hop设置为特定的IP,称为引流。用于黑洞路由时, 12 | 通常是把IP的next-hop设置为192.0.2.1,并通过`ip route 192.0.2.1/32 null0` 丢包。 13 | 14 | ## 二、ExaBGP简介 15 | 16 | [ExaBGP](https://github.com/Exa-Networks/exabgp) 是一个python开发的BGP客户端,被称为BGP的瑞士军刀, 17 | 可以与路由器建立BGP连接,发送和接收BGP更新消息。 18 | 19 | 其他程序可以方便的利用简单的文本协议与ExaBGP通信,发送和接收BGP更新消息。 20 | 21 | 本文给出一个简单例子,使用简单文本发送BGP更新消息。 22 | 23 | 需要说明的是,exabgp 4.0版本的配置文件有较大变化,本文使用的是3.4版本。 24 | 25 | ## 三、ExaBGP安装 26 | 27 | 不少系统发行版有ExaBGP,可以直接安装。 28 | 29 | 也可以从github下载,方法是: 30 | 31 | ```` 32 | cd /usr/src/ 33 | git clone https://github.com/Exa-Networks/exabgp.git 34 | cd exabgp 35 | git checkout 3.4 36 | ./bin/healthcheck --help 37 | ```` 38 | healthcheck能运行说明程序安装正常。对于CentOS系统,可能需要安装以下软件包: 39 | ```` 40 | yum install python-argparse python-ipaddr socat 41 | 42 | ```` 43 | 44 | ## 四、ExaBGP配置文件 45 | 46 | 假定本机IP是210.45.230.89,ASN 65500;路由器是210.45.230.90,ASN 24362 47 | 48 | vi /etc/exabgp.conf 49 | 50 | ```` 51 | neighbor 210.45.230.90 { 52 | local-address 210.45.230.89; 53 | peer-as 24362; 54 | local-as 65500; 55 | router-id 210.45.230.89; 56 | process service-dynamic { 57 | run /usr/bin/socat stdout pipe:/var/run/exabgp.cmd; 58 | } 59 | } 60 | ```` 61 | 62 | ## 五、路由器配置片段 63 | 64 | 为了减少风险,仅仅接受ExaBGP发来的/32路由,并且最多接受10条路由。以下为华为/H3C配置: 65 | ```` 66 | ip ip-prefix only32 index 10 permit 0.0.0.0 0 greater-equal 32 less-equal 32 67 | router bgp 24362 68 | peer 210.45.230.89 as-number 65500 69 | ipv4-family unicast 70 | peer 210.45.230.89 enable 71 | peer 210.45.230.89 ip-prefix only32 import 72 | peer 210.45.230.89 route-limit 10 73 | ip route-static 192.0.2.1 32 null0 74 | ```` 75 | 76 | ## 六、ExaBGP启动 77 | 78 | /var/run/exabgp.cmd是其他程序与ExaBGP通信的管道文件。 79 | 80 | 如果是调试,可以使用以下命令启动 81 | ```` 82 | env exabgp.daemon.user=root /usr/src/exabgp/sbin/exabgp /etc/exabgp.conf 83 | ```` 84 | 启动后,程序的输出在屏幕上,从路由器上看到BGP连接建立说明正常。 85 | 86 | 调试完毕,可以使用如下命令启动: 87 | 88 | ```` 89 | env exabgp.daemon.user=root exabgp.daemon.daemonize=true exabgp.daemon.pid=/var/run/exabgp.pid \ 90 | exabgp.log.destination=/var/log/exabgp.log /usr/src/exabgp/sbin/exabgp /etc/exabgp.conf 91 | ```` 92 | /var/log/exabgp.log记录有日志输出。 93 | 94 | ## 七、增加删除路由 95 | 96 | 向/var/run/exabgp.cmd 管道写文本就可以控制ExaBGP发送BGP消息,简单的例子如下: 97 | 98 | 发送BGP路由: 99 | ```` 100 | echo announce route 202.38.95.255/32 next-hop 192.0.2.1 > /var/run/exabgp.cmd 101 | echo announce route 202.38.95.0/32 next-hop 210.45.230.89 > /var/run/exabgp.cmd 102 | ```` 103 | 撤回BGP路由: 104 | ```` 105 | echo withdraw route 202.38.95.255/32 > /var/run/exabgp.cmd 106 | ```` 107 | 执行以上命令后,ExaBGP有信息输出,登录路由器执行 108 | ``` 109 | display bgp routing-table pee 210.45.230.89 received-routes 110 | ``` 111 | 可以看到发来的路由信息。 112 | 113 | ## 八、一个简单的WEB界面 114 | 115 | 请参考 https://github.com/bg6cq/blackip-exabgp 116 | 117 | 使用mysql数据库存放信息,blackip-exabgp.php程序不停的轮询数据库,如果有新的路由需要发送或旧的路由需要撤回,会与 ExaBGP 通信。 118 | 119 | ## 九、使用ExaBGP发送路由处理DDoS攻击 120 | 121 | 我们使用ExaBGP给上游路由器发送受DDoS攻击的IP,把DDoS流量引流到Linux服务器,Linux服务器清洗流量后注入网络。 122 | 123 | ![DDoS引流](DDoS.png) 124 | 125 | 请参考 http://blackholeah.ustc.edu.cn/admin/intro.php 。 126 | 127 | 128 | *** 129 | 欢迎 [加入我们整理资料](https://github.com/bg6cq/ITTS) 130 | -------------------------------------------------------------------------------- /network/switch/stptc/README.md: -------------------------------------------------------------------------------- 1 | ## [原创]2层交换机生成树TC事件的集中记录和处理 2 | 3 | 本文原创:**中国科学技术大学 张焕杰** 4 | 5 | 修改时间:2018.03.24 6 | 7 | 在2层交换机中,生成树的TC(topology change)事件是需要重点关注的。 8 | 9 | 如果是生成树root发生变化的TC事件,会导致局部网络中断几十秒钟。其他的TC事件会触发所有交换机刷新转发表,瞬间产生较多的 10 | flood数据包。这些都会影响局域网的正常运行。 11 | 12 | ## 一、2层交换机典型设置 13 | 14 | 我校的2层交换机主要设置的有: 15 | 16 | * 楼汇聚交换机,设置为生成树root 17 | * 楼层交换机接入用户的接口典型配置如下(以H3C交换机为例): 18 | ``` 19 | interface GigabitEthernet1/0/1 20 | port access vlan xxx 21 | loopback-detection enable 22 | broadcast-suppression pps 10 23 | multicast-suppression pps 10 24 | stp edged-port enable 25 | ``` 26 | 27 | ## 二、TC事件产生的原因 28 | 29 | 设置成`spanning tree edge port`的接口up/down时不会触发TC更新。这样的2层交换机设置在运行时,正常情况下不应该出现TC事件。 30 | 31 | 对于上述设置,交换机出现TC事件有以下几种原因: 32 | 33 | 1. 管理员忘记将用户侧的接口设置为`spanning tree edge port`。 34 | 2. 用户侧接口间存在环路,使得`spanning tree edge port`不起作用,并且触发环路,这是需要尽快发现并解决的。 35 | 3. 户侧接口又连接了交换机,并且开启了生成树。如果该交换机未将接入端口设置为`spanning tree edge port`,接口up/down时引发TC。 36 | 4. 某些交换机重启,重启时与其他交换机间链路的up/down会引发TC。 37 | 38 | 对于上述1、2、3都要重点关注。 39 | 40 | ## 三、TC事件的集中记录和处理 41 | 42 | 为了集中记录和处理TC事件,我们设置一台rsyslog服务器,用来收集楼内汇聚交换机的日志。楼内发生TC事件时,汇聚交换机会将日志发送给rsyslog服务器,并被记录和后续处理。 43 | 44 | ### 3.1 rsyslog服务器配置 45 | 46 | 我们使用的是CentOS 6.9系统,安装后已经有rsyslog服务。只要修改`/etc/rsyslog.conf`后使用`service rsyslog restart`重启服务,并确保UDP端口514对交换机IP开放即可。 47 | 48 | ``` 49 | #允许处理udp接收到的syslog日志 50 | $ModLoad imudp 51 | $UDPServerRun 514 52 | 53 | #增加swlog模版,记录发送设置的IP地址 54 | $template swlog,"%fromhost-ip% %TIMESTAMP% %HOSTNAME% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n" 55 | 56 | #禁止将local3有关的日志写到 message 57 | local3.none;*.info;mail.none;authpriv.none;cron.none /var/log/messages 58 | 59 | #将交换机发来的local3日志写到 /var/log/sw.log,并使用上面定义的模版 swlog 60 | local3.* /var/log/sw.log;swlog 61 | ``` 62 | 63 | 为了避免sw.log一直增长,可以修改`/etc/logrotate.d/syslog`,在其中增加一行`/var/log/sw.log`。 64 | 65 | ### 3.2 交换机的设置 66 | 67 | 我校使用的H3C交换机,只要增加以下配置即可 68 | 69 | ``` 70 | info-center loghost x.x.x.x facility local3 71 | ``` 72 | 73 | `x.x.x.x`是上述rsyslog服务器IP地址。 74 | 75 | 76 | ### 3.3 TC 事件的筛选 77 | 78 | 设置以下crontab任务,定时将TC事件日志存成文件,管理员定期查看文件`topology.txt`即可了解发生过的TC事件。 79 | 80 | 登录到相关交换机上可以进一步查找TC事件的根源,针对不同的原因进行处理即可。 81 | 82 | 83 | ``` 84 | */5 * * * grep "topology" /var/log/sw.log > /var/www/html/topology.txt 85 | ``` 86 | ## 四、TC事件的处理例子 87 | 88 | 如发现有以下的TC日志,说明Ten-GigabitEthernet1/4/6触发了TC事件: 89 | ``` 90 | 202.38.xx.xx Mar 24 15:38:18 2018 Core-7504-ZhongQu %%10STP/6/STP_NOTIFIED_TC: Instance 0's port Ten-GigabitEthernet1/4/6 was notified a topology change. 91 | 202.38.xx.xx Mar 24 15:38:21 2018 Core-7504-ZhongQu %%10STP/6/STP_NOTIFIED_TC: Instance 0's port Ten-GigabitEthernet1/4/6 was notified a topology change. 92 | 202.38.xx.xx Mar 24 15:38:33 2018 Core-7504-ZhongQu %%10STP/6/STP_NOTIFIED_TC: Instance 0's port Ten-GigabitEthernet1/4/6 was notified a topology change. 93 | 202.38.xx.xx Mar 24 15:38:34 2018 Core-7504-ZhongQu %%10STP/6/STP_NOTIFIED_TC: Instance 0's port Ten-GigabitEthernet1/4/6 was notified a topology change. 94 | 202.38.xx.xx Mar 24 15:38:36 2018 Core-7504-ZhongQu %%10STP/6/STP_NOTIFIED_TC: Instance 0's port Ten-GigabitEthernet1/4/6 was notified a topology change. 95 | ``` 96 | 登录该汇聚交换机,执行命令`dis lldp neighbor-information interface ten1/4/6 ver`得知连接的是一台接入交换机。 97 | 98 | 登录该接入交换机,查看对应时间的日志,可以看到那时一个与其他交换机相连的接口up/down引发了TC。经检查连接的是视频监控交换机,估计是管理人员调试插拔网线引起的。 99 | 100 | 101 | *** 102 | 欢迎 [加入我们整理资料](https://github.com/bg6cq/ITTS) 103 | -------------------------------------------------------------------------------- /app/nginx/Cases.md: -------------------------------------------------------------------------------- 1 | #### Nginx 40x错误案例 2 | 3 | **西安财经学院 王伟** 4 | 5 | 修改时间:2017.10.20 6 | 7 | **前言** 8 | 9 | 之前为了不改变现有网站的任何配置,以及可以使用$host参数,我们采用了一个“欺骗”的办法:修改DNS解析以及Nginx服务器的hosts文件。这样现有目标服务器可以不做任何变化。 10 | 11 | **原理:** 12 | 对用户来说,域名被“欺骗”解析到Nginx服务器;对Nginx来说,域名被“欺骗”解析到目标服务器。 13 | 14 | 此时,DNS解析和Nginx服务器的hosts文件,成为能否正常进行反向代理的关键。任何一方出现问题,这种“欺骗”规则就失效了。 15 | 16 | 下面先重复一下真实的例子,然后看看出现的错误。 17 | 18 | **1. 一个Nginx反向代理的例子** 19 | 20 | 一台服务器上运行了30个网站,分别绑定了不同的域名,现在要做反向代理,需要如何实现? 21 | 22 | 其实过程很简单: 23 | 24 | * DNS解析全部执行Nginx服务器 25 | 26 | * Nginx中写hosts文件,将这些域名指向后台服务器的ip 27 | 28 | * Nginx中使用$host参数,然后每个网站的配置方式: 29 | ```` 30 | ······ 31 | proxy_pass http://www.ustc.edu.cn;#真实指向Nginx的那个域名 32 | ······ 33 | ```` 34 | * **后台站点什么操作都不用做** 35 | 36 | 37 | **2. 一个400错误案例** 38 | 39 | 按照上述配置,我们配置了60个网站。但其中一个网站出现了400错误: 40 | 41 | 42 | ```` 43 | 400 Bad Request Request Header Or Cookie Too Large 44 | ```` 45 | 46 | 根据字面理解,是“头文件 或者 COOKIE文件太大了”,搜索到的大多数解决办法也是调整参数: 47 | 48 | 49 | ```` 50 | 51 | client_header_buffer_size 16k; 52 | large_client_header_buffers 4 32k; 53 | 54 | ```` 55 | 56 | 但如果是这个参数设置的问题,应该所有网站都返回相同的错误。很明显这里不是这种情况。 57 | 58 | 后经检查发现,是我们的欺骗规则出现了问题。Nginx服务器的hosts文件有一行被修改,缺少了对`www.ustc.edu.cn`地址的绑定。 59 | 60 | 这就造成了:DNS将用户“欺骗”到Nginx服务器,Nginx服务器查询本地hosts无果,向DNS请求解析后,又被“欺骗”到自己。最终导致Nginx反向代理到自己。 61 | 62 | 这样的死循环造成400错误。 63 | 64 | **3. 一个404错误案例** 65 | 66 | 直接看配置: 67 | 68 | ```` 69 | ...... 70 | #第一段配置 71 | location /tzcs/ { 72 | proxy_pass http://tzcs.xaufe.edu.cn/; 73 | } 74 | #第二段配置 75 | location / { 76 | proxy_pass http://tiyubu.xaufe.edu.cn; 77 | } 78 | ...... 79 | ```` 80 | 81 | 这是发布在不同服务器上的网站,还是利用“欺骗”规则,只是多了一段配置,目的是访问`http://tiyubu.xaufe.edu.cn/tzcs/`时,可以显示`http://tzcs.xaufe.edu.cn`的内容。 82 | 83 | 配置看着是没什么问题的,第二段的跳转也正常。但第一段的跳转却会出现404错误。 84 | 85 | 问题还是出在$host参数上!因为“欺骗”规则需要nginx服务器和目标主机合作才能完成。 86 | 87 | 先考虑第二段配置(使用$host参数): 88 | 89 | * 用户请求`tiyubu.xaufe.edu.cn`,从DNS解析认为`tiyubu.xaufe.edu.cn`是nginx服务器 90 | * nginx服务器认为`tiyubu.xaufe.edu.cn`是目标主机 91 | * 目标主机认为`tiyubu.xaufe.edu.cn`是自己 92 | * 整个过程$host都是`tiyubu.xaufe.edu.cn` 93 | 94 | 所以,用户请求`tiyubu.xaufe.edu.cn`会指向nginx服务器,nginx服务器根据规则跳转到目标主机,目标主机应答请求。 95 | 96 | 再看看第一段配置(同样是使用$host参数): 97 | 98 | * 用户请求`tiyubu.xaufe.edu.cn/tzcs/`,从DNS解析认为`tiyubu.xaufe.edu.cn`是nginx服务器 99 | * nginx服务器认为`tiyubu.xaufe.edu.cn/tzcs/`是目标主机(根据配置,目标主机变成了`tzcs.xaufe.edu.cn`) 100 | * 整个过程$host都是`tiyubu.xaufe.edu.cn` 101 | * 目标主机认为`tzcs.xaufe.edu.cn`是自己,所以不会应答主机头`tiyubu.xaufe.edu.cn`,返回404错误 102 | * 这种404错误,目前测试只会在IIS上出现,非IIS发布的网站仍然可以正常显示(应该和主机头判断的机制有关) 103 | 104 | 要修改这种错误,需要将: 105 | ```` 106 | proxy_set_header Host $host; 107 | ```` 108 | 109 | 改为 110 | 111 | ```` 112 | proxy_set_header Host $proxy_host; 113 | 114 | ```` 115 | 即可解决。 116 | 117 | **注意** 118 | 119 | 这种解决方案并不通用,如果目标主机存在自动刷新,便会跳转至`$proxy_host`,即`tzcs.xaufe.edu.cn`。 120 | 121 | **4.关于`/`符号** 122 | 123 | 注意到上面的例子`/tzcs/`和`http://tzcs.xaufe.edu.cn/`后面都有`/`,两者的含义如下: 124 | 125 | * `/tzcs/`后面带`/`,输入`http://tiyubu.xaufe.edu.cn/tzcs`时会自动补齐后面的`/` 126 | * `http://tzcs.xaufe.edu.cn/`后面带`/`,会传递`/tzcs/`;否则,`http://tiyubu.xaufe.edu.cn/tzcs/TiYuChengJi/123.html`会变成`http://tiyubu.xaufe.edu.cn/TiYuChengJi/123.html` 127 | 128 | **5. 总结** 129 | 130 | * “欺骗”规则需要DNS和Nginx两者共同完成,任何一方都不能出问题。 131 | 132 | * Nginx服务器的hosts文件为何会被修改?原因应该是`NetworkManager`会在重启后根据自己的配置修改hosts。所以修改hosts文件时先临时关闭`NetworkManager` 133 | 134 | 135 | ``` 136 | service NetworkManager stop 137 | ``` 138 | 或者 139 | 140 | 141 | ``` 142 | /bin/systemctl stop NetworkManager.service 143 | ``` 144 | 145 | * 这种“欺骗”规则并不是通用解决办法,容易出现各种意想不到的问题。如果没有特殊情况,还是**强烈建议**使用: 146 | 147 | ```` 148 | proxy_pass http://ip:port;# 149 | ```` 150 | -------------------------------------------------------------------------------- /app/nextcloud/README.md: -------------------------------------------------------------------------------- 1 | ## [原创]使用Nextcloud提供私有网盘服务 2 | 3 | 本文原创:**南京审计大学 吴鑫** 4 | 5 | 修改时间:2017.10.10 6 | 7 | ## 一、Why Nextcloud? 8 | 9 | 1、为什么是Nextcloud? 10 | 11 | 假设你想在校内搭建一个私有云盘服务,并且有以下的需求,那么`Nextcloud`,简称`NC`是你的不二之选 12 | - 没有资金的投入,但是有相应的需求; 13 | - 需要部署在私有云上; 14 | - 有多客户端要求(iOS、Android、MAC、Windows) 15 | - 安全可靠,长期更新 16 | - 有和现有系统(例如`LDAP`集成需求) 17 | - 良好的插件支持,全中文界面 18 | 19 | 2、NC能做什么? 20 | - 将您设备(包括PC、MAC、智能手机)上的文件同步到云空间,并在任意时间、地点,通过任意设备访问; 21 | - 可以使用浏览器,或者客户端、手机APP访问; 22 | - 支持文件版本,不管误删除还是中毒,都可以恢复到以前的版本; 23 | - 在线预览文本、Office文件、图片,无需下载,部分文件可以直接在网页中编辑; 24 | - 收取别人提交的文件,例如交作业。具体使用方式可以参考:点击查看动图 25 | - 建立部门工作档案库,文件版本保持同步,A用户编辑的文档,保存后自动上传到服务器,B用户自动下载最新版本; 26 | - 和其他用户进行协同工作。例如:课题组、社团、项目组,甚至某个会议的与会人员。您只要建立一个共享组,通过学、工号将所有用户加入进来,他们就可以共享对应的文件。 27 | - 将文档公开共享给别的用户。将共享连接发送给别人。共享可以设置加密、过期时间等。例如:需要将您的课件共享给您的学生。 28 | - 私密共享给别的用户随时通过学工号将文件分享给任意校内用户; 29 | 30 | 3、和其他系统区别? 31 | 32 | 其他常见的网盘系统包括`seafile`、`owncloud`等。为什么我选择了`nc`? 33 | - 我有`ldap`集成需求,`seafile`只有收费版才支持 34 | - `nextcloud`实际上就是`owncloud`创始人出来做的一个产品,至少目前很多插件都是可以通用的。个人更看好`nextcloud` 35 | 36 | 37 | 38 | ## 二、环境准备 39 | 在开始之前,请确定你已经准备好以下条件: 40 | - `VMWare`环境的虚拟机(本文以VMWare为例,其他也可以) 41 | - 一定的存储空间 42 | - 数据中心有一台`DHCP`服务器,服务器可以上网 43 | - 一定的`Ubuntu`基础知识 44 | - **一颗不怕折腾的心,一个支持你工作的领导** 45 | 46 | ## 三、安装 47 | - 到`NC`官网,选择`20G`的镜像并下载,地址:`https://www.techandme.se/nextcloud-vm/`,可以多测几次,我使用的是澳大利亚镜像。相对较快。 48 | - 或者直接下载nextcloud的ova,链接: 49 | https://cloud.techandme.se/s/whxC00V1I0l4CY8/download?path=%2F&files=Nextcloud_Community_VM_PRODUCTION.ova 50 | - 压缩包中为`VMDK`文件,请使用`VMWare vCenter Converter`转换。具体使用方法本文跳过。 51 | - 转换完成后,启动,默认账号为`ncadmin`,密码为`nextcloud` 52 | - 随后检测网络,注意网络需要`提前准备好`DHCP才行。配置过程里会让你设置静态IP。 53 | - 安装过程会通过ping网关来确定网络是否可达。请确保网关可ping。 54 | - 然后他会自己找镜像,等一会就行了。 55 | - 需要注意的是,如果没有DHCP,这个OVF似乎无法判断你所在的位置,默认的键位就是瑞典的,`/`会变成`-`,需要使用`sudo dpkg-reconfigure keyboard-configuration`命令重新配置键盘 56 | 57 | 58 | 59 | ## 四、使用 60 | 使用网址登录你的服务器即可使用。默认管理员为`ncadmin`,密码`nextcloud` 61 | 62 | 本文主要面向系统管理员,因此使用说明略过。 63 | 64 | 65 | ## 五、其他系统管理常见问题 66 | 1、关于扩容 67 | 68 | 我们使用的镜像,默认只有20G,1TB和500g的要收费才行。当然,也可以自己操作。 69 | 70 | 具体步骤如下(请自行做好备份) 71 | - 关机,做一个备份(快照) 72 | - 编辑磁盘空间为1.5T。 73 | - 开机 74 | - `sudo -i` 75 | - `echo "- - -" > /sys/class/scsi_host/host0/scan`,扫描 76 | - `cfdisk /dev/sda`, 77 | - cfdisk创建分区(移动到`new`) 78 | - 选择Logic,Type选择Linux8E(LVM),最后write 79 | - 扫描,`partprobe -s` 80 | - 看看当前是是sda几,`fdisk -l` 81 | - 格式化:`mkfs.ext4 /dev/sda6` 82 | - `pvcreate /dev/sda6`,创建pv 83 | - `vgextend nextcloud-vg /dev/sda6`,扩展vg 84 | - `lvextend -L+XXG /dev/nextcloud-vg/root`,扩展lv 85 | - `resize2fs /dev/nextcloud-vg/root` 86 | - `sudo reboot` 87 | - `df -h` 88 | 89 | 2、默认配额 90 | - 默认配额可以设置,点击用户 91 | - 左下角有个齿轮 92 | - 有默认配额设置 93 | 94 | 3、默认文件 95 | - 每个账户新建之后都会有一个默认文件 96 | - 这个文件在`/var/www/nextcloud/core/skeleton`下 97 | - 可以自己编辑,例如放进去你的说明文档 98 | - 上传新文件`不会`影响已经建立的用户 99 | 100 | 4、通知 101 | - 对于支持通知的浏览器(Chrome/Firefox),打开之后就会收到通知信息了 102 | 103 | 104 | 5、修改客户端下载地址 105 | 106 | 默认NC的客户端都需要到国外下载,显然太慢了。 107 | 108 | 可以事先将客户端下载好,并用自己的账号在`nc`中分享。 109 | 110 | 参考: 111 | `https://docs.nextcloud.com/server/11/admin_manual/configuration_server/custom_client_repos.html` 112 | 113 | 打开`NC`的`config.php`中,增加: 114 | ``` 115 | "customclient_desktop" => "https://nc.abc.edu.cn/s/uY0mAhtcGPelMNx", 116 | "customclient_android" => "https://nc.abc.edu.cn/s/J01ipMIqNyPrgQd", 117 | "customclient_ios" => "https://itunes.apple.com/us/app/nextcloud/id1125420102?mt=8", 118 | "customclient_mac" => "https://nc.abc.edu.cn/s/5z52GmGFDAtasJa" 119 | ``` 120 | 121 | ## 六、使用技巧 122 | 123 | - txt等文件,是可以在线编辑的,编辑完,使用`Ctrl+S`就可以保存,很方便是不是? 124 | - 对于现代浏览器(Firefox/Chrome等),可以在浏览器中直接拖动,例如将文件拖动到文件夹中 125 | - 试着双击视频文件,看看有什么效果?(预览) 126 | - 支持版本功能。例如txt文件,当你编辑过之后发现后悔了,点击文件旁边的详细-版本,就可以看到以前编辑的版本并及时恢复 127 | 128 | -------------------------------------------------------------------------------- /security/ssh-yubikey-otp/README.md: -------------------------------------------------------------------------------- 1 | # 在 SSH 上使用 Yubico OTP 两步验证 2 | 3 | 作者:西北农林科技大学 卞一帆 4 | 5 | 创建日期:2019/04/20 6 | 7 | ## Yubikey 和 Yubico OTP 8 | 9 | YubiKey是由Yubico生产的身份认证设备,支持一次性密码(OTP)、公钥加密和身份认证,以及由FIDO联盟(FIDO U2F)开发的通用第二因素(U2F)协议。它允许用户透过提交一次性密码或是使用设备产生的公开/私密密钥来安全地登录自己的帐户。针对不支持一次性密码的网站,YubiKey也可以存储静态密码。Facebook使用YubiKey作为员工凭证;Google同时为雇员和用户提供支持。LastPass、1Password 等密码管理器也支持YubiKey。 10 | 11 | Yubikey实现了基于HMAC的一次性密码算法(HOTP)和基于时间的一次性密码算法(TOTP),并且将本身作为一个通过USB HID协议的键盘来提供一次性密码。新的YubiKey 还包含许多协议,如使用2048位RSA和椭圆曲线加密系统(ECC)p256和p384的OpenPGP卡、近场通信(NFC)以及FIDO U2F。YubiKey允许用户对消息签名、加密且同时不暴露私钥。第4代YubiKey于2015年11月16日推出,支持4096位RSA密钥的OpenPGP,并有PIV智能卡的PKCS11支持,还允许对Docker映像进行代码签名。 12 | 13 | *参考资料:[Yubikey - 维基百科](https://zh.wikipedia.org/wiki/YubiKey)* 14 | 15 | 各种 Yubikey :[Identify your YubiKey](https://www.yubico.com/products/identifying-your-yubikey/) 16 | 17 | Yubico OTP 是所有现在被官方支持的 YubiKey 都有的一个功能,开箱即用。在使用 USB 连接到计算机时触摸按键或将其接触 NFC 设备可以让 YubiKey 产生一个字符串并输入到设备中,这个字符串可以作为两步验证因素。 18 | 19 | *参考资料:[https://developers.yubico.com/OTP/](https://developers.yubico.com/OTP/)* 20 | 21 | ## 目的 22 | 23 | 为了提高安全性,这个配置的目的是使用户可以通过以下认证方式中的一种登录到服务器: 24 | 25 | - 使用 Public Key 26 | - 同时满足以下两个条件 27 | - 输入正确的密码 28 | - 通过 Yubico OTP 的验证 29 | 30 | ## 环境 31 | 32 | 我使用的环境是 Ubuntu 18.04.2 LTS ,于2019年4月20日安装并更新所有软件包到最新版本。YubiKey 型号是 YubiKey 5 NFC 。 33 | 34 | ## 配置 35 | 36 | 1. 安装 pam_yubico : 37 | 38 | ```bash 39 | sudo add-apt-repository ppa:yubico/stable 40 | sudo apt-get update 41 | sudo apt-get install libpam-yubico 42 | ``` 43 | 44 | 2. 申请 API Key 45 | 46 | 访问 [https://upgrade.yubico.com/getapikey/](https://upgrade.yubico.com/getapikey/) ,输入自己的邮箱,并从 Yubikey 输入一个 YubiKey OTP 。 47 | 提交后可以得到一对 Client ID 和 Secret Key 。 48 | 49 | 3. 创建用户组 50 | 51 | 因为不是所有用户都有 YubiKey ,在此创建一个用户组,只有这个用户组里的用户才需要使用 YubiKey 验证。 52 | 53 | 如果需要强制所有人通过 YubiKey 验证,在 PAM 的配置文件里做相应修改,或者在 `sshd_config` 中使用 `AllowGroup` 。 54 | 55 | ```bash 56 | sudo addgroup --gid 401 yubikey 57 | 58 | # 把有 YubiKey 的用户添加到组里 59 | sudo usermod -a -G yubikey bill 60 | ``` 61 | 62 | 4. 创建 YubiKey 数据库 63 | 64 | 创建并编辑 `/etc/ssh/authorized_yubikeys`,内容形如: 65 | 66 | ``` 67 | bill:aaaaaaaaaaaa:bbbbbbbbbbbb 68 | test:cccccccccccc 69 | ``` 70 | 71 | 每行对应一个用户,使用冒号分隔各个字段。每行第一个字段是用户名,后面每个字段代表一个 YubiKey ID (每个 YubiKey OTP 的前 12 位字符)。 72 | 我在配置时,在 vim 中输入 `:` 后触摸我的 YubiKey 5 NFC 上的按键输入一个 YubiKey OTP ,然后按 ESC 退出插入模式,按 `b` 回退到 YubiKey OTP 的开始,再按 `12ld$` 即可删除后续字符,只留前 12 个。 73 | 74 | 这个文件所有者和所属用户组均为 `root` ,权限应当设为 `0600` 。 75 | 76 | 77 | 4. 配置 PAM 78 | 79 | 编辑 `/etc/pam.d/sshd`,在 `@include common-auth` 这一行后面添加: 80 | 81 | ``` 82 | auth [default=1 success=ignore] pam_succeed_if.so user ingroup yubikey 83 | auth required pam_yubico.so id=CLIENT_ID key=SECRET_KEY authfile=/etc/ssh/authorized_yubikeys 84 | ``` 85 | 86 | `CLIENT_ID` 和 `SECRET_KEY` 分别是第二步中申请到的 Client ID 和 Secret Key 。 87 | 88 | 第一行用于判断用户是否是 yubikey 组的成员,如果是则继续验证 YubiKey OTP ,如果不是则跳过 YubiKey 验证。 89 | 90 | 如果要强制所有用户 SSH 登录时进行 YubiKey 验证,删掉第一行即可。 91 | 92 | 5. 配置 sshd 93 | 94 | 编辑 `/etc/ssh/sshd_config` ,做相应修改: 95 | 96 | ``` 97 | ChallengeResponseAuthentication yes 98 | UsePAM yes 99 | ``` 100 | 101 | 然后重启 sshd : `sudo systemctl restart ssh` 102 | 103 | ## 效果 104 | 105 | 使用 Password 方式认证:不在 yubikey 组的用户可以认证成功,yubikey 组用户总是认证失败。 106 | 107 | 使用 PublicKey 方式认证:无论用户是否在 yubikey 组,都可以不需要 YubiKey OTP ,可以直接登录。因为可以认为 PublicKey 方式认证的强度已经足够高,不再需要 YubiKey OTP 。 108 | 109 | 使用 Keyboard Interactive 方式认证:不在 yubikey 组的用户输入密码后即可登录,在 yubikey 组的用户通过密码验证后还要通过 YubiKey OTP 验证才能登录。 110 | 111 | YubiKey OTP 没有时间限制,但是 YubiCloud 服务器在验证 OTP 时会验证 Counter ,确保 Counter 单调增加。详细信息参考[官方文档](https://developers.yubico.com/OTP/OTPs_Explained.html)。 112 | 113 | ![Password Authentication](Jietu20190420-172240.png) 114 | 115 | ![Yubico OTP Authentication](Jietu20190420-172301.png) 116 | 117 | ## 参考资料 118 | 119 | - [LiNode: How to use a YubiKey for Two-Factor Secure Shell Authentication 120 | ](https://www.linode.com/docs/security/authentication/how-to-use-yubikey-for-two-factor-ssh-authentication/) 121 | - [Yubico OTP Documentation](https://developers.yubico.com/OTP/) 122 | -------------------------------------------------------------------------------- /security/mine/README.md: -------------------------------------------------------------------------------- 1 | ## [原创]一次挖矿入侵处理记录(2021.01.27) 2 | 3 | 本文原创:**中国科学技术大学 张焕杰** 4 | 5 | 修改时间:2021.01.27 6 | 7 | 8 | ## 一、突发的大量SSH扫描 9 | 10 | 2021.01.25 22:40,接到用户报告发现有来自校内7个IP的大量SSH扫描。同时,部署的蜜罐也发现有校内IP在进行扫描。 11 | 12 | 这些IP只有一个有校外访问权限对外发起了扫描,其他IP都是校内通信。第一时间禁止了这些IP通信。 13 | 14 | 由于校内服务器管理员和用户安全意识不强,大量使用弱密码,因此类似扫描是经常发生的,一般是服务器被入侵引起的。 15 | 16 | 2021.01.26 发现有一个IP在对外扫描,碰巧管理员是熟悉的老师,就提醒管理员关注。 17 | 18 | 2021.01.27 管理员提供了密码,登录后发现有若干台虚拟机均为简单密码,其中一台有连接校园网的网卡,黑客从这个网卡 19 | 入侵后,又入侵了其他虚拟机。 20 | 21 | ## 二、被入侵机器的查处情况 22 | 23 | 登录被入侵的虚拟机,执行`w、top、netstat`等命令有很大延迟,top看到CPU利用率较高,但显示的进程CPU利用率并不高。 24 | 25 | 执行`rpm -Va`没有看到明显被修改的系统关键文件,`netstat`等程序也未发现明显异常。 26 | 27 | 执行`ldd ldd /usr/bin/ls; ldd /usr/sbin/ss` 发现多了`/lib/libcurl.so.2.17.0 (0x00007f3718028000) 动态库`, 28 | `find / -name libcurl.so.2.17.0` 找不到这个文件 29 | 30 | 执行`strace /bin/ls 2>t` 在t中可以看到 31 | ``` 32 | access("/etc/ld.so.preload", R_OK) = 0 33 | open("/etc/ld.so.preload", O_RDONLY|O_CLOEXEC) = 3 34 | fstat(3, {st_mode=S_IFREG|0644, st_size=22, ...}) = 0 35 | mmap(NULL, 22, PROT_READ|PROT_WRITE, MAP_PRIVATE, 3, 0) = 0x7f4f9c05c000 36 | close(3) = 0 37 | open("/lib/libcurl.so.2.17.0", O_RDONLY|O_CLOEXEC) = 3 38 | read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\20\34\0\0\0\0\0\0"..., 832) = 832 39 | fstat(3, {st_mode=S_IFREG|0755, st_size=27112, ...}) = 0 40 | ``` 41 | 42 | 说明文件是存在的,但是`ls /lib`看不到,怀疑黑客使用/etc/ld.so.preload 加载了动态连接库后门来隐藏信息 43 | (参考 https://www.freebuf.com/column/162604.html ,警惕利用Linux预加载型恶意动态链接库的后门) 44 | 45 | strace配合tcpdump可以发现每次执行命令时,会访问www.fullskystar.top,由于机器无法访问外网,所以命令执行的很慢。 46 | 47 | 允许IP可以访问外网,看到与www.fullskystar.top 443端口有如下典型的挖矿通信流量: 48 | ``` 49 | 发送:{"id":1,"jsonrpc":"2.0","method":"login","params":{"login":"CPU: 4C/4T Memory: 3GB XMRig: 6.6.0 Since:2021/1/25 18:42:4", 50 | "pass":"x","agent":"XMRig/6.6.0 (Linux x86_64) libuv/1.40.0 gcc/9.3.1","algo":["cn/1","cn/2","cn/r","cn/fast","cn/half", 51 | "cn/xao","cn/rto","cn/rwz","cn/zls","cn/double","cn/ccx","rx/0","rx/wow","rx/arq","rx/sfx","rx/keva","argon2/chukwa", 52 | "argon2/chukwav2","argon2/wrkz"]}} 53 | 54 | 接收:{"jsonrpc":"2.0","id":1,"error":null,"result":{"id":"ac694f3d69b506b8","job":{"blob": 55 | "0e0eb6a3c580067396fd31ac9a0b378b84a253e104e5404dae018f2290647ea0f784eabc4de88a00000081db68a2d810b369ca7cbb49f052530888278262d2b52db767c8cb1acc494775235b", 56 | "job_id":"KcXF8WaZx0","target":"ffff0000","algo":"rx/0","height":2283630,"seed_hash":"f1a94ed2953f45f464eb3948e105899933ea0780d3c70918ee78359f2f571985"}, 57 | "extensions":["algo","nicehash","connect","tls","keepalive"],"status":"OK"}} 58 | ``` 59 | 60 | 下载静态编译的busybox,继续处理 61 | ``` 62 | wget https://busybox.net/downloads/binaries/1.28.1-defconfig-multiarch/busybox-x86_64 63 | mv busybox-x86_64 busybox 64 | chmod +x busybox 65 | 66 | [root@localhost ~]# ./busybox ls -al /etc/ld.so.preload 67 | -rw-r--r-- 1 root root 22 Jan 25 17:38 /etc/ld.so.preload 68 | [root@localhost ~]# ./busybox cat /etc/ld.so.preload 69 | /lib/libcurl.so.2.17.0 70 | 71 | [root@localhost ~]# ./busybox ls -al /lib/libcurl.so.2.17.0 72 | -rwxr-xr-x 1 root root 27112 Jan 25 17:38 /lib/libcurl.so.2.17.0 73 | 74 | ``` 75 | 76 | 由此可以判定黑客通过 /etc/ld.so.preload 加载 libcurl.so.2.17.0 动态链接库,拦截对系统的访问,从而隐藏了有关信息, 77 | 导致top、netstat、ls等均无法看到黑客增加的文件和运行的程序。 78 | 79 | ## 三、被入侵机器的处理过程 80 | 81 | 1. 修改密码 82 | 83 | 使用 `passwd` 修改密码 84 | 85 | 2. 删除preload的动态库 86 | 87 | 执行以下命令,执行后ld.so.preload还在,但是libcurl.so.2.17.0被改了名字后不起作用 88 | ``` 89 | [root@localhost ~]# ./busybox sh 90 | ~ # ./busybox chattr -i /lib/libcurl.so.2.17.0; ./busybox mv /lib/libcurl.so.2.17.0 /lib/libcurl.so.2.17.0.old 91 | ~ # exit 92 | 93 | # 执行以上命令后,退出重新登录,否则之前的bash是注入过libcurl.so的 94 | # 下面的命令要等所有注入过libcurl.so.2.17.0的进程都退出后才有用,否则还会被改 95 | # grep libcurl.so.2.17. /proc/*/maps 可以查看哪些进程被注入了 96 | [root@localhost ~]# chattr -i /etc/ld.so.preload 97 | echo -n > /etc/ld.so.preload 98 | ``` 99 | 100 | 3. 清理恶意程序 101 | 102 | 执行以上命令后,top可以看到/usr/bin/bioset占了大量CPU,这是挖矿程序 103 | 104 | `ls -al /usr/bin/bioset` 时间与被入侵的时间一致,同时修改的还有程序/usr/bin/kthreadd 105 | 106 | Kill -9 这两个进程,系统正常。 107 | 108 | 同时发现 /root/.ssh/authorized_keys 中添加有黑客的公钥。 109 | 110 | `chattr -i /usr/bin/kthreadd /usr/bin/bioset /root/.ssh/authorized_keys` 后 111 | 112 | 以上4个文件备份后交给安全同行继续深入分析处理。 113 | 114 | 删除这4个文件,特别是authorized_keys,不然黑客还可以进来。 115 | 116 | 黑客还修改了/etc/resolv.conf,前面加了nameserver 223.6.6.6,但估计程序有bug,在resolv.conf后面填充了0,凑够了256字节,将这个文件也恢复。 117 | 118 | 至此处理完毕。 119 | 120 | *** 121 | 欢迎 [加入我们整理资料](https://github.com/bg6cq/ITTS) 122 | -------------------------------------------------------------------------------- /network/nat/centos7/README.md: -------------------------------------------------------------------------------- 1 | ## [原创]使用CentOS 7做NAT设备 2 | 3 | 本文原创:**中国科学技术大学 张焕杰** 4 | 5 | 修改时间:2017.11.26 6 | 7 | 本文介绍使用CentOS 7用作NAT设备的安装和配置过程。 8 | 9 | ## 一、系统安装 10 | 11 | 安装CentOS 7系统,选择最小安装即可。 12 | 13 | 安装后执行以下命令更新和安装必备软件。 14 | 15 | ``` 16 | yum -y update 17 | 18 | yum -y install git gcc libnetfilter_conntrack libnetfilter_queue libmnl gd httpd screen \ 19 | tcpdump ntpdate conntrack-tools gd-devel net-tools bind-utils telnet 20 | 21 | ``` 22 | 23 | ## 二、禁用SELinux、禁止系统防火墙、启用httpd服务 24 | 25 | 1. 禁用SELinux 26 | 27 | `vi /etc/sysconfig/selinux`把其中的`SELINUX=enforcing`修改为`SELINUX=disabled` 28 | 29 | 2. 禁止系统防火墙、启用httpd服务 30 | 31 | ``` 32 | systemctl stop firewalld.service 33 | systemctl disable firewalld.service 34 | systemctl enable httpd.service 35 | ``` 36 | 37 | ## 三、相关配置文件 38 | 39 | 为了方便,不使用系统来管理网卡的配置,而完全由脚本设置。 40 | 41 | 因此首先编辑网卡配置文件,设置为启动时不启用网卡。我的系统默认网卡是em1,因此编辑文件`/etc/sysconfig/network-scripts/ifcfg-em1`,将其中的`ONBOOT=yes`修改为`ONBOOT=no`。 42 | 43 | 编辑文件`rc.local`和`rc.firewall`: 44 | 45 | `vi /etc/rc.d/rc.local` 46 | 47 | 48 | ```` 49 | #!/bin/sh 50 | 51 | ip link set p1p1 up 52 | ip link set p1p2 up 53 | 54 | # 这是对外的网卡IP地址和网关 55 | ip addr add 202.141.176.10/25 dev p1p1 56 | ip addr add 202.141.176.9/25 dev p1p1 57 | ip route add 0/0 via 202.141.176.126 58 | 59 | # 这是对内的网卡IP地址和静态路由 60 | ip addr add 202.38.96.208/26 dev p1p2 61 | ip route add 202.38.64.0/19 via 202.38.96.194 62 | ip route add 210.45.64.0/20 via 202.38.96.194 63 | ip route add 210.45.112.0/20 via 202.38.96.194 64 | ip route add 211.86.144.0/20 via 202.38.96.194 65 | ip route add 222.195.64.0/19 via 202.38.96.194 66 | ip route add 114.214.160.0/19 via 202.38.96.194 67 | ip route add 114.214.192.0/19 via 202.38.96.194 68 | 69 | # 启用IP路由转发 70 | echo 1 > /proc/sys/net/ipv4/ip_forward 71 | 72 | # 加载连接跟踪模块,设置最大连接数为40*8=320万 73 | modprobe nf_conntrack hashsize=400000 74 | modprobe nf_conntrack_ipv4 75 | modprobe nf_conntrack_ftp 76 | modprobe iptable_nat 77 | modprobe ip_nat_ftp 78 | modprobe nf_conntrack_pptp 79 | 80 | # 调整默认的超时时间 81 | cd /proc/sys/net/netfilter 82 | echo 1 > nf_conntrack_acct 83 | echo 60 > nf_conntrack_generic_timeout 84 | echo 10 > nf_conntrack_icmp_timeout 85 | echo 10 > nf_conntrack_tcp_timeout_close_wait 86 | echo 900 > nf_conntrack_tcp_timeout_established 87 | echo 10 > nf_conntrack_tcp_timeout_fin_wait 88 | echo 10 > nf_conntrack_tcp_timeout_last_ack 89 | echo 10 > nf_conntrack_tcp_timeout_syn_recv 90 | echo 10 > nf_conntrack_tcp_timeout_syn_sent 91 | echo 10 > nf_conntrack_tcp_timeout_time_wait 92 | 93 | /etc/rc.d/rc.firewall 94 | 95 | /usr/src/traffic/iftrafficd & 96 | 97 | /usr/sbin/conntrack -U | wc 98 | 99 | screen -d -m /usr/src/natlog/run & 100 | ```` 101 | 102 | `vi /etc/rc.d/rc.firewall` 103 | 104 | ```` 105 | #!/bin/sh 106 | 107 | iptables -F 108 | iptables -t nat -F 109 | 110 | #iptables -t nat -A POSTROUTING -j SNAT -o eth0 --to 202.141.176.10 111 | iptables -t nat -A POSTROUTING -j SNAT -o p1p1 --to 202.141.176.9 112 | 113 | iptables -A FORWARD -j DROP -p udp --dport 135:139 114 | iptables -A FORWARD -j DROP -p tcp --dport 135:139 115 | iptables -A FORWARD -j DROP -p tcp --dport 445 116 | 117 | iptables -A INPUT -j ACCEPT -i lo 118 | iptables -A INPUT -j ACCEPT -p icmp 119 | iptables -A INPUT -j ACCEPT -p tcp --dport 80 -s 202.38.64.0/18 120 | iptables -A INPUT -j ACCEPT -p tcp --dport 80 -s 211.86.158.0/23 121 | iptables -A INPUT -j ACCEPT -p tcp --dport 80 -s 210.45.0.0/16 122 | iptables -A INPUT -j DROP -p tcp --dport 80 123 | iptables -A INPUT -j ACCEPT -m state --state ESTABLISHED 124 | iptables -A INPUT -j ACCEPT -p tcp --dport 22 -s 202.38.64.0/24 125 | iptables -A INPUT -j ACCEPT -p tcp --dport 22 -s 202.38.96.0/24 126 | iptables -A INPUT -j DROP 127 | 128 | ```` 129 | 将这两个文件设置为可执行 130 | ``` 131 | chmod u+x /etc/rc.d/rc.local /etc/rc.d/rc.firewall 132 | ``` 133 | 134 | ## 四、natlog配置 135 | 136 | `natlog`使用conntrack把连接终止时的NAT信息保存成文本文件,放在/home/natlog目录下。 137 | 138 | 安装: 139 | 140 | ``` 141 | cd /usr/src/ 142 | git clone https://github.com/bg6cq/natlog.git 143 | cd natlog 144 | make 145 | mkdir /home/natlog 146 | ``` 147 | 148 | ## 五、traffic配置 149 | 150 | traffic监视用于快速监视网卡的流量,每秒钟更新。 151 | 152 | 安装: 153 | 154 | ``` 155 | cd /usr/src/ 156 | git clone https://github.com/bg6cq/traffic.git 157 | cd traffic 158 | make 159 | 160 | vi traffic.html 根据自己网卡名字,修改 161 | cp traffic.html /var/www/html/index.html 162 | ``` 163 | 164 | ## 六、调试和功能验证 165 | 166 | 1. 重启CentOS 7服务器后,使用root登录,使用以下命令查看状态是否正常 167 | 168 | ``` 169 | ip addr 170 | ip route 171 | iptables -t nat -L -nv 172 | iptables -L -nv 173 | conntrack -L 174 | ls -al /home/natlog 175 | ``` 176 | 177 | ## 七、注意事项 178 | 179 | /home/natlog 中每天产生一个NAT日志文件,请注意磁盘空间的占用。 180 | 181 | 可以增加如下的crontab自动清理200天的文件: 182 | 183 | ``` 184 | 0 5 * * * find /home/natlog -maxdepth 1 -mtime +200 -name "2*gz" -exec rm -rf {} \; 185 | ``` 186 | 187 | *** 188 | 欢迎 [加入我们整理资料](https://github.com/bg6cq/ITTS) 189 | -------------------------------------------------------------------------------- /other/test/pku-thu.md: -------------------------------------------------------------------------------- 1 | ## PKU比THU慢的真相大白 2 | 3 | 本文原创:**中国科学技术大学 张焕杰** 4 | 5 | 修改时间:2019.05.26 6 | 7 | 说明:本文发出后,PKU修改了设备配置,解决了TCP CWND不超过65535问题,速度大幅提升。 8 | 9 | ### 1. 性能差异来自哪里 10 | 11 | http://github.com/bg6cq/httptest 是一个简单的http/https测试工具。 12 | 13 | 从我的PC机(Mac MINI)对PKU/THU网站上500KB左右的文件测试,结果PKU的传输速度在2.5MB/s,而THU的传输速度可以到3.5MB/s。 14 | 15 | 我的PC机到PKU/THU服务器使用IPv6协议,中间带宽接近1G,延迟大约26ms。 16 | 17 | 为了弄清楚差异的来源,有了本篇文章。 18 | 19 | ### 2. 测试过程 20 | 21 | httptest在Mac OS下编译,需要`brew install glibc-openssl`,并在Makefile中增加 `-I... -L...`等选项。 22 | 23 | 测试过程如下(测试时tcpdump抓包,文件请见 [pku.cap](pku.cap) 和 [thu.cap](thu.cap) ): 24 | ``` 25 | $ ./httptest https://www.pku.edu.cn/images/content/2019-05/20190504221013750682.jpg 26 | 0 0.0019 0.0808 0.0282 0.2145 526119 2452998 https://www.pku.edu.cn/images/content/2019-05/20190504221013750682.jpg 27 | 28 | $ ./httptest -d https://www.tsinghua.edu.cn/publish/thu2018en/11490/20190514123145278682465/20190514123259685120480.jpg 29 | 0 0.0019 0.0801 0.0521 0.1586 562687 3547457 https://www.tsinghua.edu.cn/publish/thu2018en/11490/20190514123145278682465/20190514123259685120480.jpg 30 | ``` 31 | 32 | 上述结果含义如下: 33 | 34 | | 站点 | DNS解析时间 | TCP/TLS协商时间| 响应时间 | 传输时间 | 内容长度 | 传输速度 | 35 | | --- | ----------: | -------------: | -------: | -------: | ----------: | --------: | 36 | | PKU | 0.0019s | 0.0808s | 0.0282s | 0.2145s | 526119 Byte | 2452998 B/s | 37 | | THU | 0.0019s | 0.0801s | 0.0521s | 0.1586s | 562687 Byte | 3547457 B/s | 38 | 39 | ### 3. IO图表 40 | 41 | Wireshark中打开 tcpdump 获取的 .cap 文件,选择菜单 统计(Statistics)/IO图表(I/O Graph),将间隔改为 1ms, 可以看到以下2个传输过程的图表: 42 | 43 | ![pku-io](img/pku-io.jpg) 44 | 45 | ![thu-io](img/thu-io.jpg) 46 | 47 | 这个图大致可以看到传输分若干批完成,其中PKU每批最多60个左右数据包,而THU每批的数据包从开始的10余个逐步增多到100余个。 48 | 49 | 仔细分析数据包可以发现httptest对THU的统计有误,原因在于PKU/THU的TLS传输采用的分组方式不同。 50 | 51 | PKU刚开始时把1408字节长度的TLS包放入一个TCP包传输,如抓包中的第18个数据包。 52 | 53 | 而THU刚开始时把16408字节长度的TLS包放入若干TCP包传输,如抓包中的第13-32包。 54 | 55 | 后续的传输,PKU也有将一个TLS包放入多个TCP包传输的。 56 | 57 | 由于TLS分包传输的原因,THU抓包中的第13-32是一组长度为16408字节的加密分组,httptest读到TLS解密的响应时,必须等到这一组包全部收到, 58 | 这时距离收到第1个响应包已经经过了大约0.0259s,修正结果后: 59 | 60 | | 站点 | DNS解析时间 | TCP/TLS协商时间| 响应时间 | 传输时间 | 内容长度 | 传输速度 | 61 | | --- | ----------: | -------------: | -------: | -------: | ----------: | --------: | 62 | | PKU | 0.0019s | 0.0808s | 0.0282s | 0.2145s | 526119 Byte | 2452998 B/s | 63 | | THU | 0.0019s | 0.0801s | 0.0262s | 0.1845s | 562687 Byte | 3049794 B/s | 64 | 65 | 即便这样修正后,PKU还是比THU慢一些,原因在哪里呢? 66 | 67 | ### 4. 第1批数据包对比 68 | 69 | 第1批数据包指的是客户端发出HTTP GET后,服务器返回的第1批数据包。 70 | 71 | PKU的第1批数据包是抓包中的第18-38、第61-62、第68-91共47个数据包,从0.108201秒 - 0.109657秒,对应的TCP窗口是 3046 - 68580,即服务器端CWND是65535字节。 72 | 73 | 客户端建立连接时,第1个包RWND是65535(据说windows和Mac OS是这样,Linux是MSS*10),后续已经增大,第3个包为131328,第4个包为131328,...,最后一次发给服务器端而且服务器一定收到第16个包为131072。 74 | 75 | THU的第1批数据包是抓包中的第13-15、第18、第20-21、第24-25、第27、第29共10个数据包,从0.106035秒 - 0.106977秒,对应的TCP窗口是 2954 - 17233,即服务器端CWND是14280字节。 76 | 77 | 客户端建立连接时,第1个包RWND是65535,后续已经增大,第3个包为131328,第4个包为131328,...,最后一次发给服务器端而且服务器一定收到第12个包为131072。 78 | 79 | 从这里可以看到发送第1批数据时,PKU CWND是65535字节,THU CWND是14280字节。IPv6的时候,TCP包MSS是1428字节,MSS*10=14280字节,这似乎是某个版本后Linux kernel默认的行为。 80 | 81 | ### 5. 第2批数据包对比 82 | 83 | PKU的第2批数据包是抓包中的第118-196中的数据包,从0.134567秒 - 0.137032秒,对应的TCP窗口是 68581 - 134115,即服务器端CWND是65535字节。 84 | 85 | 这期间客户端发送给服务器的RWND一直在128KB左右。 86 | 87 | THU的第2批数据包是抓包中的第30-52中的数据包,从0.131817秒 - 0.133239秒,对应的TCP窗口是 17234 - 35797 ,即服务器端CWND是18564字节。 88 | 89 | 这期间客户端发送给服务器的RWND一直在128KB左右。 90 | 91 | 从这里可以看到发送第2批数据时,PKU CWND是65535字节,THU CWND是18564字节。 92 | 93 | ### 6. 第3批数据包对比 94 | 95 | PKU的第3批数据包是抓包中的第222-303中的数据包,从0.160474秒 - 0.163618秒,对应的TCP窗口是 134116 - 199650,即服务器端CWND是65535字节。 96 | 97 | 这期间客户端发送给服务器的RWND一直在128KB左右。 98 | 99 | THU的第3批数据包是抓包中的第53-85中的数据包,从0.157658秒 - 0.158932秒,对应的TCP窗口是 35798 - 70069 ,即服务器端CWND是34272字节。 100 | 101 | 这期间客户端发送给服务器的RWND一直在128KB左右。 102 | 103 | 从这里可以看到发送第3批数据时,PKU CWND是65535字节,THU CWND是34272字节。 104 | 105 | ### 7. 第7批数据包对比 106 | 107 | PKU的第7批数据包是抓包中的第631-713中的数据包,从0.264673秒 - 0.271003秒,对应的TCP窗口是 395909 - 461443,即服务器端CWND是65535字节。 108 | 109 | 这期间客户端发送给服务器的RWND一直在128KB左右。 110 | 111 | THU的第7批数据包是抓包中的第430-593中的数据包,从0.262267秒 - 0.264761秒,对应的TCP窗口是 337106 - 498235 ,即服务器端CWND是161130字节。 112 | 113 | 这期间客户端发送给服务器的RWND增大到240KB左右。 114 | 115 | 从这里可以看到发送第7批数据时,PKU CWND是65535字节,THU CWND是161130字节。 116 | 117 | ### 8. 结论 118 | 119 | 根据上面分析,可以看到PKU服务器发送CWND窗口一直未超过65535,由于链路有26ms的延迟,导致理论最高传输带宽为65535/0.026=2520576 Byte/s。 120 | 121 | 而THU服务器端的发送CWND窗口会跟随客户端的RWND慢慢增大,所以传输会随着时间的推移,逐步增大。 122 | 123 | 越大的文件,THU比PKU快的越明显。 124 | 125 | ### 9. 可视化的工具方便查到问题 126 | 127 | Wireshark中,菜单 统计(Statistics)/TCP流图形(TCP Stream Graphs)/时间序列(Stevens)(Time Sequence(Stevens)) 会生成下面的图形。 128 | 129 | 图形的一段一段代表TCP的序列号增长情况,可以看到PKU的每次增长几乎是相同的,而THU则越来越多。 130 | 131 | ![pku-ts](img/pku-ts.jpg) 132 | 133 | ![thu-ts](img/thu-ts.jpg) 134 | 135 | 136 | 137 | *** 138 | 欢迎 [加入我们整理资料](https://github.com/bg6cq/ITTS) 139 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 高校网络信息技术有关文档 2 | 3 | 1. 机房环境 4 | 1. 门禁 5 | 2. 精密空调 6 | 3. UPS 7 | 4. 环境监测([通过RS485总线使用Modbus RTU over TCP 协议采集环境传感器信息](env/modbus/README.md)) 8 | 2. 网络 9 | 1. 网络防火墙([使用CentOS 7做NAT设备](network/nat/centos7/README.md), [TCP状态防火墙带来的故障](network/firewall/tcpstate/README.md)) 10 | 2. 路由器 11 | 3. 交换机([2层交换机生成树TC事件的集中记录和处](network/switch/stptc/README.md), [交换机sflow抓包的简单说明](network/switch/sflow/README.md) [初试盛科TAP交换机](network/switch/tap/README.md), [使用vxlan实现校区间vlan透传](network/vxlan/README.md)) 12 | 4. AC控制器([H3C AC/AP隐藏调试命令](network/wireless/h3c/README.md)) 13 | 5. VPN([通过互联网桥接2个以太网段](https://github.com/bg6cq/ethudp/blob/master/sample2/README.md), [ 14 | OpenVPN的安装与部署(ldap进行身份认证+记录用户访问日志并发送邮件)](network/vpn/openvpn_ldap/README.md), 15 | [ 16 | L2TPVPN 服务器安装(Centos7) ](network/vpn/l2tpvpn) ) 17 | 6. 流量控制 18 | 7. 缓存服务([IXCache使用介绍](network/ixcache/README.md)) 19 | 3. 服务器存储 20 | 1. 服务器 21 | 2. 存储 22 | 3. VMWare 23 | 4. Hyper-V 24 | 5. KVM 25 | 6. citrix 26 | 7. 集群 27 | 8. Docker 28 | 4. 操作系统 29 | 1. windows server 30 | 2. windows 7/8/10 31 | 3. CentOS/Redhat 32 | 4. Debian 33 | 5. ubuntu 34 | 6. [主机防火墙](OS/firewall/README.md) 35 | 5. 数据库 36 | 1. MS SQL Server 37 | 2. Oracle 38 | 3. MySQL 39 | 4. NoSQL 40 | 6. 中间件 41 | 1. tomcat 42 | 7. 应用系统 43 | 1. apache([cenots 7 httpd 安装及安全加固](https://abanger.github.io/maintenance/2018/06/08/centos-7-httpd-security-reinforcement.html), [使用httptest监控网站服务](app/www/httpmonitor/README.md)) 44 | 2. nginx([step-by-step install nginx反向代理服务器](https://github.com/bg6cq/nginx-install), [nginx反向代理服务器](app/nginx/README.md), [nginx-rrd绘图参数](app/nginx/nginx-rrd/README.md), [Nginx 400错误案例](app/nginx/Cases.md), [使用lua对反向代理做权限控制](https://github.com/bg6cq/nginxauth), [Nginx服务器优化](app/nginx/nginx-opt)) 45 | 3. iis 46 | 4. ftp([ProFTPd配置TLS](app/ftp/proftpd-tls.md), [ProFTPd配置LDAP](app/ftp/proftpd-ldap.md)) 47 | 5. dns([自己建立根DNS服务器](app/dns/root/README.md), [为何DNS服务器要禁用连接跟踪](app/dns/whynoconntrack/README.md), [DNS服务器的iptables规则](app/dns/iptables/README.md), [git辅助DNS服务器的运行](app/dns/dns_with_git/README.md), [ustc.edu.cn 域增加DNSSEC功能过程](app/dns/dnssec/README.md), [CoreDNS尝试](app/dns/coredns/README.md)) 48 | 6. ntp([建立ntp服务器](app/ntp/README.md), [用GPS模块建立高精度ntp服务器](app/ntp/gps/README.md)) 49 | 7. dhcp([Linux下ISC dhcpd分配状态显示](app/dhcp/dhcpd-pool/README.md)) 50 | 8. [使用Nextcloud提供私有网盘服务](app/nextcloud/README.md) 51 | 9. [启用SPF、DKIM、DMARC提高邮件系统安全性](app/mail/spf_dkim/README.md) 52 | 8. 安全管理 53 | 1. [系统上线前安全评测技术要求](security/checklist/README.md) 54 | 2. [使用Let's encrypt免费SSL证书/getssl](security/ssl/letsencrypt/README.md) 55 | 3. [使用Let's encrypt免费SSL证书/acme.sh](security/ssl/acme.sh/README.md) 56 | 4. [自建CA签发证书](security/ca/README.md) 57 | 5. [使用git监控www文件并自动恢复](security/www/git/README.md) 58 | 6. [自动修改发垃圾邮件的账号密码(针对coremail环境)](security/mail/README.md) 59 | 7. [ntpd/bind/IOS/JunOS等安全配置模板](http://www.team-cymru.org/templates.html) 60 | 8. [使用ExaBGP发送BGP路由信息和清洗DDoS流量](security/bgp/exabgp/README.md) 61 | 9. [使用ipsec加密Linux主机间通信](security/ipsec/README.md) 62 | 10. [安全责任书模板](security/anquanzerenshu.md) 63 | 11. [两步(多因素)认证原理及应用](security/mfa/README.md) 64 | 12. [Top 20 OpenSSH Server Best Security Practices](https://www.cyberciti.biz/tips/linux-unix-bsd-openssh-server-best-practices.html) 65 | 13. [高校等保一级应用系统的管理模式探究](security/l1.md) 66 | 14. [从一个简单的备份需求演示gpg的使用](security/gpg/README.md) 67 | 15. [人人都需要一个yubikey](security/yubikey/README.md) 68 | 16. [在 SSH 服务器上使用 YubiKey OTP 进行两步认证](security/ssh-yubikey-otp/README.md) 69 | 17. [一次挖矿入侵处理记录(2021.01.27)](security/mine/README.md) 70 | 18. [收集H3C路由器/防火墙输出的NAT流日志(userlog/flowlog)](https://github.com/bg6cq/h3cflowd) 71 | 19. [使用deepseek辅助一次安全入侵事件分析(2025.03.22)](security/gh0st/README.md) 72 | 73 | 9. 杂项 74 | 1. [centos7 eduroam freeradius 安装记录](other/eduroam/README.md) 75 | 2. [网站测试中发现的有趣现象](other/test/README.md) 76 | 3. [深入数据包分析pku和thu网站传输速度差异](other/test/pku_vs_thu.md) 77 | 4. [2张图1分钟快速定位TCP故障原因](other/wireshark/README.md) 78 | 5. [CentOS 6 php 使用ACS ACR1252U USB NFC读卡器 读取卡UID](other/nfc/README.md) 79 | 6. [自建bark-server向苹果手机发送通知消息](other/bark/README.md) 80 | 7. [常用脚本](other/util/README.md) 81 | 82 | 10. 标杆文档 83 | 1. [中山大学信息技术安全管理办法](http://info.sysu.edu.cn/node/160) 84 | 85 | 11. 相关法律法规 86 | 1. [中华人民共和国网络安全法](http://www.npc.gov.cn/npc/xinwen/2016-11/07/content_2001605.htm) 87 | 2. [中华人民共和国国家安全法](http://www.npc.gov.cn/npc/xinwen/2015-07/07/content_1941161.htm) 88 | 3. [中华人民共和国保守国家秘密法](http://www.npc.gov.cn/huiyi/cwh/1114/2010-04/29/content_1571766.htm) 89 | 4. [中华人民共和国反恐怖主义法](http://www.npc.gov.cn/npc/xinwen/2015-12/28/content_1957401.htm) 90 | 5. [中华人民共和国反间谍法](http://www.npc.gov.cn/npc/xinwen/2014-11/02/content_1884660.htm) 91 | 6. [刑法修正案(九)](http://www.npc.gov.cn/npc/xinwen/2015-08/31/content_1945587.htm) 92 | 12. 其他 93 | 1. [每日更新的电信,联通,移动等ISP地址段](https://ispip.clang.cn) 94 | 2. [中国运营商IP地址库(每日更新)](https://github.com/gaoyifan/china-operator-ip/tree/ip-lists) 95 | 3. [中国大陆根DNS服务器的奥秘](other/dns/README.md) 96 | 4. [可扩展视频直播设施建设](other/live/README.md) 97 | 98 | 欢迎 [加入我们整理资料](work.md) 99 | -------------------------------------------------------------------------------- /other/dns/README.md: -------------------------------------------------------------------------------- 1 | ## [原创] 中国大陆根DNS服务器的奥秘 2 | 3 | 本文原创:**中国科学技术大学 张焕杰** 4 | 5 | 修改时间:2017.12.03 6 | 7 | 前几天一条标题是"中国部署4台IPv6根DNS,自主掌控互联网中枢命脉"的新闻刷了屏,针对该新闻暂不发表意见。 8 | 9 | 我们来看看中国大陆根DNS服务器的奥秘。 10 | 11 | 根DNS服务器是互联网上DNS工作最核心的服务器,它存放的信息和处理功能其实很简单。 12 | 13 | # 一、根DNS服务器存有什么信息 14 | 15 | 根DNS服务器上存放有顶级域的域名,以及负责该顶级域解析的域名服务器信息。 16 | 17 | 比如中国的顶级域.cn,在根DNS服务器中就有如下的信息: 18 | 19 | ```` 20 | cn. 172800 IN NS a.dns.cn. 21 | cn. 172800 IN NS b.dns.cn. 22 | cn. 172800 IN NS c.dns.cn. 23 | cn. 172800 IN NS d.dns.cn. 24 | cn. 172800 IN NS e.dns.cn. 25 | cn. 172800 IN NS ns.cernet.net. 26 | ns.cernet.net. 172800 IN A 202.112.0.44 27 | a.dns.cn. 172800 IN A 203.119.25.1 28 | a.dns.cn. 172800 IN AAAA 2001:dc7:0:0:0:0:0:1 29 | b.dns.cn. 172800 IN A 203.119.26.1 30 | c.dns.cn. 172800 IN A 203.119.27.1 31 | d.dns.cn. 172800 IN A 203.119.28.1 32 | d.dns.cn. 172800 IN AAAA 2001:dc7:1000:0:0:0:0:1 33 | e.dns.cn. 172800 IN A 203.119.29.1 34 | h.dns.cn. 172800 IN A 125.208.32.1 35 | h.dns.cn. 172800 IN AAAA 2001:dc7:fffe:0:0:0:0:1 36 | i.dns.cn. 172800 IN A 125.208.33.1 37 | i.dns.cn. 172800 IN AAAA 2001:dc7:ffff:0:0:0:0:1 38 | j.dns.cn. 172800 IN A 125.208.34.1 39 | k.dns.cn. 172800 IN A 125.208.35.1 40 | l.dns.cn. 172800 IN A 125.208.36.1 41 | ```` 42 | 43 | 细心的会看出来,前面只有a-e.dns.cn,后面的h-l.dns.cn是干什么用的呢?后面的那些是".中国"之类的中文域名解析 44 | 使用的。 45 | 46 | 这些信息不是机密,负责DNS的机构IANA在 [Root Zone File](https://www.iana.org/domains/root/files) 公开提供,目前该文件大小是2.2MB。 47 | 48 | # 二、根DNS服务器的处理过程 49 | 50 | 当一台DNS服务器解析一个域名时,首先向根DNS域名服务器发送请求。 51 | 52 | 比如一台DNS服务器需要查询科大的主页`www.ustc.edu.cn`对应的IP地址,它会首先向某一个根DNS服务器发送 53 | `wwww.ustc.edu.cn`的域名请求。根DNS服务器接到请求后,根据自己保存的信息,返回一个下面的应答 54 | ``` 55 | ;; AUTHORITY SECTION: 56 | cn. 172800 IN NS a.dns.cn. 57 | cn. 172800 IN NS e.dns.cn. 58 | cn. 172800 IN NS d.dns.cn. 59 | cn. 172800 IN NS c.dns.cn. 60 | cn. 172800 IN NS ns.cernet.net. 61 | cn. 172800 IN NS b.dns.cn. 62 | ;; ADDITIONAL SECTION: 63 | a.dns.cn. 172800 IN A 203.119.25.1 64 | a.dns.cn. 172800 IN AAAA 2001:dc7::1 65 | b.dns.cn. 172800 IN A 203.119.26.1 66 | c.dns.cn. 172800 IN A 203.119.27.1 67 | d.dns.cn. 172800 IN A 203.119.28.1 68 | d.dns.cn. 172800 IN AAAA 2001:dc7:1000::1 69 | e.dns.cn. 172800 IN A 203.119.29.1 70 | ns.cernet.net. 172800 IN A 202.112.0.44 71 | ``` 72 | 73 | 这些应答的含义是:请向`a.dns.cn、b.dns.cn、... ns.cernet.net`查询,它们会负责处理`www.ustc.edu.cn`有关的信息。 74 | 75 | 域名服务器会从`a.dns.cn、b.dns.cn、... ns.cernet.net`挑一个,向它发送查询。这样的步骤一直持续,直到有个域名服务器返回了IP地址信息。 76 | 77 | 从上面过程看,根DNS服务器需要进行的处理真的很简单。 78 | 79 | 那问题来了,一个普通的DNS服务器,怎么知道谁是根DNS服务器呢? 80 | 81 | 答案很简单,每个DNS服务器都有个文件,存放有根DNS服务器的信息,这个文件很小,有用的信息只有13*3=39行,每3行是一个根DNS服务器的信息,如下所示: 82 | ``` 83 | . 3600000 NS A.ROOT-SERVERS.NET. 84 | A.ROOT-SERVERS.NET. 3600000 A 198.41.0.4 85 | A.ROOT-SERVERS.NET. 3600000 AAAA 2001:503:ba3e::2:30 86 | ``` 87 | DNS服务软件会附带提供这个文件,一般很少修改。IANA也有提供,放在 [Root Hints File](https://www.iana.org/domains/root/files)。如果你维护有DNS服务器,建议从这里下载最新的更新一下。 88 | 89 | 如果每次域名查询都这样从根DNS开始,查询响应的速度会很慢。实际上DNS服务器会尽量使用缓存,减少不必要的查询,大大加快域名查询的响应速度。 90 | 91 | # 三、一共有多少个根DNS服务器呢 92 | 93 | 这个问题很不好回答。 94 | 95 | 由于UDP数据包长度的原因,根DNS服务器最多只有13个,就是 a-m.root-servers.net。 96 | 97 | 但这仅仅是有13个不同名字(地址)的根DNS服务器,实际上每个名字(地址)对应有多台服务器,或者说存在很多台根DNS服务器,它们具有相同的IP地址。 98 | 99 | 一般来说,互联网上的IP很少会重叠使用,也就是说很少有2台设备使用相同的IP地址。但例外就是DNS这种服务,称为AnyCast服务,可以由很多设备使用相同的IP,就近对外提供服务。 100 | 101 | [http://root-servers.org/](http://root-servers.org/) 网站公布有分布在全球的根DNS服务器,从这里可以看到中国大陆有若干。 102 | 103 | 104 | # 四、自己可以做根DNS服务器吗 105 | 106 | 当然可以,而且非常简单。只要安装DNS服务软件,定期从IANA网站下载那个2.2MB的根文件,就可以做根DNS服务器了。 107 | 108 | 为了方便使用,需要在公布的那些IP地址提供服务,一般来说需要利用BGP/OSPF/静态路由之类手段的把路由注入到网络中 109 | (注入是文雅的说法,其实就是劫持到根DNS服务器IP的路由),因此最好是ISP来做才比较方便。 110 | 111 | 使用BGP注入路由并不复杂,远比想象的简单,可以参考 [使用ExaBGP发送BGP路由信息和清洗DDoS流量](../../security/bgp/exabgp/README.md) 112 | 113 | # 五、国内有ISP做根DNS服务器吗 114 | 115 | 当然有了,比如中国教育和科研计算机网,从合肥测试的话,与a-m.root-servers.net的通信延迟,主要分3档: 116 | 117 | |延迟|服务器| 118 | |----|------| 119 | |0ms |f j| 120 | |30ms|a b c d e g i k l m| 121 | |300ms|h| 122 | 123 | 从延迟可以推断,f j这两个服务器就在合肥(确切的说就在中国科学技术大学网络信息中心机房内),h服务器不在国内,其它的在中国教育和科研计算机网内的某个地方。 124 | 125 | 仅仅中国教育和科研计算机网内就至少有12个根DNS服务器,而且其中2个就在合肥。 126 | 127 | 到这里就明白为什么很难回答有多少个根DNS服务器,因为谁也不知道。 128 | 129 | 130 | *** 131 | 欢迎 [加入我们整理资料](https://github.com/bg6cq/ITTS) 132 | -------------------------------------------------------------------------------- /security/ssl/letsencrypt/README.md: -------------------------------------------------------------------------------- 1 | ## [原创]使用Let's encrypt免费SSL证书 2 | 3 | 本文原创:**中国科学技术大学 张焕杰** 4 | 5 | 修改时间:2017.10.04 6 | 7 | 重要更新:2020.02.01 8 | 9 | ## 重要更新 10 | 11 | Let's encrypt 升级了api接口,原有的不久将禁用。之前安装的,可以按照如下步骤升级: 12 | 13 | 1. 升级 getssl 程序 14 | 15 | 选择两种方式之一升级即可,最简单的: 16 | ``` 17 | cd /usr/src/getssl 18 | ./getssl -u 19 | ``` 20 | 以上过程,getssl会自动下载最新的版本。或者采用如下方式升级: 21 | 22 | ``` 23 | cd /usr/src/getssl 24 | curl --silent https://raw.githubusercontent.com/srvrco/getssl/master/getssl > getssl ; chmod 700 getssl 25 | ``` 26 | 27 | 2. 修改 程序API接口 28 | 29 | 执行vi /root/.getssl/getssl.cfg,把其中的 30 | ```` 31 | CA="https://acme-v01.api.letsencrypt.org" 32 | ```` 33 | 34 | 修改为: 35 | ```` 36 | CA="https://acme-v02.api.letsencrypt.org" 37 | ```` 38 | 39 | 40 | ## 一、SSL证书产生过程介绍 41 | 42 | 1. SSL证书产生过程涉及以下几个概念: 43 | 44 | * 服务器密钥:扩展名一般是.key。一般我们使用的是rsa算法,服务器自己生成的一组数为私钥和对应的公钥。私钥需要安全存放,不让其他人知道。 45 | 46 | * 证书签名请求:Certificate Signing Request,扩展名一般是.csr。服务器将自己的公钥hash后,加上希望绑定的域名信息,生成.csr文件。 47 | 48 | * 证书:扩展名一般是.crt。服务器将.csr文件交给CA机构,CA机构验证服务器真实拥有该域名后,用CA机构的私钥对这些信息签名,生成.crt文件。 49 | 50 | * 证书链:CA机构的证书是安装到客户机系统的,为了安全起见,CA机构会为自己的二级CA签发证书,最后由该二级CA对普通用户签发证书,证书链是记录该关系的。不提供证书链可以工作,但有时候会有告警。 51 | 52 | 2. CA服务机构 53 | 54 | CA服务机构的存在是做为公认的第三方来验证服务器身份,这中间可能需要收取服务费。 55 | 56 | 为了方便使用,可以选择Let's encrypt免费CA机构签发证书。Let's encrypt已被广泛接受,申请证书也比较快捷,一般来说5分钟内可以完成从开始安装程序到申请证书过程。需要说明的是Let's encrypt签发的证书有效期是90天,在到期之前需完成证书更新。 57 | 58 | 3. Let's encrypt免费证书颁发过程 59 | 60 | * 服务器生成私钥,产生.csr文件 61 | * 服务器将.csr文件交给Let's encrypt服务器 62 | * Let's encrypt服务器提供一个随机字符串,要求放在网站的.well-known/acme-challenge目录下 63 | * 服务器将随机字符串放在.well-known/acme-challenge目录下 64 | * Let's encrypt服务器通过http访问到该随机字符串,验证服务器拥有该域名,颁发证书 65 | 66 | ## 二、Let's encrypt 证书生成工具 67 | 68 | 有很多种Let's encrypt 证书生成工具,这里介绍完全由shell脚本完成整个过程的getssl [https://github.com/srvrco/getssl](https://github.com/srvrco/getssl)。 69 | 70 | 以下过程使用域名blackip.ustc.edu.cn演示,服务器是apache。 71 | 72 | 1. 安装过程 73 | ```` 74 | mkdir /usr/src/getssl 75 | cd /usr/src/getssl 76 | curl --silent https://raw.githubusercontent.com/srvrco/getssl/master/getssl > getssl ; chmod 700 getssl 77 | ```` 78 | 79 | 2. 生成基本配置 80 | ```` 81 | cd /usr/src/getssl 82 | ./getssl -c blackip.ustc.edu.cn 83 | ```` 84 | 3. 修改配置 85 | ```` 86 | vi /root/.getssl/getssl.cfg /root/.getssl/blackip.ustc.edu.cn/getssl.cfg 87 | ```` 88 | 其中/root/.getssl/getssl.cfg修改为: 89 | ```` 90 | CA="https://acme-v02.api.letsencrypt.org" 91 | ACCOUNT_EMAIL="james@ustc.edu.cn" 92 | ```` 93 | /root/.getssl/blackip.ustc.edu.cn/getssl.cfg修改为: 94 | ```` 95 | ACL=('/var/www/html/.well-known/acme-challenge') 96 | 97 | DOMAIN_CERT_LOCATION="/etc/ssl/blackip.ustc.edu.cn.crt" 98 | DOMAIN_KEY_LOCATION="/etc/ssl/blackip.ustc.edu.cn.key" 99 | CA_CERT_LOCATION="/etc/ssl/chain.crt" 100 | 101 | #对于nginx, 需要full_chain.pem(其实这个文件就是blackip.ustc.edu.cn.crt + chain.crt),可以使用 102 | #DOMAIN_CHAIN_LOCATION="/etc/ssl/blackip.ustc.edu.cn.full_chain.pem" 103 | 104 | RELOAD_CMD="/sbin/service httpd restart" 105 | ```` 106 | 107 | 4. 获取证书 108 | 109 | 执行命令获取证书 110 | ```` 111 | ./getssl -d blackip.ustc.edu.cn 112 | ```` 113 | 执行完毕后/root/.getssl/blackip.ustc.edu.cn会有四个文件,使用以下命令可以看到文件的内容: 114 | 115 | ```` 116 | #服务器私钥 117 | openssl rsa -noout -text -in blackip.ustc.edu.cn.key 118 | #证书签名请求 119 | openssl req -noout -text -in blackip.ustc.edu.cn.csr 120 | #证书 121 | openssl x509 -in blackip.ustc.edu.cn.crt -text 122 | #证书链 123 | openssl x509 -in chain.crt -text 124 | ```` 125 | 126 | 5. 证书使用 127 | 128 | 编辑/etc/httpd/conf.d/ssl.conf,修改以下内容: 129 | ```` 130 | SSLCertificateFile /etc/ssl/blackip.ustc.edu.cn.crt 131 | SSLCertificateKeyFile /etc/ssl/blackip.ustc.edu.cn.key 132 | SSLCertificateChainFile /etc/ssl/chain.crt 133 | ```` 134 | 执行````service httpd restart````证书生效。 135 | 136 | 这时可以使用 https://www.ssllabs.com/ssltest/analyze.html?d=blackip.ustc.edu.cn 测试服务器证书是否工作正常。 137 | 138 | 如果是nginx,配置是: 139 | ``` 140 | server { 141 | listen 443 ssl; 142 | server_name blackip.ustc.edu.cn; 143 | ssl_certificate /etc/ssl/blackip.ustc.edu.cn.full_chain.pem; 144 | ssl_certificate_key /etc/ssl/blackip.ustc.edu.cn.key; 145 | location / { 146 | root /usr/share/nginx/html; 147 | } 148 | ``` 149 | 150 | 6. 证书自动更新 151 | 152 | Let's encrypt证书有效期为90天,需要在90天内更新,更新方式是执行命令 153 | ````/usr/src/getssl/getssl -d blackip.ustc.edu.cn```` 154 | 即可,离失效期还有30天的证书会得到更新,并自动执行上面定义的RELOAD_CMD启动服务进程。可以使用crontab每天执行一次。 155 | 156 | 7. 一台服务器有多个域名时的证书生成 157 | 158 | 假如一台服务器同时服务多个域名,可以生成含有多个域名的证书。 159 | 160 | 如果这些域名完全是同一个网站,如blackip.ustc.edu.cn 还有个域名是www.blackip.ustc.edu.cn、blacklist.ustc.edu.cn、www.blacklist.ustc.edu.cn,他们是同一个网站, 161 | 只要在/root/.getssl/blackip.ustc.edu.cn应增加如下的配置: 162 | ```` 163 | SANS="www.blackip.ustc.edu.cn,blacklist.ustc.edu.cn,www.blacklist.ustc.edu.cn" 164 | ACL=('/var/www/html/.well-known/acme-challenge') 165 | USE_SINGLE_ACL="true" 166 | ```` 167 | 168 | 如果域名是不同的网站,如blackip.ustc.edu.cn服务器通过虚拟主机的方式需要服务noc.ustc.edu.cn live.ustc.edu.cn,它们的根目录分别是/var/www/html/noc /var/www/html/live,则 169 | 在/root/.getssl/blackip.ustc.edu.cn应增加如下的配置: 170 | ```` 171 | SANS="noc.ustc.edu.cn,live.ustc.edu.cn" 172 | ACL=('/var/www/html/.well-known/acme-challenge' 173 | '/var/www/html/noc/.well-known/acme-challenge' 174 | '/var/www/html/live/.well-known/acme-challenge') 175 | ```` 176 | 177 | 178 | *** 179 | 欢迎 [加入我们整理资料](https://github.com/bg6cq/ITTS) 180 | -------------------------------------------------------------------------------- /app/dns/dnssec/README.md: -------------------------------------------------------------------------------- 1 | ## [原创] ustc.edu.cn 域增加DNSSEC功能过程 2 | 3 | 本文原创:**中国科学技术大学 张焕杰** 4 | 5 | 修改时间:2019.09.13 6 | 7 | 清华大学段海新老师在2011年就写过有关DNSSEC的技术文章[DNSSEC 原理、配置与布署简介](https://blog.csdn.net/syh_486_007/article/details/50990973),详细介绍了DNSSEC。本文记录 ustc.edu.cn 域增加DNSSEC功能的过程。 8 | 9 | 10 | ## ustc.edu.cn 域名情况 11 | 12 | ustc.edu.cn 分了5个view,每个view有一个zone文件,因此有5个zone文件。bind 软件为CentOS 6中内置,使用chroot模式运行。 13 | 14 | 由于使用的bind软件并不是最新,因此本文使用的方式不一定是最简单的方式。 15 | 16 | bind 大部分文件存放在 /var/named/chroot/var/named 目录,zone文件存放在 /var/named/chroot/var/named/zones 目录。 17 | 18 | ## 步骤一:生成ZSK和KSK密钥 19 | 20 | 建议使用RSASHA256(增加选项-a RSASHA256 -b 2048),我这里使用默认的RSASHA1-NSEC3-SHA1,不建议继续使用。 21 | 22 | ``` 23 | cd /var/named/chroot/var/named 24 | dnssec-keygen -r /dev/urandom -3 ustc.edu.cn 25 | dnssec-keygen -f ksk -r /dev/urandom -3 ustc.edu.cn 26 | cp *.key zones 27 | ``` 28 | 29 | 生成了4个文件: 30 | ``` 31 | Kustc.edu.cn.+007+32747.key 32 | Kustc.edu.cn.+007+32747.private 33 | Kustc.edu.cn.+007+19065.key 34 | Kustc.edu.cn.+007+19065.private 35 | ``` 36 | 37 | 由于zone文件放在/var/named/chroot/var/named/zones 目录下,为了后续方便,把 *.key 文件cp到zones目录下 38 | 39 | ## 步骤二:在zone文件中增加key文件 40 | 41 | 在zone文件最后面增加: 42 | ``` 43 | $INCLUDE Kustc.edu.cn.+007+19065.key 44 | $INCLUDE Kustc.edu.cn.+007+32747.key 45 | ``` 46 | 47 | ## 步骤三:对原有zone文件进行签名 48 | 49 | 科大有5个zone文件,因此对5个文件签名,签名后的zone文件自动添加后缀.signed,如ustc.edu.cn.cernet签名后生成文件ustc.edu.cn.cernet.signed 50 | 51 | ``` 52 | cd /var/named/chroot/var/named 53 | dnssec-signzone -A -3 $(head -c 1000 /dev/urandom | sha1sum | cut -b 1-16) -N INCREMENT -o ustc.edu.cn -t zones/ustc.edu.cn.cernet 54 | dnssec-signzone -A -3 $(head -c 1000 /dev/urandom | sha1sum | cut -b 1-16) -N INCREMENT -o ustc.edu.cn -t zones/ustc.edu.cn.chinanet 55 | dnssec-signzone -A -3 $(head -c 1000 /dev/urandom | sha1sum | cut -b 1-16) -N INCREMENT -o ustc.edu.cn -t zones/ustc.edu.cn.cncnet 56 | dnssec-signzone -A -3 $(head -c 1000 /dev/urandom | sha1sum | cut -b 1-16) -N INCREMENT -o ustc.edu.cn -t zones/ustc.edu.cn.cmcc 57 | dnssec-signzone -A -3 $(head -c 1000 /dev/urandom | sha1sum | cut -b 1-16) -N INCREMENT -o ustc.edu.cn -t zones/ustc.edu.cn.other 58 | ``` 59 | 60 | ## 步骤四:修改bind配置,使用签名后域文件 61 | 62 | 如原来配置为 63 | ``` 64 | zone "ustc.edu.cn" in{type master; file "zones/ustc.edu.cn.cernet";}; 65 | ``` 66 | 修改为 67 | ``` 68 | zone "ustc.edu.cn" in{type master; file "zones/ustc.edu.cn.cernet.signed";}; 69 | ``` 70 | 71 | 同时,确保options中有启用dnssec功能的配置 72 | ``` 73 | dnssec-enable yes; 74 | ``` 75 | 76 | ## 步骤五:重启bind,生效配置 77 | 78 | ``` 79 | service named restart 80 | ``` 81 | 82 | 重启后,访问`https://dnssec-analyzer.verisignlabs.com/ustc.edu.cn`能看到有DNSSEC相关记录,但有个警告是还没有DS记录。 83 | 84 | ## 步骤六:上级服务器增加DS记录 85 | 86 | 文件`/var/named/chroot/var/named/dsset-ustc.edu.cn.`中内容如下: 87 | ``` 88 | ustc.edu.cn. IN DS 19065 7 1 4EBE527CCF84FC2DD62ACFCD464BE008E0FEAF68 89 | ustc.edu.cn. IN DS 19065 7 2 EBD1C6420F893D8FF9950ADBF896075D059006439419634128566709 8EBD74F1 90 | ``` 91 | 92 | 将这些内容发给edu.cn服务器管理员,添加后,访问`https://dnssec-analyzer.verisignlabs.com/ustc.edu.cn`能看到DNSSEC工作正常。 93 | 94 | ![DNSSEC](img/dnssec.png) 95 | 96 | DS记录仅仅包含KSK的密钥信息即可,也可以这样获取: 97 | 98 | ``` 99 | dig dnskey ustc.edu.cn | dnssec-dsfromkey -f - ustc.edu.cn 100 | ``` 101 | 102 | 103 | ## 修改域名zone文件的签名步骤 104 | 105 | 一旦修改了域名zone文件,均要重复步骤三的过程,并重启bind。我们使用git pre-commit hook自动这个过程。 106 | 107 | ## 域名zone文件签名有效期 108 | 109 | 默认的域签名有效期30天,30天内要重复步骤三的过程,并重启bind。可以在签名zone文件时制定更长的有效期。 110 | 111 | 30天内我们的DNS一定会有修改,因此不担心这个问题。 112 | 113 | 114 | ## 自动在线签名 115 | 116 | bind 9.9之后支持在线签名,也就是bind服务器启动后自动进行签名,管理更简单。 117 | 118 | 我们并未使用在线签名方式。 119 | 120 | 由于我们服务器上的bind比较老,升级到最新: 121 | 122 | ``` 123 | yum install -y openssl-dev libcap-devel 124 | wget https://downloads.isc.org/isc/bind9/9.14.6/bind-9.14.6.tar.gz 125 | tar zxvf bind-9.14.6.tar.gz 126 | cd bind-9.14.6 127 | 128 | ./configure \ 129 | --prefix=/usr --exec-prefix=/usr --bindir=/usr/bin \ 130 | --sbindir=/usr/sbin --sysconfdir=/etc --localstatedir=/var \ 131 | --datadir=/usr/share --includedir=/usr/include --libdir=/usr/lib64 \ 132 | --libexecdir=/usr/libexec --sharedstatedir=/var/lib \ 133 | --mandir=/usr/share/man --infodir=/usr/share/info --with-libtool \ 134 | --with-pic --disable-static --disable-isc-spnego \ 135 | --enable-querytrace \ 136 | --enable-fixed-rrset --enable-rpz-nsip --enable-rpz-nsdname \ 137 | --with-dlopen=yes --with-dlz-filesystem=yes --without-python 138 | make 139 | make install 140 | ``` 141 | 142 | 升级后执行service named configtest出现错误 143 | 144 | ```entropy.c:26: fatal error: RAND_bytes(): error:24064064:lib(36):func(100):reason(100) 145 | /etc/init.d/named: line 285: 1652 Aborted /usr/sbin/named-checkconf $ckcf_options ${named_conf} 146 | ``` 147 | 原因是/var/named/chroot/dev/下缺少文件 random urandom,执行 148 | ``` 149 | cd /dev 150 | tar cvf - *rand* | ( cd /var/named/chroot/dev; tar xvf -) 151 | ``` 152 | 并修改 /var/named/chroot/var/named 的owner为named.named后正常 153 | 154 | 我们使用的配置如下: 155 | 156 | ``` 157 | view "CHINANET" { 158 | match-clients { CHINANET;}; 159 | allow-recursion { none; }; 160 | include "/etc/named.common.conf"; 161 | zone "ustc.edu.cn" in { 162 | type master; 163 | key-directory "/var/named"; 164 | file "zones/ustc.edu.cn.chinanet"; 165 | auto-dnssec maintain; 166 | inline-signing yes; 167 | }; 168 | }; 169 | ``` 170 | 171 | 生成的key文件放在 /var/named 目录下 172 | 173 | 使用在线签名的时候,需要注意以下问题: 174 | 175 | 1. /var/named 目录对named可写 176 | 177 | 2. /var/named/zones 目录对named可写,并且不能有前缀相同,多了 .signed 后缀的文件,因为bind运行时要写这样的文件。 178 | 179 | 3. 如果有多个view,zone文件不能有名字相同的,原因是bind运行时签名写 .signed 文件时后面的view因为文件存在,会错误。 180 | 181 | 182 | *** 183 | 欢迎 [加入我们整理资料](https://github.com/bg6cq/ITTS) 184 | -------------------------------------------------------------------------------- /security/www/git/README.md: -------------------------------------------------------------------------------- 1 | ## [原创]使用git监控www文件并自动恢复 2 | 3 | 本文原创:**中国科学技术大学 张焕杰** 4 | 5 | 修改时间:2017.10.05 6 | 7 | ## 一、使用git监控www文件并自动恢复思路 8 | 9 | 使用多个分支来完成监控工作,其中: 10 | 11 | * master分支为自己更新的www文件,一旦监测到文件修改,会立即恢复到master分支的最后版本 12 | 13 | * 其他分支被用来记录异常更新 14 | 15 | * 平时处于其他分支(以时间戳为分支名字) 16 | 17 | * 设置post-commit 钩子,当有新提交时,做如下工作: 18 | 触发修改报警 19 | 执行`git checkout master`恢复master分支最后版本文件 20 | 执行``git checkout -b `date '+%Y%m%d%H%M%S'` ``生成新的分支 21 | 22 | * 触发报警后,之前的某个以时间戳命名的分支记录有修改的内容 23 | 24 | 25 | ## 二、设置过程 26 | 27 | 下文假定 /root/test/www 下文件需要保护,设置过程为: 28 | 29 | 1. 初始化git库 30 | ```` 31 | cd /root/test 32 | git init 33 | ```` 34 | 35 | 2. 编辑.gitignore,记录需要忽略的文件 36 | ```` 37 | vi /root/test/.gitignore 38 | ```` 39 | 写入以下内容 40 | ```` 41 | .gitignore 42 | jiankong.sh 43 | change.log 44 | ```` 45 | 46 | 3. 把需要跟踪的文件(这里是www目录)全部加入git跟踪 47 | ```` 48 | git add www 49 | git commit -m init 50 | ```` 51 | 52 | 4. 生成 post-commit 钩子脚本 53 | ```` 54 | vi /root/test/.git/hooks/post-commit 55 | ```` 56 | 写入以下内容 57 | ```` 58 | #!/bin/sh 59 | 60 | cd /root/test 61 | 62 | date >> change.log 63 | echo "file change!" >> change.log 64 | 65 | git checkout master 66 | git checkout -b `date '+%Y%m%d%H%M%S'` 67 | ```` 68 | 69 | 5. 生成监控脚本程序 70 | 71 | ```` 72 | vi /root/test/jiankong.sh 73 | ```` 74 | 75 | 写入以下内容: 76 | ```` 77 | #!/bin/sh 78 | cd /root/test 79 | while true; do 80 | git add www 81 | git commit -a -m `date '+%Y%m%d%H%M%S'` 82 | sleep 5 83 | done 84 | ```` 85 | 86 | 6. 把脚本改为可执行 87 | ```` 88 | chmod u+x .git/hooks/post-commit jiankong.sh 89 | ```` 90 | 91 | 92 | ## 三、修改www文件步骤 93 | 94 | 1. 停止上面的监控脚本jiankong.sh运行 95 | 96 | 2. 执行`cd /root/test; git checkout master`切换到master分支(记住我们的修改是在master分支) 97 | 98 | 2. 修改文件 99 | 100 | 3. 修改后执行`git status`,`git diff`等确认文件修改正确,如果有新增加的文件,可以执行`git add file_name`或`git add www`将文件加入git管理,然后执行`git commit -a -m "提交说明"`提交所有修改。 101 | 102 | 4. 注意一旦在master完成提交,post-commit自动执行,会切换到一个以修改时间戳为名字的分支。 103 | 104 | 5. 运行脚本jiankong.sh开始监控 105 | 106 | 107 | ## 四、实际案例 108 | 109 | 1. www目录只有一个文件index.html,内容是"index",初始化步骤是: 110 | ```` 111 | [root@localhost www]# cd /root/test 112 | [root@localhost test]# cat www/index.html 113 | index 114 | [root@localhost test]# git init 115 | Initialized empty Git repository in /root/test/.git/ 116 | [root@localhost test]# git add www 117 | [root@localhost test]# git commit -m init 118 | [master (root-commit) 96de862] init 119 | 1 files changed, 1 insertions(+), 0 deletions(-) 120 | create mode 100644 www/index.html 121 | ```` 122 | 123 | 2. 两个脚本文件内容如下: 124 | ```` 125 | [root@localhost test]# ls -al .git/hooks/post-commit jiankong.sh 126 | -rwxr--r--. 1 root root 134 Oct 5 08:56 .git/hooks/post-commit 127 | -rwxr--r--. 1 root root 153 Oct 5 08:57 jiankong.sh 128 | [root@localhost test]# cat .git/hooks/post-commit 129 | #!/bin/sh 130 | 131 | cd /root/test 132 | 133 | date >> change.log 134 | echo "change!" >> change.log 135 | 136 | git checkout master 137 | git checkout -b `date '+%Y%m%d%H%M%S'` 138 | [root@localhost test]# cat jiankong.sh 139 | #!/bin/sh 140 | cd /root/test 141 | while true; do 142 | git add www 143 | git commit -a -m `date '+%Y%m%d%H%M%S'` 144 | sleep 5 145 | done 146 | 147 | ```` 148 | 3. 自己修改文件演示,增加"my change" 149 | ```` 150 | [root@localhost test]# cd /root/test; git checkout master 151 | Already on 'master' 152 | [root@localhost test]# echo "my change" >> www/index.html 153 | [root@localhost test]# git commit -a -m "my change" 154 | Already on 'master' 155 | Switched to a new branch '20171005085844' 156 | [20171005085844 a0e3e00] my change 157 | 1 files changed, 1 insertions(+), 0 deletions(-) 158 | [root@localhost test]# cat www/index.html 159 | index 160 | my change 161 | ```` 162 | 注意已经自动切换到分支 20171005085844 163 | 164 | 4. 运行监控脚本jiankong.sh,这时不会有任何变化 165 | 166 | 5. 模拟其他人修改 167 | 168 | 没有切换到master分支的修改都被认为是其他人修改。 169 | ```` 170 | [root@localhost test]# echo "other change" >> www/index.html 171 | [root@localhost test]# cat www/index.html 172 | index 173 | my change 174 | other change 175 | ```` 176 | 177 | 6. 运行监控脚本jiankong.sh 178 | 179 | other change这行文字变化会被记录到分支20171005085844,并被删除,切换到一个新的分支20171005090631 180 | ```` 181 | [root@localhost test]# sh jiankong.sh 182 | Switched to branch 'master' 183 | Switched to a new branch '20171005090631' 184 | [20171005090631 254a22d] 20171005090631 185 | 1 files changed, 1 insertions(+), 0 deletions(-) 186 | # On branch 20171005090631 187 | # Untracked files: 188 | # (use "git add ..." to include in what will be committed) 189 | # 190 | ^C 191 | [root@localhost test]# git branch 192 | 20171005085844 193 | * 20171005090631 194 | master 195 | [root@localhost test]# cat www/index.html 196 | index 197 | my change 198 | [root@localhost test]# cat change.log 199 | Thu Oct 5 08:58:44 CST 2017 200 | change! 201 | Thu Oct 5 09:06:31 CST 2017 202 | change! 203 | 204 | ```` 205 | 206 | 7. 模拟新增一个文件的恢复 207 | ```` 208 | [root@localhost test]# echo "test2" > www/new.html 209 | [root@localhost test]# sh jiankong.sh 210 | Switched to branch 'master' 211 | Switched to a new branch '20171005091700' 212 | [20171005091700 bd34034] 20171005091700 213 | 1 files changed, 1 insertions(+), 0 deletions(-) 214 | create mode 100644 www/new.html 215 | ^C 216 | [root@localhost test]# ls -al www 217 | total 12 218 | drwxr-xr-x. 2 root root 4096 Oct 5 09:17 . 219 | drwxr-xr-x. 4 root root 4096 Oct 5 09:16 .. 220 | -rw-r--r--. 1 root root 16 Oct 5 09:06 index.html 221 | 222 | ```` 223 | 224 | ## 五、优化 225 | 如果觉得傻傻的不停的git add; git commit太无聊,可以使用inotify-tools监测到目录下有文件变化时再执行,把jiankong.sh修改为: 226 | ```` 227 | #!/bin/sh 228 | cd /root/test 229 | while true; do 230 | echo wait file system change.. 231 | inotifywait -e modify,move,create,delete -r /root/test 232 | git add www 233 | git commit -a -m `date '+%Y%m%d%H%M%S'` 234 | done 235 | ```` 236 | 237 | *** 238 | 欢迎 [加入我们整理资料](https://github.com/bg6cq/ITTS) -------------------------------------------------------------------------------- /security/ssl/acme.sh/README.md: -------------------------------------------------------------------------------- 1 | ## [原创]使用Let's encrypt免费SSL证书 2 | 3 | 本文原创:**中国科学技术大学 张焕杰** 4 | 5 | 修改时间:2018.03.14 6 | 7 | 修改时间:2021.10.08 8 | 9 | ## 一、SSL证书产生过程介绍 10 | 11 | 1. SSL证书产生过程涉及以下几个概念: 12 | 13 | * 服务器密钥:扩展名一般是.key。一般我们使用的是rsa算法,服务器自己生成的一组数为私钥和对应的公钥。私钥需要安全存放,不让其他人知道。 14 | 15 | * 证书签名请求:Certificate Signing Request,扩展名一般是.csr。服务器将自己的公钥hash后,加上希望绑定的域名信息,生成.csr文件。 16 | 17 | * 证书:扩展名一般是.crt。服务器将.csr文件交给CA机构,CA机构验证服务器真实拥有该域名后,用CA机构的私钥对这些信息签名,生成.crt文件。 18 | 19 | * 证书链:CA机构的证书是安装到客户机系统的,为了安全起见,CA机构会为自己的二级CA签发证书,最后由该二级CA对普通用户签发证书,证书链是记录该关系的。不提供证书链可以工作,但有时候会有告警。 20 | 21 | 2. CA服务机构 22 | 23 | CA服务机构的存在是做为公认的第三方来验证服务器身份,这中间可能需要收取服务费。 24 | 25 | 为了方便使用,可以选择ZeroSSL / Let's encrypt免费CA机构签发证书。之前Let's encrypt已被广泛接受,申请证书也比较快捷,一般来说5分钟内可以完成从开始安装程序到申请证书过程。需要说明的是Let's encrypt签发的证书有效期是90天,在到期之前需完成证书更新。后续ZeroSSL也提供与Let's encrypt相同的免费证书,且acme.sh默认使用 26 | ZeroSSL来申请证书,下面的描述对ZeroSSL也适用。 27 | 28 | 3. Let's encrypt免费证书颁发过程 29 | 30 | * 服务器生成私钥,产生.csr文件 31 | * 服务器将.csr文件交给Let's encrypt服务器 32 | * Let's encrypt服务器提供一个随机字符串,要求放在网站的.well-known/acme-challenge目录下 或者 在DNS上进行发布 33 | * 服务器将随机字符串放在.well-known/acme-challenge目录下 或通过DNS发布 34 | * Let's encrypt服务器通过http或DNS访问到该随机字符串,验证服务器拥有该域名,颁发证书 35 | 36 | ## 二、Let's encrypt 证书生成工具 37 | 38 | 有很多种Let's encrypt 证书生成工具,这里介绍完全由shell脚本完成整个过程的acme.sh [https://github.com/Neilpang/acme.sh](https://github.com/Neilpang/acme.sh)。 39 | 40 | 以下过程使用泛域名*.ustc.edu.cn演示。 41 | 42 | 1. 安装过程 43 | 44 | 我没有安装,仅仅是下载: 45 | ```` 46 | cd /usr/src/ 47 | git clone https://github.com/Neilpang/acme.sh.git 48 | cd acme.sh 49 | ```` 50 | 51 | 2. 获取证书 52 | 53 | 执行命令获取证书 54 | ```` 55 | ./acme.sh --issue --dns -d *.ustc.edu.cn 56 | ```` 57 | 执行后退出,提示有: 58 | ``` 59 | Add the following txt record: 60 | Domain:_acme-challenge.ustc.edu.cn 61 | Txt value:9ihDbjYfTExAYeDs4DBUeuTo18KBzwvTEjUnSwd32-c 62 | 63 | ``` 64 | 这时,修改DNS记录,增加 65 | 66 | ``` 67 | _acme-challenge.ustc.edu.cn IN TXT "9ihDbjYfTExAYeDs4DBUeuTo18KBzwvTEjUnSwd32-c" 68 | ``` 69 | 然后继续获取证书的过程,注意下面的命令行中的"renew" 70 | ``` 71 | ./acme.sh --renew -d *.ustc.edu.cn 72 | ``` 73 | 74 | 注意:上面是生成 *.ustc.edu.cn 泛域名证书,如果是生成普通的域名证书,更简单: 75 | ``` 76 | ./acme.sh --issue --webroot /etc/nginx/html/ -d linux.ustc.edu.cn 77 | ``` 78 | 79 | 3. 产生nginx/apache需要的证书 80 | 81 | 以上执行过程,会在 ~/.acme.sh 产生一些中间文件(包括证书的信息),使用如下命令可以生成nginx需要的两个文件: 82 | 83 | 这两个文件分别是 私钥 和 包含所有证书的全证书链文件。 84 | 85 | ``` 86 | acme.sh --install-cert -d *.ustc.edu.cn \ 87 | --key-file /etc/nginx/ssl/ustc.edu.cn.key \ 88 | --fullchain-file /etc/nginx/ssl/ustc.edu.cn.pem 89 | ``` 90 | 91 | apache需要三个文件,分别是私钥、域名证书 和 证书链(后两个文件在一起就是上面nginx的全证书链): 92 | 93 | ``` 94 | acme.sh --install-cert -d *.ustc.edu.cn \ 95 | --key-file /etc/httpd/conf/ssl/ssl.key \ 96 | --cert-file /etc/httpd/conf/ssl/ssl.crt \ 97 | --ca-file /etc/httpd/conf/ssl/chain.crt 98 | ``` 99 | 100 | 101 | 4. 证书使用 102 | 103 | nginx.conf的配置如下所示(需使用命令`openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048`生成dhparam.pem文件) 104 | ```` 105 | server { 106 | listen 80; 107 | listen [::]:80; 108 | listen 443 ssl; 109 | listen [::]:443 ssl; 110 | ssl_certificate /etc/nginx/ssl/ustc.edu.cn.pem; 111 | ssl_certificate_key /etc/nginx/ssl/ustc.edu.cn.key; 112 | ssl_session_cache shared:SSL:1m; 113 | ssl_session_timeout 10m; 114 | ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA'; 115 | ssl_prefer_server_ciphers on; 116 | ssl_dhparam /etc/nginx/ssl/dhparam.pem; 117 | server_name ustcnet.ustc.edu.cn; 118 | access_log /var/log/nginx/host.ustcnet.ustc.edu.cn.access.log; 119 | location / { 120 | proxy_pass http://202.38.64.99/; 121 | } 122 | } 123 | ```` 124 | 使用以上配置,https://www.ssllabs.com/ssltest/analyze.html?d=ustcnet.ustc.edu.cn 测试评分是A (IPv4/IPv6双栈) 125 | 126 | 127 | 5. 关联邮件 128 | 129 | 以上已经可以工作了,但建议使用 130 | ``` 131 | ./acme.sh --updateaccount --accountemail xyz@xya.edu.cn 132 | ``` 133 | 关联自己的邮箱,这样证书快过期时可以收到提醒邮件。 134 | 135 | 136 | 6. 自动化处理 137 | 138 | 我校的DNS服务器采用bind,为了自动化证书的更新过程,采取的措施如下: 139 | 140 | 文件 `/named/zones/ustc.edu.cn.common`是ustc.edu.cn域文件,增加一行 141 | ``` 142 | _acme-challenge IN TXT any 143 | ``` 144 | 145 | 编辑文件 `/root/.acme.sh/dns_ustc.sh`,内容是: 146 | 147 | ``` 148 | #!/bin/bash 149 | ######## Public functions ##################### 150 | 151 | #Usage: dns_ustc_add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs" 152 | dns_ustc_add() { 153 | fulldomain=$1 154 | txtvalue=$2 155 | _info "Using ustc" 156 | _debug fulldomain "$fulldomain" 157 | _debug txtvalue "$txtvalue" 158 | cd /named 159 | sed -i "s/^_acme-challenge.*$/_acme-challenge IN TXT \"${txtvalue}\"/" /named/zones/ustc.edu.cn.common 160 | git diff 161 | git commit -a -m "_acme-challenge" 162 | } 163 | 164 | #Usage: fulldomain txtvalue 165 | #Remove the txt record after validation. 166 | dns_ustc_rm() { 167 | fulldomain=$1 168 | txtvalue=$2 169 | _info "Using myapi" 170 | _debug fulldomain "$fulldomain" 171 | _debug txtvalue "$txtvalue" 172 | } 173 | ``` 174 | 175 | 现在只要执行 176 | 177 | ``` 178 | /usr/src/acme.sh/acme.sh --issue --dns dns_ustc -d "*.ustc.edu.cn" 179 | ``` 180 | 181 | 就可以自动更新了 182 | 183 | 7. 更新证书时自动重启nginx等服务 184 | 185 | 可以在执行acme.sh 时使用`--reloadcmd "service nginx force-reload"` 参数,在证书成功更新后重启nginx服务。 186 | 187 | 188 | *** 189 | 欢迎 [加入我们整理资料](https://github.com/bg6cq/ITTS) 190 | -------------------------------------------------------------------------------- /app/mail/spf_dkim/README.md: -------------------------------------------------------------------------------- 1 | # 启用SPF、DKIM、DMARC提高邮件系统安全性 2 | 3 | 本文原创:**中国科学技术大学 张焕杰** 4 | 5 | 修改时间:2020.03.31 6 | 7 | 电子邮件服务器之间使用SMTP协议传输邮件。SMTP协议设计时,并未考虑服务器间的身份验证,这样就带来伪造地址发送邮件的隐患。 8 | 9 | 为了解决伪造邮件的问题,后来又增加了SPF、DKIM和DMARC技术。 10 | 11 | 邮件服务器,都应该进行SPF、DKIM和DMARC相关设置,以提高安全性。 12 | 13 | 下面以 ustc.edu.cn 域为例简单介绍三种技术的设置内容。 14 | 15 | ### 一、SPF(Sender Policy Framework) 16 | 17 | SPF的原理非常简单:使用DNS服务器对外发布自己域的邮件发送IP地址信息。 18 | 19 | 如 ustc.edu.cn 域设置了如下TXT记录: 20 | 21 | ``` 22 | $ dig ustc.edu.cn txt 23 | 24 | ;; QUESTION SECTION: 25 | ;ustc.edu.cn. IN TXT 26 | 27 | ;; ANSWER SECTION: 28 | ustc.edu.cn. 3600 IN TXT "v=spf1 ip4:202.38.64.8 ip4:202.38.64.16 ip4:202.38.64.46 ip4:202.141.160.8 ip4:222.195.68.193 ip4:202.141.161.73 ip4:195.128.10.69 ip6:2001:da8:d800::8 ip6:2001:da8:d800::46 -all" 29 | ``` 30 | 上述TXT记录,对外公布了若干合法的发邮件IPv4/IPv6地址。最后的 -all 含义是不在列表内的IP,对外发送@ustc.edu.cn 邮件,都应该被认为是伪造的并丢弃。 31 | 32 | SPF的启用非常容易,仅仅在自己的DNS域名服务器上添加TXT记录即可,发送方的邮件服务器不需要做修改。 33 | 34 | 邮件服务器也推荐启用SPF功能,可以避免收到伪造地址的邮件。 35 | 36 | 如果您设置了SPF,可以使用 [https://mxtoolbox.com/spf.aspx ](https://mxtoolbox.com/spf.aspx) 进行测试。 37 | 38 | 39 | ### 二、DKIM(DomainKeys Identified Mail) 40 | 41 | DKIM相比SPF更进一步:使用DNS服务器对外发布邮件服务器的公钥;邮件服务器在发出邮件时,使用对应的私钥对邮件部分信息进行签名。 42 | 43 | 邮件发送方服务器会对邮件头的From/To/Subject/Date/Message-ID等字段内容进行签名,接收方的邮件服务器验证后,可以确保这些内容是真实可靠,未被修改的。 44 | 45 | 下面是一封邮件,通过了SPF、DKIM验证的结果: 46 | 47 | ![SPF](1.png) 48 | 49 | 启用DKIM分两步: 50 | 51 | * 2.1 邮件服务器上生成私钥/公钥对,并启用DKIM签名功能 52 | 53 | 对于常用的Coremail邮件系统,请联系Coremail技术支持工程师操作,预计5分钟可以完成。 54 | 55 | * 2.2 DNS服务器上添加TXT记录 56 | 57 | 如ustc.edu.cn 域,需要设置 dkim._domainkey.ustc.edu.cn TXT记录(其中dkim是selector,可以根据需要修改): 58 | 59 | ``` 60 | $ dig dkim._domainkey.ustc.edu.cn txt 61 | 62 | ;; QUESTION SECTION: 63 | ;dkim._domainkey.ustc.edu.cn. IN TXT 64 | 65 | ;; ANSWER SECTION: 66 | dkim._domainkey.ustc.edu.cn. 3600 IN TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJvKz7FR0FC8iH15PgZIW720prG7yeJSc0ZVtrT1Q6pOazbMevkNTIYap+VQfh0qqrkDq0WXiJJ6IwURaPFluYs5Gxcj84RAX9s2qBhzlGA6HdvRGH8PwnFW4wacM6c8v62aWP/NfslJg+LZkRpLJG7e52Fv6RFKhkoNpQYyGfmQIDAQAB" 67 | ``` 68 | 69 | 如果DNS上设置了DKIM记录,可以使用 [https://mxtoolbox.com/dkim.aspx ](https://mxtoolbox.com/dkim.aspx) 进行测试。 70 | 71 | ### 三、DMARC(Domain-based Message Authentication, Reporting & Conformance) 72 | 73 | 如果收发服务器双方都实现了上述的SPF、DKIM技术,邮件伪造的问题已经解决。 74 | 75 | DMARC是锦上添花的功能,通过DNS发布信息,当邮件接收方收到伪造的邮件时,可以给被伪造的域名管理员发送反馈。 76 | 77 | 如ustc.edu.cn 域,需要设置 _dmarc.ustc.edu.cn TXT记录: 78 | ``` 79 | $ dig _dmarc.ustc.edu.cn txt 80 | 81 | ;; QUESTION SECTION: 82 | ;_dmarc.ustc.edu.cn. IN TXT 83 | 84 | ;; ANSWER SECTION: 85 | _dmarc.ustc.edu.cn. 3600 IN TXT "v=DMARC1; p=quarantine; rua=mailto:postmaster@ustc.edu.cn" 86 | ``` 87 | 其含义是接收方如果收到未通过SPF、DKIM验证的邮件,应该隔离(一般是投递到垃圾文件夹),并将相关信息发给 postmaster@ustc.edu.cn 88 | 89 | 邮件系统管理员从收到的邮件中,可以了解潜在的SPF、DKIM配置错误信息。 90 | 91 | 如果DNS上设置了DMARC记录,可以使用 [https://mxtoolbox.com/DMARC.aspx ](https://mxtoolbox.com/DMARC.aspx) 进行测试。 92 | 93 | ### 附录: lists.ustc.edu.cn 启用SPF、DKIM、DMARC 的过程 94 | 95 | lists.ustc.edu.cn 是 sympa mail lists服务器,IP地址是 202.38.95.62/2001:da8:d800:95::62,使用的邮件软件是postfix。 96 | 97 | 0. 准备 98 | 99 | DNS中设置如下的DNS PTR记录: 100 | 101 | ``` 102 | $ORIGIN 95.38.202.in-addr.arpa. 103 | 62.95.38.202.in-addr.arpa. IN PTR lists.ustc.edu.cn. 104 | 105 | $ORIGIN 0.0.8.d.8.a.d.0.1.0.0.2.ip6.arpa 106 | 62.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.5.9.0.0 IN PTR lists.ustc.edu.cn. 107 | ``` 108 | 109 | 1. SPF设置 110 | 111 | DNS中增加如下记录: 112 | ``` 113 | lists IN A 202.38.95.62 114 | IN TXT "v=spf1 ip4:202.38.95.62 ~all" 115 | IN AAAA 2001:da8:d800:95::62 116 | IN TXT "v=spf1 a -all" 117 | ``` 118 | 119 | 2. DKIM设置 120 | 121 | 设置好epel库,安装opendkim: 122 | ``` 123 | yum install opendkim 124 | ``` 125 | 126 | 生成DKIM key (使用的selector 名称为default) 127 | ``` 128 | # 请替换下面的域名 129 | export domain=lists.ustc.edu.cn 130 | 131 | mkdir /etc/opendkim/keys/$domain 132 | 133 | cd /etc/opendkim/keys/$domain 134 | 135 | opendkim-genkey -d $domain -s default 136 | 137 | chown -R opendkim:opendkim /etc/opendkim/keys/$domain 138 | 139 | echo "default._domainkey.$domain $domain:default:/etc/opendkim/keys/$domain/default.private" >> /etc/opendkim/KeyTable 140 | 141 | echo "*@$domain default._domainkey.$domain" >> /etc/opendkim/SigningTable 142 | ``` 143 | 生成之后打开/etc/opendkim/keys/lists.ustc.edu.cn/default.txt,里面就是DKIM key,需要添加到DNS,主机记录为default._domainkey.lists.ustc.edu.cn,记录值为括号里面的(去掉引号)。 144 | ``` 145 | default._domainkey.lists IN TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDZyUmKw+U9kG520nVyoe9aFUIq8wQ+Izvdb7qyFS+DKGElpWmDAIrxjfHWNfWVSadHzqZv6pyoasL1ZVrgkq59fQyOpRbvdQzXm3hbrQFZvyQLvBkqnV7XelHyxWNTKS4MQcP9IaeClwMIHJ8Q5xTH6PJF18o55Q9OH8n1vq53oQIDAQAB" 146 | ``` 147 | 148 | 修改openDKIM设置 149 | ``` 150 | vi /etc/opendkim.conf 151 | 152 | 1. 将Mode 改为 Mode sv 153 | 2. 将Domain 改为 Domain lists.ustc.edu.cn 154 | 3. 将所有变量前面的#去掉,但是KeyFile、Statistics加上# 155 | 4. 再把SigningTable /etc/opendkim/SigningTable改成SigningTable refile:/etc/opendkim/SigningTable 156 | ``` 157 | 158 | 启动openDKIM 159 | ``` 160 | chkconfig opendkim on 161 | service opendkim start 162 | ``` 163 | 164 | 设置Postfix 165 | ``` 166 | vi /etc/postfix/main.cf 167 | 168 | 加上下面幾行 169 | # opendkim setup 170 | smtpd_milters = inet:127.0.0.1:8891 171 | non_smtpd_milters = inet:127.0.0.1:8891 172 | milter_default_action = accept 173 | ``` 174 | 重启服务 175 | 176 | ``` 177 | service opendkim restart 178 | service postfix restart 179 | chkconfig opendkim on 180 | ``` 181 | PS: 第一次启动如果出现 Generating default DKIM keys: hostname: Unknown host 可以在 /etc/hosts 上面加上域名,例如: 182 | 183 | ``` 184 | 127.0.0.1 lists.ustc.edu.cn localhost localhost.localdomain localhost4 localhost4.localdomain4 185 | ``` 186 | 187 | 3. sympa 设置 188 | 189 | sympa 与DKIM设置有关的很多,我们采用最简单的方式。 190 | 191 | 默认的sympa发出的邮件,From地址是用户的,这样就相当于伪造地址发送。 192 | 因此在 /etc/sympa.conf 增加以下配置,将From地址重写为 193 | `From: “User Name” (userEmail@address.com) ` 194 | 195 | ``` 196 | dmarc_protection_mode all 197 | dmarc_protection_phrase name_and_email 198 | ``` 199 | 200 | 4. DMARC设置 201 | 202 | DNS中增加如下记录: 203 | ``` 204 | _dmarc.lists.ustc.edu.cn. 3600 IN TXT "v=DMARC1; p=quarantine; rua=mailto:postmaster@ustc.edu.cn" 205 | ``` 206 | 207 | *** 208 | 欢迎 [加入我们整理资料](https://github.com/bg6cq/ITTS) 209 | -------------------------------------------------------------------------------- /other/live/README.md: -------------------------------------------------------------------------------- 1 | ## [原创] 可扩展视频直播设施建设 2 | 3 | 本文原创:**中国科学技术大学 张焕杰** 4 | 5 | 修改时间:2017.12.20 6 | 7 | 本文记录一个RTMP直播系统的建设。 8 | 9 | 本文建设的RTMP直播系统,包含如下部件: 10 | 11 | 1. RTMP编码器 12 | 13 | 用于将HDMI信号,压缩编码后使用RTMP协议传送给RTMP服务器(nginx)。 14 | 15 | 2. RTMP服务器(nginx) 16 | 17 | 将RTMP协议收到的视频流,拆分成.ts文件,并更新对应的.m3u8索引文件。 18 | 19 | 把这些文件使用http协议提供给客户端。 20 | 21 | 3. 客户端 22 | 23 | 使用浏览器使用HTTP协议访问nginx,获取.ts文件和.m3u8索引文件,播放视频。 24 | 25 | 26 | # 一、RTMP编码器 27 | 28 | RTMP编码器有很多,我用的购买自jd.com,[https://item.jd.com/11190135281.html](https://item.jd.com/11190135281.html),使用时要注意:修改各种参数后需重启一下。 29 | 30 | 设置IP地址,改为RTMP模式,推送地址为 rtmp://x.x.x.x/live/ustc (x.x.x.x是下面安装的RTMP服务器IP地址) 31 | 32 | # 二、RTMP服务器(nginx)的安装过程 33 | 34 | 安装时参考`https://docs.peer5.com/guides/setting-up-hls-live-streaming-server-using-nginx/` 35 | 36 | 安装过程: 37 | 38 | 1. 有人称14.0版本比较容易安装,我使用ISO文件 http://mirrors.ustc.edu.cn/ubuntu-cdimage/releases/14.04.5/release/ubuntu-14.04.5-server-amd64%2Bmac.iso 安装系统。 39 | 40 | 2. 系统安装后执行命令编译安装带rtmp支持的nginx 41 | 42 | ``` 43 | sudo bash 44 | apt-get update 45 | apt-get upgrade 46 | apt-get install build-essential libpcre3 libpcre3-dev libssl-dev php5 git 47 | 48 | cd /usr/src 49 | git clone https://github.com/arut/nginx-rtmp-module.git 50 | wget http://nginx.org/download/nginx-1.10.3.tar.gz 51 | 52 | tar zxvf nginx-1.10.3.tar.gz 53 | cd nginx-1.10.3/ 54 | 55 | ./configure --with-http_ssl_module --add-module=../nginx-rtmp-module 56 | make 57 | make install 58 | 59 | cp /usr/src/nginx-rtmp-module/stat.xsl /usr/local/nginx/html 60 | 61 | add-apt-repository ppa:mc3man/trusty-media 62 | sudo apt-get update 63 | sudo apt-get install ffmpeg 64 | ``` 65 | 66 | 3. `/usr/local/nginx/conf/nginx.conf`内容 67 | 68 | ``` 69 | worker_processes auto; 70 | 71 | events { 72 | worker_connections 10240; 73 | } 74 | 75 | rtmp { 76 | server { 77 | listen 1935; 78 | chunk_size 4000; 79 | application live { 80 | live on; 81 | hls on; 82 | hls_path /run/shm/hls; 83 | hls_fragment 3; 84 | hls_fragment_naming system; 85 | hls_playlist_length 60; 86 | # deny play all; 87 | on_publish http://localhost:8000/on_publish.php; 88 | } 89 | } 90 | } 91 | 92 | http { 93 | include mime.types; 94 | sendfile off; 95 | tcp_nopush on; 96 | #aio on; 97 | #directio 512; 98 | default_type application/octet-stream; 99 | server { 100 | listen 80; 101 | location / { 102 | root /usr/local/nginx/html; 103 | } 104 | location /stat { 105 | rtmp_stat all; # NOTE: please copy file `stat.xsl` from `nginx-rtmp-module` to nginx's html folder 106 | rtmp_stat_stylesheet stat.xsl; 107 | } 108 | location /stat.xsl { 109 | root /usr/local/nginx/html; 110 | } 111 | 112 | location /hls { 113 | types { 114 | application/dash+xml mpd; 115 | application/vnd.apple.mpegurl m3u8; 116 | video/mp2t ts; 117 | } 118 | root /run/shm/; 119 | } 120 | } 121 | } 122 | ``` 123 | 124 | 4. 增加发布用户名和密码检查 125 | 126 | 如果发布者IP固定,建议使用限制发布者访问1935端口方式控制(删除上面nginx.conf中的`on_publish http://localhost:8000/on_publish.php`) 127 | 128 | 我使用本机8000端口的on_publish.php来检查user和pass,需要修改`/etc/apache2/ports.conf`把端口改为8000以免与nginx使用的80冲突。并增加 129 | 如下的`/var/www/html/on_publish.php`(注意参数是POST过来的,很多的例子GET是错误的): 130 | ``` 131 | 154 | ``` 155 | 156 | 5. 测试 157 | 158 | 执行`/usr/local/nginx/sbin/nginx -t`测试配置是否正确,如果正确,执行 159 | `/usr/local/nginx/sbin/nginx`启动nginx进程。 160 | 161 | 下载一个 .mp4文件(我下载的是USTCStory.mp4),使用如下命令行测试通过rtmp协议给nginx: 162 | ``` 163 | 如果有on_publish检查,使用 164 | ffmpeg -re -i USTCStory.mp4 -vcodec libx264 -s 640*480 -vprofile baseline -g 30 -acodec aac -strict -2 -f flv "rtmp://x.x.x.x/live/ustc?user=myuser&pass=mypass" 165 | 否则使用 166 | ffmpeg -re -i USTCStory.mp4 -vcodec libx264 -s 640*480 -vprofile baseline -g 30 -acodec aac -strict -2 -f flv rtmp://x.x.x.x/live/ustc 167 | ``` 168 | 如果nginx服务器`/run/shm/hls`有文件生成,说明nginx配置基本正确。 169 | 170 | 浏览器访问 http://x.x.x.x/stat 可以看到统计信息。 171 | 172 | 使用支持RTMP的播放器,如vlc,可以通过 rtmp://x.x.x.x/live/ustc 播放。 173 | 174 | 6. 安全加强 175 | 176 | 使用iptables保护服务器的端口,仅仅对外开放80端口,其他1935/22等端口对特定IP开放。 177 | 178 | # 三、WEB播放页面 179 | 180 | 假定rtmp推送的是 rtmp://x.x.x.x/live/ustc?user=username&pass=password ,web hls播放的url是 http://x.x.x.x/hls/ustc.m3u8。 181 | 182 | 请参考 http://live.ustc.edu.cn ,这里有个简单的播放器,可以适配大部分支持html5 video的浏览器。 183 | 184 | # 四、系统扩展 185 | 186 | 以上工作完成后,可以播放,但受限于单台nginx服务器的容量,负载能力有限。 187 | 188 | 可以增加更多的nginx服务器做缓存和分发,支持更大规模的用户。 189 | 190 | 以下是做分发的nginx服务器关键配置: 191 | 192 | ``` 193 | #缓存路径,使用 /dev/shm ramdisk,注意内存要大 194 | proxy_temp_path /dev/shm/tmp 1; 195 | proxy_cache_path /dev/shm/hls-cache levels=1:1 keys_zone=hls-cache:100m inactive=2m max_size=3500m; 196 | proxy_cache_path /dev/shm/m3u8-cache levels=1 keys_zone=m3u8-cache:1m inactive=5s max_size=10m; 197 | 198 | upstream live-server { 199 | server x.x.x.x:80; # 上面配置的rtmp nginx ip 200 | } 201 | 202 | server { 203 | # listen 0.0.0.0:80 ; 204 | listen [::]:80 ; 205 | server_name live.ustc.edu.cn; # 域名 206 | 207 | location / { 208 | proxy_pass http://live-server; 209 | } 210 | 211 | location ~ \.ts$ { 212 | proxy_pass http://live-server; 213 | proxy_cache hls-cache; 214 | # proxy_cache_lock on 很关键,默认是off。设置为on,同时访问一个ts文件时,仅仅去源端取一次,设置为off取多次 215 | proxy_cache_lock on; 216 | proxy_cache_key $host$uri; 217 | proxy_cache_valid 200 304 2m; 218 | proxy_set_header Host $http_host; 219 | expires 2m; 220 | } 221 | 222 | location ~ \.m3u8$ { 223 | proxy_pass http://live-server; 224 | proxy_cache m3u8-cache; 225 | proxy_cache_lock on; 226 | proxy_cache_key $host$uri; 227 | proxy_cache_valid 200 304 1s; 228 | proxy_set_header Host $http_host; 229 | expires -1; 230 | } 231 | } 232 | ``` 233 | 234 | # 五、录像保存 235 | 236 | 如果需要将rtmp实时流保存为flv文件,可以安装rtmpdump: 237 | 238 | ``` 239 | apt-get install rtmpdump 240 | 241 | rtmpdump -v -m 0 -r rtmp://x.x.x.x/live/ustc -o output.flv 242 | ``` 243 | 244 | 245 | *** 246 | 欢迎 [加入我们整理资料](https://github.com/bg6cq/ITTS) 247 | -------------------------------------------------------------------------------- /app/ntp/gps/README.md: -------------------------------------------------------------------------------- 1 | ## [原创] 用GPS模块建立高精度ntp服务器 2 | 3 | 本文原创:**中国科学技术大学 张焕杰** 4 | 5 | 修改时间:2019.02.26 6 | 7 | # 零、高精度时间的定义 8 | 9 | 简单的说,衡量时间主要有2个参数,分别是offset和jitter。offset可以理解为与标准时间的偏差,jitter可以理解为时间均匀度。 10 | 11 | 比如一个石英钟,每天对比与CCTV新闻联播时间一致,可以认为jitter为0,但offset并不一定为0,因为电视信号传播需要时间。 12 | 13 | 理想的ntp服务器,offset和jitter都为0。 14 | 15 | 对于现实的计算机,我们希望: 16 | 17 | * 时间单向增加,也就是不会发生往回调表的情况。 18 | * 时间均匀增加,也就是不会忽快忽慢,即上面描述的jitter尽量接近0。 19 | * 与标准时间偏差尽量少,即上面描述的offset尽量接近0。 20 | 21 | 使用GPS模块授时的ntp服务器,据称offset可以到10µs(即0.01ms,大约相当于光或电波传播3km的时间)左右,jitter与服务器晶振和环境温度有关,一般可以到10µs以下(即0.01ms)。 22 | 23 | # 一、GPS授时简单原理 24 | 25 | GPS卫星有精密时钟源,GPS模块依靠接收到信号时间差来计算位置,同时可以通过以下两种方式对外输出时间信息: 26 | 27 | 一是通过串口输出NMEA语句,如下的北斗格式(GPS格式,前面是$GPRMC)输出: 28 | 29 | ``` 30 | $GNRMC,015022.00,A,3150.59184,N,11716.04078,E,0.242,,260219,,,D,V*12 31 | ``` 32 | 33 | 其中的015022是时间01:50:22(UTC时间,对应的北京时间是09:50:22),260219是2019年2月26日。 34 | 35 | 这种输出,由于串口工作在9600BPS速率,误差比较大。 36 | 37 | 二是通过引脚 1PPS,信号的上升沿表示每秒钟的开始。1PPS信号的精度比较高,在10-30ns。 38 | 39 | 结合以上两种方式,可以从GPS模块得到高精度的时钟信号。 40 | 41 | # 二、GPS模块/接收器的选择 42 | 43 | 如果是连接PC机使用,建议选择RS232信号电平的模块,如果连接树莓派机器使用,可以使用TTL信号电平的模块。 44 | 45 | 绝大部分GPS模块,引出了电源、地、RX、TX四根线,而并未将1PPS信号引出。用作ntp时,购买时让商家断开RX信号,引出1PPS信号。 46 | 47 | 我从taobao 深圳北天通讯 购买的 GPS/北斗双模BS-70DU接收器,其中USB口用来给模块供电,RS232口用来通信。 48 | 49 | 特别注意:购买时与店主沟通,让店主断开RX信号,将1PPS信号连接到DB9的1口,即DCD信号。 50 | 51 | 模块外形如下: 52 | 53 | ![BS-70DU](bs-70du.png) 54 | 55 | 后来,我又从taobao 北京GPS北斗专业店 购买了 M8N 双频10HZ输出 RS232接口 USB供电MH16-N1 北斗GPS,购买时与店主沟通,要求 56 | 57 | 1PPS信号接rs 232的1脚(dcd)。 58 | 59 | 模块外形如下: 60 | 61 | ![M8N](m8n.jpg) 62 | 63 | 64 | # 三、服务器的安装 65 | 66 | 本来计划使用atom处理的小盒子做ntp服务器,测试时发现无法成功,可能与atom处理的CPU自动降频有关。后来找了一台比较老的服务器,顺利完成。 67 | 68 | ## 3.1 安装OS和软件 69 | 70 | 使用的是CentOS 7,安装系统后,运行以下命令安装需要的软件: 71 | 72 | ``` 73 | yum install -y epel-release 74 | yum install -y ntp pps-tools gpsd gpsd-clients 75 | ``` 76 | 77 | ## 3.2 gpsd设置 78 | 79 | gpsd是用来读取GPS模块信息,并将信息放到一段共享内存,供ntpd之类的其他应用使用。 80 | 81 | 编辑 `/etc/sysconfig/gpsd`,修改为(GPS模块232口接在COM1,也就是ttysS0) 82 | ``` 83 | # Options for gpsd, including serial devices 84 | OPTIONS="-n /dev/ttyS0" 85 | # Set to 'true' to add USB devices automatically via udev 86 | USBAUTO="true" 87 | ``` 88 | 设置gpsd启动: 89 | ``` 90 | systemctl start gpsd 91 | systemctl enable gpsd 92 | ``` 93 | 这时执行`cgps`或`gpsmon`可以看到信息,分别如下图所示,其中有位置信息、PPS信息,说明GPS模块工作正常: 94 | 95 | ![CGPS](cgps.png) 96 | 97 | ![gpsmon](gpsmon.png) 98 | 99 | ## 3.3 ntpd设置 100 | 101 | CentOS 7默认的是chronyd,我还是使用相对熟悉的ntpd。 102 | 103 | 编辑文件`/etc/ntp.conf`,增加如下内容: 104 | ``` 105 | server 127.127.28.0 minpoll 4 maxpoll 4 106 | fudge 127.127.28.0 refid GPS 107 | 108 | server 127.127.28.1 minpoll 4 max poll 4 prefer 109 | fudge 127.127.28.1 refid PPS 110 | ``` 111 | 这里的127.127.28.0和127.127.28.1是虚拟设备,含义是获取gpsd放到共享内存中的信息来对时。 112 | 113 | 114 | 设置ntpd启动,并放开防火墙: 115 | ``` 116 | systemctl stop chronyd 117 | systemctl disable chronyd 118 | systemctl start ntpd 119 | systemctl enable ntpd 120 | firewall-cmd --add-service=ntp --permanent 121 | firewall-cmd --reload 122 | ``` 123 | 如果执行这些命令时,系统的时间大致正确,过10来分钟,执行`ntpstat`看到如下输出,说明工作正常: 124 | ``` 125 | synchronised to UHF radio at stratum 1 126 | time correct to within 1 ms 127 | polling server every 64 s 128 | ``` 129 | 130 | 执行命令`ntpq -p`可以看到ntpd的工作状态: 131 | ``` 132 | # ntpq -p 133 | remote refid st t when poll reach delay offset jitter 134 | ============================================================================== 135 | +static-5-103-13 .GPS. 1 u 43 64 377 425.213 -51.480 1.376 136 | -biisoni.miuku.n 207.224.49.219 2 u 58 64 377 247.198 -16.032 11.992 137 | x2001:1af8:4700: 130.133.1.10 2 u 43 64 377 318.917 5.976 1.928 138 | +SHM(0) .GPS. 0 l 9 16 377 0.000 -109.06 7.257 139 | *SHM(1) .PPS. 0 l 9 16 377 0.000 0.002 0.001 140 | ``` 141 | 这里显示服务器时钟与 PPS 信号的offset是0.002ms(即2us),jitter是0.001ms(即1us)。 142 | 143 | 而GPS NMEA信号,因为RS232串口传输慢,要慢109.06ms(大约0.1s)。GNRMC消息大约70个字节长,每个字节前有开始bit,后有结束bit, 144 | 传输70字节的消息需要 70*(2+8)/9600=0.073 秒。 145 | 146 | 此时,从其他计算机执行`ntpdate ntp服务器IP地址`,可以完成对时操作。 147 | 148 | 使用ntpdate对时,可能会引起时钟往前跳变。因此,重要的服务器建议直接用ntp同步对时。 149 | 150 | 如果允许其他服务器想使用带有gps模块的ntp服务器进行同步,则需要在ntp.conf中增加(其中c.c.c.c是其他ntp服务器的IP地址) 151 | ``` 152 | restrict c.c.c.c nomodify notrap 153 | ``` 154 | 155 | 在其他服务器的 ntp.conf 中增加(其中s.s.s.s是其他带有GPS模块的ntp服务器IP地址) 156 | ``` 157 | server s.s.s.s minpoll 3 maxpoll 3 prefer 158 | ``` 159 | 注意:有些版本的服务器minpoll和maxpoll最小允许为4,即16秒查询一次。ntpq -p 可以看到。如果设置为3或4,ntp对时后,offset可以到20us以下。 160 | 161 | # 四、服务器运行状态监控 162 | 163 | 如果想监视ntp服务器的运行状况,可以参考 https://www.satsignal.eu/ntp/NTPandMRTG.html 164 | 165 | 下面是我参考网页的做法: 166 | ``` 167 | yum install mrtg httpd 168 | ``` 169 | 170 | vi `/etc/mrtg/ntp.cfg`,输入以下内容: 171 | ``` 172 | HtmlDir: /var/www/mrtg 173 | ImageDir: /var/www/mrtg 174 | LogDir: /var/lib/mrtg 175 | 176 | Target[ntp]: `perl /etc/mrtg/GetNTPoffset.pl 127.0.0.1` 177 | MaxBytes[ntp]: 100000 178 | Title[ntp]: NTP statistics - offset from UTC 179 | Options[ntp]: integer, gauge, nopercent, growright 180 | Colours[ntp]: BLUE#0033FF, RED#FF0000, BLUE#0033FF, RED#FF0000, 181 | YLegend[ntp]: offset +/- us 182 | ShortLegend[ntp]: µs 183 | LegendI[ntp]: offset µs (-):  184 | LegendO[ntp]: offset µs (+):  185 | Legend1[ntp]: Time offset in µs (-) 186 | Legend2[ntp]: Time offset in µs (+) 187 | PageTop[ntp]:

NTP server

188 | ``` 189 | 190 | vi `/etc/mrtg/GetNTPoffset.pl`,输入以下内容: 191 | ``` 192 | # Expects node name as a parameter 193 | # Returns 1st value for positive offsets, second value for negative 194 | # Returns microseconds of offset 195 | $ntp_str = `/usr/sbin/ntpq -c rv $ARGV[0]`; # execute "ntpq -c rv " 196 | $val = (split(/\,/,$ntp_str))[20]; # get the offset string 197 | $val =~ s/offset=//i; # remove the "offset=" 198 | $val = int (1000 * $val); # convert to microseconds 199 | $nval = $val; # prepare the negative value 200 | if ($val < 0){ 201 | $nval = -$nval; # make the value positive 202 | $val = 0; # ensure zero return for the positive 203 | } else { 204 | $nval = 0; # ensure zero return for the negative 205 | } 206 | print "$nval\n"; # return four numbers, incoming 207 | print "$val\n"; # outgoing 208 | print "0\n"; 209 | print "$ARGV[0]\n"; 210 | ``` 211 | 212 | 执行`crontab -e`,增加一行 213 | ``` 214 | */5 * * * * env LANG=C /usr/bin/mrtg /etc/mrtg/ntp.conf 215 | ``` 216 | 217 | `vi /etc/httpd/conf.d/mrtg.conf`,放开访问权限。 218 | 219 | 执行以下命令,启动httpd: 220 | ``` 221 | systemctl start httpd 222 | systemctl enable httpd 223 | firewall-cmd --add-service=http --permanent 224 | firewall-cmd --reload 225 | ``` 226 | 227 | 然后访问 http://x.x.x.x/mrtg/ntp.html 就能看到 offset 的变化情况了。 228 | 229 | 参考资料: 230 | 231 | * http://www.catb.org/gpsd/gpsd-time-service-howto.html 232 | * https://www.satsignal.eu/ntp/Raspberry-Pi-NTP.html 233 | * https://pthree.org/2013/11/05/real-life-ntp/ 234 | 235 | *** 236 | 欢迎 [加入我们整理资料](https://github.com/bg6cq/ITTS) 237 | -------------------------------------------------------------------------------- /security/ipsec/README.md: -------------------------------------------------------------------------------- 1 | ## [原创]使用ipsec加密Linux主机间通信 2 | 3 | 本文原创:**中国科学技术大学 张焕杰** 4 | 5 | 修改时间:2017.11.21 6 | 7 | ## 一、ipsec介绍 8 | 9 | ipsec是工作在IP层的安全协议,本文介绍使用ipsec协议来加密Linux主机间的IP通信。 10 | 11 | 本文仅仅介绍简单的静态密钥设置,并使用加密分组流的封装安全载荷协议(ESP协议)和认证头协议(AH协议)协议来保证数据的机密性、来源可靠性(认证)、无连接的完整性并提供抗重播服务。 12 | 13 | 使用ipsec加密后,两台主机间的通信对第三方完全保密,并且不受可能的ARP劫持/TCP劫持等攻击。 14 | 15 | 我们计划在反向代理服务器和校内的Linux主机间逐步采用ipsec加密,以彻底避免校内服务器被TCP连接劫持。 16 | 17 | ## 二、使用的ipsec实现 18 | 19 | ipsec在Linux下有若干实现,本文介绍的是kernel 2.5.49引入的native实现,并不是通常的FeeS/WAN。 20 | 21 | 在CentOS 6,需要安装epel中ipsec-tools包。 22 | ``` 23 | yum install ipsec-tools 24 | ``` 25 | 26 | ## 三、静态密钥配置 27 | 28 | 假定2台Linux主机,IP分别是202.141.176.2和202.141.176.3,需要使用ipsec安全通信,在 29 | 202.141.176.2主机的配置如下: 30 | 31 | ipsec.sh 32 | ```` 33 | #!/sbin/setkey -f 34 | #202.141.176.2配置 35 | flush; 36 | spdflush; 37 | 38 | # AH 定义认证配置 39 | add 202.141.176.2 202.141.176.3 ah 15700 -A hmac-md5 "1234567890123456"; 40 | add 202.141.176.3 202.141.176.2 ah 24500 -A hmac-md5 "1234567890123456"; 41 | 42 | # ESP 定义加密配置 43 | add 202.141.176.2 202.141.176.3 esp 15701 -E 3des-cbc "123456789012123456789012"; 44 | add 202.141.176.3 202.141.176.2 esp 24501 -E 3des-cbc "123456789012123456789012"; 45 | 46 | # 定义安全策略 47 | spdadd 202.141.176.2 202.141.176.3 any -P out ipsec 48 | esp/transport//require 49 | ah/transport//require; 50 | 51 | spdadd 202.141.176.3 202.141.176.2 any -P in ipsec 52 | esp/transport//require 53 | ah/transport//require; 54 | ```` 55 | 56 | 202.141.176.3主机的配置如下: 57 | 58 | ipsec.sh 59 | ```` 60 | #!/sbin/setkey -f 61 | #202.141.176.3配置 62 | flush; 63 | spdflush; 64 | 65 | # AH 定义认证配置 66 | add 202.141.176.2 202.141.176.3 ah 15700 -A hmac-md5 "1234567890123456"; 67 | add 202.141.176.3 202.141.176.2 ah 24500 -A hmac-md5 "1234567890123456"; 68 | 69 | # ESP 定义加密配置 70 | add 202.141.176.2 202.141.176.3 esp 15701 -E 3des-cbc "123456789012123456789012"; 71 | add 202.141.176.3 202.141.176.2 esp 24501 -E 3des-cbc "123456789012123456789012"; 72 | 73 | # 定义安全策略 74 | spdadd 202.141.176.3 202.141.176.2 any -P out ipsec 75 | esp/transport//require 76 | ah/transport//require; 77 | 78 | spdadd 202.141.176.2 202.141.176.3 any -P in ipsec 79 | esp/transport//require 80 | ah/transport//require; 81 | ```` 82 | 83 | 从以上设置可以看到,两台主机的AH和ESP配置是完全相同的,安全策略处 in/out是相反的。 84 | 85 | 在2台Linux主机上,分别执行以上命令即可完成设置。 86 | 87 | ## 四、iptables有关注意事项 88 | 89 | 使用ipsec加密数据包时,每个数据包会两次通过iptables过滤规则。如果同时使用了AH/ESP,第一次经过iptables过滤时看到的协议是最外层的AH。 90 | 91 | 如在202.141.176.3上,接收到来自202.141.176.2发送的`ping 202.141.176.3`产生的数据包,第一次经过iptables过滤时,看到的协议是最外层的AH; 92 | 第二次经过iptables过滤时,数据包才是解密后的icmp数据包。因此设置以下规则允许AH数据包经过。 93 | ``` 94 | iptables -I INPUT -j ACCEPT -p ah 95 | ``` 96 | 97 | ## 五、验证与测试 98 | 99 | 使用setkey -D 可以查看设置的AH/ESP加密配置 100 | ```` 101 | # setkey -D 102 | 202.141.176.3 202.141.176.2 103 | esp mode=transport spi=24501(0x00005fb5) reqid=0(0x00000000) 104 | E: 3des-cbc 31323334 35363738 39303132 31323334 35363738 39303132 105 | seq=0x00000000 replay=0 flags=0x00000000 state=mature 106 | created: Nov 21 06:15:17 2017 current: Nov 21 07:07:10 2017 107 | diff: 3113(s) hard: 0(s) soft: 0(s) 108 | last: Nov 21 06:15:34 2017 hard: 0(s) soft: 0(s) 109 | current: 1123603(bytes) hard: 0(bytes) soft: 0(bytes) 110 | allocated: 1413 hard: 0 soft: 0 111 | sadb_seq=1 pid=30211 refcnt=0 112 | 202.141.176.2 202.141.176.3 113 | esp mode=transport spi=15701(0x00003d55) reqid=0(0x00000000) 114 | E: 3des-cbc 31323334 35363738 39303132 31323334 35363738 39303132 115 | seq=0x00000000 replay=0 flags=0x00000000 state=mature 116 | created: Nov 21 06:15:17 2017 current: Nov 21 07:07:10 2017 117 | diff: 3113(s) hard: 0(s) soft: 0(s) 118 | last: Nov 21 06:21:35 2017 hard: 0(s) soft: 0(s) 119 | current: 36631(bytes) hard: 0(bytes) soft: 0(bytes) 120 | allocated: 629 hard: 0 soft: 0 121 | sadb_seq=2 pid=30211 refcnt=0 122 | 202.141.176.3 202.141.176.2 123 | ah mode=transport spi=24500(0x00005fb4) reqid=0(0x00000000) 124 | A: hmac-md5 31323334 35363738 39303132 33343536 125 | seq=0x00000000 replay=0 flags=0x00000000 state=mature 126 | created: Nov 21 06:15:17 2017 current: Nov 21 07:07:10 2017 127 | diff: 3113(s) hard: 0(s) soft: 0(s) 128 | last: Nov 21 06:15:34 2017 hard: 0(s) soft: 0(s) 129 | current: 1155520(bytes) hard: 0(bytes) soft: 0(bytes) 130 | allocated: 1413 hard: 0 soft: 0 131 | sadb_seq=3 pid=30211 refcnt=0 132 | 202.141.176.2 202.141.176.3 133 | ah mode=transport spi=15700(0x00003d54) reqid=0(0x00000000) 134 | A: hmac-md5 31323334 35363738 39303132 33343536 135 | seq=0x00000000 replay=0 flags=0x00000000 state=mature 136 | created: Nov 21 06:15:17 2017 current: Nov 21 07:07:10 2017 137 | diff: 3113(s) hard: 0(s) soft: 0(s) 138 | last: Nov 21 06:21:35 2017 hard: 0(s) soft: 0(s) 139 | current: 51096(bytes) hard: 0(bytes) soft: 0(bytes) 140 | allocated: 629 hard: 0 soft: 0 141 | sadb_seq=0 pid=30211 refcnt=0 142 | ```` 143 | 使用setkey -DP 可以查看设置的安全策略配置 144 | ```` 145 | # setkey -DP 146 | 202.141.176.3[any] 202.141.176.2[any] 255 147 | fwd prio def ipsec 148 | esp/transport//require 149 | ah/transport//require 150 | created: Nov 21 08:42:43 2017 lastused: 151 | lifetime: 0(s) validtime: 0(s) 152 | spid=90 seq=1 pid=28450 153 | refcnt=1 154 | 202.141.176.3[any] 202.141.176.2[any] 255 155 | in prio def ipsec 156 | esp/transport//require 157 | ah/transport//require 158 | created: Nov 21 08:42:43 2017 lastused: 159 | lifetime: 0(s) validtime: 0(s) 160 | spid=80 seq=2 pid=28450 161 | refcnt=1 162 | 202.141.176.2[any] 202.141.176.3[any] 255 163 | out prio def ipsec 164 | esp/transport//require 165 | ah/transport//require 166 | created: Nov 21 08:42:43 2017 lastused: 167 | lifetime: 0(s) validtime: 0(s) 168 | spid=73 seq=0 pid=28450 169 | refcnt=1 170 | ```` 171 | 172 | 使用tcpdump抓包可以验证2台Linux主机间的通信是经过加密的。 173 | ```` 174 | #ping 202.141.176.3 175 | PING 202.141.176.3 (202.141.176.3) 56(84) bytes of data. 176 | 64 bytes from 202.141.176.3: icmp_seq=1 ttl=64 time=0.553 ms 177 | 64 bytes from 202.141.176.3: icmp_seq=2 ttl=64 time=0.290 ms 178 | 179 | # tcpdump -i eth0 -nn -c 100 host 202.141.176.3 & 180 | tcpdump: verbose output suppressed, use -v or -vv for full protocol decode 181 | listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes 182 | 09:08:22.323311 IP 202.141.176.2 > 202.141.176.3: AH(spi=0x00003d54,seq=0x1): ESP(spi=0x00003d55,seq=0x1), length 88 183 | 09:08:22.323767 IP 202.141.176.3 > 202.141.176.2: AH(spi=0x00005fb4,seq=0x586): ESP(spi=0x00005fb5,seq=0x586), length 88 184 | 09:08:23.323527 IP 202.141.176.2 > 202.141.176.3: AH(spi=0x00003d54,seq=0x2): ESP(spi=0x00003d55,seq=0x2), length 88 185 | 09:08:23.323765 IP 202.141.176.3 > 202.141.176.2: AH(spi=0x00005fb4,seq=0x587): ESP(spi=0x00005fb5,seq=0x587), length 88 186 | ```` 187 | 188 | ## 六、参考资料 189 | 190 | [IPSEC: secure IP over the Internet](http://lartc.org/howto/lartc.ipsec.html) 191 | 192 | 193 | *** 194 | 欢迎 [加入我们整理资料](https://github.com/bg6cq/ITTS) 195 | -------------------------------------------------------------------------------- /env/modbus/README.md: -------------------------------------------------------------------------------- 1 | ## [原创] 通过RS485总线使用Modbus RTU over TCP 协议采集环境传感器信息 2 | 3 | 本文原创:**中国科学技术大学 张焕杰** 4 | 5 | 修改时间:2018.01.21 6 | 7 | 本文记录一个RS485总线上的供电状态和温湿度传感器信息采集程序的开发过程。 8 | 9 | ## 一、系统中的设备 10 | 11 | 系统中有一个网口转RS485的转换器([taobao链接](https://detail.tmall.com/item.htm?id=520676764679)),转换器的RS485总线上连接了2个传感器,分别是 12 | 6路市电交流供电状态传感器([taobao链接](https://item.taobao.com/item.htm?id=524649936848))和温湿度传感器(10多年前购买的,型号为TH-802)。 13 | 14 | 6路市电交流供电状态传感器的6路输入是双路ATS自动切换开关的状态,分别代表常电是否有电、备电是否有电、常电空开是否闭合、备电 15 | 空开是否闭合、常电空开是否过流、备电空开是否过流的6个状态。 16 | 17 | 485总线上的设备可以并联,只要各个设备的485总线地址设置为不同即可。 18 | 19 | ![modbus](modbus.jpg) 20 | 21 | ## 二、设备参数和命令格式 22 | 23 | 网口转RS 485的转换器IP地址是202.38.64.142,工作于TCP-SERVER模式,TCP端口是8000。 24 | 25 | 6路市电状态传感器485总线地址是1,以命令3(读取保持寄存器)从寄存器地址40400开始读6个16bit数,是6路市电的状态,1表示有电(220v左右),0表示无电(低于100v)。 26 | 27 | 温湿度传感器([协议文档](https://wenku.baidu.com/view/b9211a3d67ec102de2bd8980.html))485总线地址是2,以命令4(读取输入寄存器)从寄存器地址0开始读2个16bit数,当作带符号16bit整数,除以10以后,分别是温度和湿度。 28 | 29 | 返回的16bit整数,第1个字节是高位,第2个字节是低位,与通常的x86不同,需要转换一下,libmodbus会完成转换。 30 | 31 | ## 三、libmodbus 库安装 32 | 33 | 本文使用libmodbus库来处理底层通信。 34 | 35 | 需要说明的是,上面的网络转RS485转换器,是直接利用TCP传输modbus rtu数据包(通常称为RTU over TCP),这种协议并不是modbus-tcp, 36 | 原作者 https://github.com/stephane/libmodbus 中并不支持这种方式。 37 | 38 | https://github.com/v-zhuravlev/libzbxmodbus 做了修改,支持RTU over TCP,我把两者结合放在 https://github.com/bg6cq/libmodbus-rtutcp 39 | 40 | ``` 41 | cd /usr/src/ 42 | git clone https://github.com/bg6cq/libmodbus-rtutcp.git 43 | cd libmodbus-rtutcp 44 | ./configure 45 | make install 46 | cp /usr/local/lib/libmodbus.so.5 /lib 47 | ``` 48 | 49 | ## 四、简单的采集程序 50 | 51 | 程序文件放在目录 /usr/src/powermon 下 52 | 53 | Makefile 54 | ``` 55 | all: read485 56 | 57 | read485: read485.c 58 | gcc -g -o read485 read485.c -L/usr/local/lib -lmodbus 59 | ``` 60 | 61 | 采集程序 read485.c, 程序逻辑很简单,每秒钟采集一次,采集的数据保存在文件中: 62 | 读入L1-L6的状态,分别写入文件L1-L6;读入温度和湿度信息,分别写入文件Utemp和Uhum;把最后的更新时间写入文件Ulastrun。 63 | 64 | ``` 65 | #include 66 | #include 67 | #include 68 | #include 69 | #include 70 | #include 71 | #include 72 | #include 73 | #include 74 | 75 | #include "/usr/local/include/modbus/modbus.h" 76 | 77 | #define DEBUG 1 78 | 79 | #define MAXLEN 16384 80 | 81 | void Process(char *server, char * port) 82 | { modbus_t *mb; 83 | uint8_t buf[MAXLEN]; 84 | char fname[MAXLEN]; 85 | FILE *fp; 86 | int i; 87 | short int v; 88 | struct timeval tv; 89 | mb = modbus_new_rtutcp(server, atoi(port)); 90 | tv.tv_sec = 2; 91 | tv.tv_usec = 0; 92 | modbus_set_response_timeout(mb, &tv); 93 | if (modbus_connect(mb) == -1) { 94 | #ifdef DEBUG 95 | fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno)); 96 | #endif 97 | abort(); 98 | } 99 | 100 | while (1) { 101 | // read L1-L6 status 102 | modbus_set_slave(mb, 1); 103 | if(6!=modbus_read_registers(mb, 40400, 6, buf)) { 104 | #ifdef DEBUG 105 | printf("read L1-L6 registers failed: %s\n", modbus_strerror(errno)); 106 | #endif 107 | abort(); 108 | } 109 | #ifdef DEBUG 110 | printf("L1-L6 status: "); 111 | for(i=0;i<6;i++) 112 | printf("L%d=%d ",i+1, *(short int*)(buf+i*2)); 113 | printf("\n"); 114 | #endif 115 | for(i=0;i<6;i++) { 116 | sprintf(fname,"UL%d",i+1); 117 | fp=fopen(fname,"r+"); 118 | if(fp) { 119 | fseek(fp,0L,SEEK_SET); 120 | if(1 == *(short int*)(buf+i*2)) 121 | fprintf(fp,"1"); 122 | else 123 | fprintf(fp,"0"); 124 | fclose(fp); 125 | } 126 | } 127 | 128 | //read temp & hum 129 | modbus_set_slave(mb, 2); 130 | if(modbus_read_input_registers(mb, 0, 2, buf)!=2) { 131 | #ifdef DEBUG 132 | printf("read temp/hum registers failed: %s\n", modbus_strerror(errno)); 133 | #endif 134 | abort(); 135 | } 136 | v = *(short int*)(buf); 137 | #ifdef DEBUG 138 | printf("Temp=%d ",v); 139 | #endif 140 | fp=fopen("Utemp","r+"); 141 | if(fp) { 142 | fseek(fp,0L,SEEK_SET); 143 | fprintf(fp,"%6.2f",v/10.0); 144 | fclose(fp); 145 | } 146 | v = *(short int*)(buf+2); 147 | #ifdef DEBUG 148 | printf("Hum=%d\n ",v); 149 | #endif 150 | fp=fopen("Uhum","r+"); 151 | if(fp) { 152 | fseek(fp,0L,SEEK_SET); 153 | fprintf(fp,"%5.2f",v/10.0); 154 | fclose(fp); 155 | } 156 | 157 | fp=fopen("Ulastrun","r+"); 158 | if(fp) { 159 | fseek(fp,0L,SEEK_SET); 160 | fprintf(fp,"%ld",time(NULL)); 161 | fclose(fp); 162 | } 163 | sleep(1); 164 | } 165 | } 166 | 167 | 168 | void usage() 169 | { 170 | printf("read485 v1.0 by james@ustc.edu.cn\n"); 171 | printf("read485 [ x.x.x.x port ]\n\n"); 172 | exit(0); 173 | } 174 | 175 | int main(int argc, char *argv[]) 176 | { 177 | char *server="202.38.64.142"; 178 | char *port = "8000"; 179 | signal(SIGCHLD,SIG_IGN); 180 | if(argc==3) { 181 | server=argv[1]; 182 | port = argv[2]; 183 | } else if(argc!=1) { 184 | usage(); 185 | exit(0); 186 | } 187 | 188 | #ifndef DEBUG 189 | daemon_init("read485",LOG_DAEMON); 190 | while(1) { 191 | int pid; 192 | pid=fork(); 193 | if(pid==0) // i am child, will do the job 194 | break; 195 | else if(pid==-1) // error 196 | exit(0); 197 | else 198 | wait(NULL); // i am parent, wait for child 199 | sleep(2); // if child exit, wait 2 second, and rerun 200 | } 201 | #endif 202 | Process(server, port); 203 | return(0); 204 | } 205 | ``` 206 | 207 | 执行`make`编译程序后,`./read485`可以看到能读出相关信息。 208 | 209 | 210 | ## 五、简单的WEB显示程序 211 | 212 | 下面是非常简单的index.php,用来显示采集到的状态。 213 | 214 | 显示的例子请参见 [http://netfee.ustc.edu.cn/powermon/](http://netfee.ustc.edu.cn/powermon/) 215 | 216 | ``` 217 | 220 | 221 |

UPS房间
222 | "; 226 | if(time()-$tm>5) echo "数据更新不及时
"; 227 | readfile ("/usr/src/powermon/Utemp"); 228 | echo "°C "; 229 | readfile ("/usr/src/powermon/Uhum"); 230 | echo "%
"; 231 | echo "\n"; 232 | echo "\n"; 233 | echo "\n"; 238 | echo "\n"; 243 | echo "\n"; 248 | echo "
 主用备用
电源
开关
过流
"; 249 | ?> 250 | ``` 251 | 252 | 253 | *** 254 | 欢迎 [加入我们整理资料](https://github.com/bg6cq/ITTS) 255 | -------------------------------------------------------------------------------- /security/gpg/README.md: -------------------------------------------------------------------------------- 1 | ## [原创] 从一个简单的备份需求演示GPG的使用 2 | 3 | 本文原创:**中国科学技术大学 张焕杰** 4 | 5 | 修改时间:2019.01.26 6 | 7 | ## 一、一个简单需求 8 | 9 | 领导说:要保障数据安全,做好备份工作。现在预算紧张,有那么多免费的云空间,能否直接备份到云上呢? 10 | 11 | ## 二、需求落实调研 12 | 13 | 各种脚本可以上传/下载云空间文件,只要解决了安全问题,使用云空间备份是可行的。 14 | 15 | 为了安全,显然要在备份上传前对文件进行加密。说到加密,就离不开两种加解密算法: 16 | 17 | ### 2.1 对称加解密算法 18 | 19 | 对称加解密算法,它的特点是加密和解密操作使用同样的密钥key。 20 | 21 | ![sme](img/sme.png) 22 | 23 | 常见的对称加解密算法有AES、3DES等,一般来说性能很高,每秒钟可以加解密100MB字节或更多的信息。 24 | 25 | 一旦密钥key泄漏,加密的信息就可以被解密,也就是泄漏了。 26 | 27 | 如果使用对称加密算法加密备份文件,然后再上传到云空间,似乎能解决数据安全问题,但实际上这样做有很大的安全隐患: 28 | 29 | 对称加解密算法加密时需要密钥key,为了自动化操作,势必要在服务器上存放密钥key。一旦服务器被入侵,密钥key泄漏,之前所有加密的备份文件,都可以被解密而泄漏。 30 | 31 | ### 2.2 非对称加解密算法 32 | 33 | 非对称加解密算法,它的特点是加密和解密操作使用不同的密钥。2个密钥成对出现,1个称为私钥(private key)需要私密保存,另1个称为公钥(public key)可以对外公开。 34 | 35 | 在单独知道公钥的情况下,短时间无法推导或计算出私钥。 36 | 37 | ![ase](img/ase.png) 38 | 39 | 常见的非对称加解密算法有RSA、ECC,一般来说加密/解密的性能比对称加解密算法要慢2-3个数量级。 40 | 41 | 除了简单加解密外,非对称加解密算法还可以完成数字签名、身份认证等工作。 42 | 如果说对称加解密是农耕时代,非对称加解密算法则是进入到电气化时代。 43 | ![ass](img/ass.png) 44 | 45 | 对于上述备份加密需求,服务器上可以仅仅存放公钥,备份文件使用公钥加密后上传到云空间。公钥本来就是公开的,即使服务器被入侵,也不会泄漏什么。 46 | 需要解密文件时,再拿出单独保存的私钥来完成文件解密操作。 47 | 48 | ### 2.3 实际应用 49 | 50 | 实际使用时,往往采用非对称加解密算法来加密解密文件密钥key,然后通过性能高的对称加解密算法使用文件密钥key完成对文件的快读加解密操作。这样做既保证了安全性,又能提供很高的性能。 51 | 52 | 以上原理看起来复杂,使用常见的gpg(GnuPGP)软件操作并不复杂,主要包含如下步骤: 53 | * 生成私钥和公钥 54 | * 导出私钥和公钥 55 | * 把公钥导入要备份的服务器 56 | * 加密文件 57 | * 导入私钥 58 | * 解密文件 59 | 60 | ![gpg](img/gpg.png) 61 | 62 | 最早实现加密/解密功能的软件是PGP,但它是商业软件。gpg(GnuPGP)是一个实现了类似PGP功能的开源软件。 63 | 64 | 以下演示在CentOS 7.0下完成,gpg版本是 2.0.22 65 | 66 | ## 三、操作演示 67 | 68 | ### 3.1 生成私钥和公钥 69 | 70 | 在一台安全的机器上,生成私钥和公钥对。由于我们是做备份文件的加密,因此有效期可以设置为0(永不过期)。 71 | 期间会提示输入一个密码用来保护私钥,请记住这个密码。私钥将用这个密码加密存放,一但忘记这个密码, 72 | 将无法获取到私钥,也就无法解密用公钥加密的文件。 73 | 74 | 由于需要足够的随机性,生成私钥和公钥的时间比较长,我花了30分钟左右。 75 | 76 | ```console 77 | # gpg --gen-key 78 | gpg (GnuPG) 2.0.22; Copyright (C) 2013 Free Software Foundation, Inc. 79 | This is free software: you are free to change and redistribute it. 80 | There is NO WARRANTY, to the extent permitted by law. 81 | 82 | 请选择您要使用的密钥种类: 83 | (1) RSA and RSA (default) 84 | (2) DSA and Elgamal 85 | (3) DSA (仅用于签名) 86 | (4) RSA (仅用于签名) 87 | 您的选择? 1 88 | RSA 密钥长度应在 1024 位与 4096 位之间。 89 | 您想要用多大的密钥尺寸?(2048)4096 90 | 您所要求的密钥尺寸是 4096 位 91 | 请设定这把密钥的有效期限。 92 | 0 = 密钥永不过期 93 | = 密钥在 n 天后过期 94 | w = 密钥在 n 周后过期 95 | m = 密钥在 n 月后过期 96 | y = 密钥在 n 年后过期 97 | 密钥的有效期限是?(0) 0 98 | 密钥永远不会过期 99 | 以上正确吗?(y/n)y 100 | 101 | You need a user ID to identify your key; the software constructs the user ID 102 | from the Real Name, Comment and Email Address in this form: 103 | "Heinrich Heine (Der Dichter) " 104 | 105 | 真实姓名:backup user 106 | 电子邮件地址:backup@ustc.edu.cn 107 | 注释: 108 | 您选定了这个用户标识: 109 | “backup user ” 110 | 111 | 更改姓名(N)、注释(C)、电子邮件地址(E)或确定(O)/退出(Q)?o 112 | 您需要一个密码来保护您的私钥。 113 | 114 | 我们需要生成大量的随机字节。这个时候您可以多做些琐事(像是敲打键盘、移动 115 | 鼠标、读写硬盘之类的),这会让随机数字发生器有更好的机会获得足够的熵数。 116 | 117 | 118 | --- 这里等了大约30分钟 119 | 120 | gpg: /root/.gnupg/trustdb.gpg:建立了信任度数据库 121 | gpg: 密钥 AC76A983 被标记为绝对信任 122 | 公钥和私钥已经生成并经签名。 123 | 124 | gpg: 正在检查信任度数据库 125 | gpg: 需要 3 份勉强信任和 1 份完全信任,PGP 信任模型 126 | gpg: 深度:0 有效性: 1 已签名: 0 信任度:0-,0q,0n,0m,0f,1u 127 | pub 4096R/AC76A983 2019-01-26 128 | 密钥指纹 = 8762 C5E9 9525 D863 8742 7D06 8C06 2706 AC76 A983 129 | uid backup user 130 | sub 4096R/339EB9D2 2019-01-26 131 | ``` 132 | 133 | 输入以下命令可以查看生成的私钥和公钥信息。实际上生成了一个主密钥(master key)和一个子密钥(subkey),每个 134 | 密钥包含私钥和公钥,其中的sec是主密钥私钥(SECret key),ssb是子密钥私钥(Secret SuBkey),pub是主密钥公钥(PUBlic key), 135 | sub是子密钥公钥(public SUBkey)。主密钥是用来对子密钥进行签名的,并不直接使用。 136 | 137 | ```console 138 | # gpg --list-secret-key 139 | /root/.gnupg/secring.gpg 140 | ------------------------ 141 | sec 4096R/AC76A983 2019-01-26 142 | uid backup user 143 | ssb 4096R/339EB9D2 2019-01-26 144 | 145 | # gpg --list-key 146 | /root/.gnupg/pubring.gpg 147 | ------------------------ 148 | pub 4096R/AC76A983 2019-01-26 149 | uid backup user 150 | sub 4096R/339EB9D2 2019-01-26 151 | ``` 152 | 153 | 154 | ### 3.2 导出私钥和公钥 155 | 156 | 执行以下命令可以将私钥和公钥导出成文件: 157 | ```console 158 | # gpg --armor --export-secret-keys > sec.key 159 | # gpg --armor --export-secret-subkeys > ssb.key 160 | # gpg --armor --export > pub.key 161 | ``` 162 | sec.key 是主密钥和子密钥私钥,ssb.key 是子密钥私钥,这两个文件使用生成密钥时输入的密码加密保存的,切记要保密存放。 163 | 164 | pub.key 是两者的公钥,可以公开。 公开公钥最简单的方法是送给key server,如把AC76A983密钥的公钥送给pgp.ustc.edu.cn(中国科大的pgp key server,注意这里的域名是pgp,因为最早的软件是PGP,gpg是GnuPGP) 165 | ``` 166 | # gpg --keyserver pgp.ustc.edu.cn --send-key AC76A983 167 | gpg: 将密钥‘AC76A983’上传到 hkp 服务器 pgp.ustc.edu.cn 168 | ``` 169 | 这时访问 http://pgp.ustc.edu.cn/ ,输入 0xAC76A983,可以查询到对应的公钥信息,内容就是文件 pub.key。 170 | 171 | 172 | ### 3.3 导入公钥 173 | 174 | 在要备份的机器,即将来要加密文件的机器上,导入公钥。 175 | 176 | ```console 177 | # gpg --import pub.key 178 | gpg: 密钥 AC76A983:公钥“backup user ”已导入 179 | gpg: 合计被处理的数量:1 180 | gpg: 已导入:1 (RSA: 1) 181 | ``` 182 | 183 | 使用以下命令可以验证公钥已经导入,私钥为空: 184 | ```console 185 | # gpg --list-key 186 | /root/.gnupg/pubring.gpg 187 | ------------------------ 188 | pub 4096R/AC76A983 2019-01-26 189 | uid backup user 190 | sub 4096R/339EB9D2 2019-01-26 191 | 192 | # gpg --list-secret-key 193 | ``` 194 | 195 | 导入的key还不被信任,可以执行以下命令信任这个key,或者在第一次执行加密时,按照提示信任key。 196 | ```console 197 | # gpg --edit-key AC76A983 198 | gpg (GnuPG) 2.0.22; Copyright (C) 2013 Free Software Foundation, Inc. 199 | This is free software: you are free to change and redistribute it. 200 | There is NO WARRANTY, to the extent permitted by law. 201 | 202 | 203 | pub 4096R/AC76A983 创建于:2019-01-26 有效至:永不过期 可用于:SC 204 | 信任度:未知 有效性:未知 205 | sub 4096R/339EB9D2 创建于:2019-01-26 有效至:永不过期 可用于:E 206 | [ 未知 ] (1). backup user 207 | 208 | gpg> trust 209 | pub 4096R/AC76A983 创建于:2019-01-26 有效至:永不过期 可用于:SC 210 | 信任度:未知 有效性:未知 211 | sub 4096R/339EB9D2 创建于:2019-01-26 有效至:永不过期 可用于:E 212 | [ 未知 ] (1). backup user 213 | 214 | 您是否相信这位用户有能力验证其他用户密钥的有效性(查对身份证、通过不同的渠道检查 215 | 指纹等)? 216 | 217 | 1 = 我不知道或我不作答 218 | 2 = 我不相信 219 | 3 = 我勉强相信 220 | 4 = 我完全相信 221 | 5 = 我绝对相信 222 | m = 回到主菜单 223 | 224 | 您的决定是什么?5 225 | 您真的要把这把密钥设成绝对信任?(y/N)y 226 | 227 | pub 4096R/AC76A983 创建于:2019-01-26 有效至:永不过期 可用于:SC 228 | 信任度:绝对 有效性:未知 229 | sub 4096R/339EB9D2 创建于:2019-01-26 有效至:永不过期 可用于:E 230 | [ 未知 ] (1). backup user 231 | 请注意,在您重启程序之前,显示的密钥有效性未必正确, 232 | 233 | gpg> quit 234 | ``` 235 | 236 | ### 3.4 加密文件 237 | 238 | 导入公钥后,加密文件非常简单,假定要加密的文件是 test.txt,加密后的文件是 test.txt.gpg。 239 | ```console 240 | # gpg -e -r backup test.txt 241 | ``` 242 | 243 | ### 3.5 导入私钥 244 | 245 | 解密文件之前,需要导入私钥。我们仅仅导入子密钥的私钥即可,导入私钥的同时也导入了公钥。 246 | 导入的密钥仍旧是加密的,因此这时并未要求输入密码。 247 | 248 | ```console 249 | # gpg --import ssb.key 250 | gpg: 密钥 AC76A983:私钥已导入 251 | gpg: /root/.gnupg/trustdb.gpg:建立了信任度数据库 252 | gpg: 密钥 AC76A983:公钥“backup user ”已导入 253 | gpg: 合计被处理的数量:1 254 | gpg: 已导入:1 (RSA: 1) 255 | gpg: 读取的私钥:1 256 | gpg: 导入的私钥:1 257 | # gpg --list-key 258 | /root/.gnupg/pubring.gpg 259 | ------------------------ 260 | pub 4096R/AC76A983 2019-01-26 261 | uid backup user 262 | sub 4096R/339EB9D2 2019-01-26 263 | 264 | # gpg --list-secret-key 265 | /root/.gnupg/secring.gpg 266 | ------------------------ 267 | sec# 4096R/AC76A983 2019-01-26 268 | uid backup user 269 | ssb 4096R/339EB9D2 2019-01-26 270 | ``` 271 | 272 | ### 3.6 解密文件 273 | 274 | 解密文件就很简单了,以下命令会把 test.txt.gpg 文件解密输出到 test.txt,中间会要求输入密钥的密码。 275 | 276 | ```console 277 | # gpg -o test.txt -d test.txt.gpg 278 | 279 | 您需要输入密码,才能解开这个用户的私钥:“backup user ” 280 | 4096 位的 RSA 密钥,钥匙号 339EB9D2,建立于 2019-01-26 (主钥匙号 AC76A983) 281 | 282 | gpg: 由 4096 位的 RSA 密钥加密,钥匙号为 339EB9D2、生成于 2019-01-26 283 | “backup user ” 284 | 285 | # cat test.txt 286 | this is a test file 287 | ``` 288 | 289 | ## 四、进阶使用 290 | 291 | 非对称密钥系统,最需要保护的是私钥。以上操作,虽然使用密码加密保存了私钥,但还是不够安全。 292 | 293 | 更安全的做法是把私钥除了离线保存(锁在保险柜中)备份外,平时不直接使用私钥, 294 | 而是使用一个存有私钥的硬件设备(如Yubikey)。 295 | 296 | Yubikey是一个硬件设备,可以单向将私钥导入,无法读取私钥。Yubikey可以利用私钥信息, 297 | 实现RSA 4096bit的加密、解密、签名、认证等操作。 298 | 299 | 每次加密、解密等需要使用私钥参与处理时,还可以增加一个触摸按键人工确认的过程,更加安全可靠。 300 | 301 | *** 302 | 欢迎 [加入我们整理资料](https://github.com/bg6cq/ITTS) 303 | -------------------------------------------------------------------------------- /security/gh0st/README.md: -------------------------------------------------------------------------------- 1 | ## [原创]使用deepseek辅助一次安全入侵事件分析 2 | 3 | 本文原创:**中国科学技术大学 张焕杰** 4 | 5 | 修改时间:2025.03.22 6 | 7 | 注:本文使用中国科学技术大学部署的deepseek https://chat.ustc.edu.cn ,相关命令在Linux系统中运行,其他系统结果可能略有出入。 8 | 9 | ## 一、安全事件通报 10 | 11 | 收到安全通报,通报说某80端口发生木马安全事件,通报包含如下内容: 12 | ``` 13 | ;payload=Gh0st\AD\00\00\00\E0\00\00\00x\9CKS``\98\C3\C0\C0\C0\06\C4\8C@\BCQ\96\81\81\09H\07\A7\16\95e&\A7*\04$&g+\182\94\F6\B000\AC\A8rc\00\01\11\A0\82\1F\\`&\83\C7K7\86\19\E5n\0C9\95n\0C;\84\0F3\AC\E8sch\A8^\CF4'J\97\A9\82\E30\C3\91h]&\90\F8\CE\97S\CBA4L?2=\E1\C4\92\86\0B@\F5`\0CT\1F\AE\AF]\0Ar\0B\03#\A3\DC\02~\06\86\03+\18m\C2=\FDtC,C\FDL<<==\\\9D\19\88\00\E5 \02\00T\F5+\\;hex=\\x47\\x68\\x30\\x73\\x74\\xAD\\x00\\x00\\x00\\xE0\\x00\\x00\\x00\\x78\\x9C\\x4B\\x53\\x60\\x60\\x98\\xC3\\xC0\\xC0\\xC0\\x06\\xC4\\x8C\\x40\\xBC\\x51\\x96\\x81\\x81\\x09\\x48\\x07\\xA7\\x16\\x95\\x65\\x26\\xA7\\x2A\\x04\\x24\\x26\\x67\\x2B\\x18\\x32\\x94\\xF6\\xB0\\x30\\x30\\xAC\\xA8\\x72\\x63\\x00\\x01\\x11\\xA0\\x82\\x1F\\x5C\\x60\\x26\\x83\\xC7\\x4B\\x37\\x86\\x19\\xE5\\x6E\\x0C\\x39\\x95\\x6E\\x0C\\x3B\\x84\\x0F\\x33\\xAC\\xE8\\x73\\x63\\x68\\xA8\\x5E\\xCF\\x34\\x27\\x4A\\x97\\xA9\\x82\\xE3\\x30\\xC3\\x91\\x68\\x5D\\x26\\x90\\xF8\\xCE\\x97\\x53\\xCB\\x41\\x34\\x4C\\x3F\\x32\\x3D\\xE1\\xC4\\x92\\x86\\x0B\\x40\\xF5\\x60\\x0C\\x54\\x1F\\xAE\\xAF\\x5D\\x0A\\x72\\x0B\\x03\\x23\\xA3\\xDC\\x02\\x7E\\x06\\x86\\x03\\x2B\\x18\\x6D\\xC2\\x3D\\xFD\\x74\\x43\\x2C\\x43\\xFD\\x4C\\x3C\\x3C\\x3D\\x3D\\x5C\\x9D\\x19\\x88\\x00\\xE5\\x20\\x02\\x00\\x54\\xF5\\x2B\\x5C 14 | ``` 15 | 16 | ## 二、payload 分析 17 | 18 | 从中猜测hex=后面是可疑payload的hex编码,提取hex=后内容到文件 payload.hex,文件内容为: 19 | ``` 20 | \\x47\\x68\\x30\\x73\\x74\\xAD\\x00\\x00\\x00\\xE0\\x00\\x00\\x00\\x78\\x9C\\x4B\\x53\\x60\\x60\\x98\\xC3\\xC0\\xC0\\xC0\\x06\\xC4\\x8C\\x40\\xBC\\x51\\x96\\x81\\x81\\x09\\x48\\x07\\xA7\\x16\\x95\\x65\\x26\\xA7\\x2A\\x04\\x24\\x26\\x67\\x2B\\x18\\x32\\x94\\xF6\\xB0\\x30\\x30\\xAC\\xA8\\x72\\x63\\x00\\x01\\x11\\xA0\\x82\\x1F\\x5C\\x60\\x26\\x83\\xC7\\x4B\\x37\\x86\\x19\\xE5\\x6E\\x0C\\x39\\x95\\x6E\\x0C\\x3B\\x84\\x0F\\x33\\xAC\\xE8\\x73\\x63\\x68\\xA8\\x5E\\xCF\\x34\\x27\\x4A\\x97\\xA9\\x82\\xE3\\x30\\xC3\\x91\\x68\\x5D\\x26\\x90\\xF8\\xCE\\x97\\x53\\xCB\\x41\\x34\\x4C\\x3F\\x32\\x3D\\xE1\\xC4\\x92\\x86\\x0B\\x40\\xF5\\x60\\x0C\\x54\\x1F\\xAE\\xAF\\x5D\\x0A\\x72\\x0B\\x03\\x23\\xA3\\xDC\\x02\\x7E\\x06\\x86\\x03\\x2B\\x18\\x6D\\xC2\\x3D\\xFD\\x74\\x43\\x2C\\x43\\xFD\\x4C\\x3C\\x3C\\x3D\\x3D\\x5C\\x9D\\x19\\x88\\x00\\xE5\\x20\\x02\\x00\\x54\\xF5\\x2B\\x5C 21 | ``` 22 | 执行`vi payload.hex`,输入`:s/\\\\x//g` 删除 `\\x`,`:w`保存,此时 payload.hex 内容为 23 | ``` 24 | 4768307374AD000000E0000000789C4B53606098C3C0C0C006C48C40BC51968181094807A716956526A72A042426672B183294F6B03030ACA87263000111A0821F5C602683C74B378619E56E0C39956E0C3B840F33ACE8736368A85ECF34274A97A982E330C391685D2690F8CE9753CB41344C3F323DE1C492860B40F5600C541FAEAF5D0A720B0323A3DC027E0686032B186DC23DFD74432C43FD4C3C3C3D3D5C9D198800E520020054F52B5C 25 | ``` 26 | payload.hex文件长度346个字符+换行,共347字节。 27 | 28 | 问deepseek `如何把hex字符串转换为二进制文件`,得到回答是: 29 | 30 | ``` 31 | echo -n "48656C6C6F" | xxd -r -p > output.bin 32 | ``` 33 | 执行 `cat payload.hex | xxd -r -p > payload.bin`,得到文件payload.bin,文件大小为173字节。同时,根据回答中 34 | ``` 35 | 转换后,可以用以下方法检查文件内容: 36 | xxd output.bin # 查看十六进制转储 37 | ``` 38 | 执行命令`xxd payload.bin`,显示为 39 | ``` 40 | 00000000: 4768 3073 74ad 0000 00e0 0000 0078 9c4b Gh0st........x.K 41 | 00000010: 5360 6098 c3c0 c0c0 06c4 8c40 bc51 9681 S``........@.Q.. 42 | 00000020: 8109 4807 a716 9565 26a7 2a04 2426 672b ..H....e&.*.$&g+ 43 | 00000030: 1832 94f6 b030 30ac a872 6300 0111 a082 .2...00..rc..... 44 | 00000040: 1f5c 6026 83c7 4b37 8619 e56e 0c39 956e .\`&..K7...n.9.n 45 | 00000050: 0c3b 840f 33ac e873 6368 a85e cf34 274a .;..3..sch.^.4'J 46 | 00000060: 97a9 82e3 30c3 9168 5d26 90f8 ce97 53cb ....0..h]&....S. 47 | 00000070: 4134 4c3f 323d e1c4 9286 0b40 f560 0c54 A4L?2=.....@.`.T 48 | 00000080: 1fae af5d 0a72 0b03 23a3 dc02 7e06 8603 ...].r..#...~... 49 | 00000090: 2b18 6dc2 3dfd 7443 2c43 fd4c 3c3c 3d3d +.m.=.tC,C.L<<== 50 | 000000a0: 5c9d 1988 00e5 2002 0054 f52b 5c \..... ..T.+\ 51 | ``` 52 | 53 | 问deepseek `Gh0st`得到回答与 Gh0st RAT有关,但无直接有用信息。 54 | 55 | 在google中搜索`Gh0st RAT 数据包结构`,第一个链接`https://www.freebuf.com/articles/paper/167917.html Gh0st大灰狼RAT家族通讯协议分析`。提到Gh0st通讯实现包结构是 56 | ``` 57 | |------------|------------|-------------------|-----------------| 58 | |Magic Number|Total Length|Uncompressed Length|Compressed Data | 59 | |------------|------------|-------------------|-----------------| 60 | |5 Byte |4 Byte |4 Byte |Compressed length| 61 | |------------|------------|-------------------|-----------------| 62 | ``` 63 | 其中Magic Number是`Gh0st`,后续是4字节数据包总长度,4字节解压后的消息长度,zlib压缩后的数据。本次数据包,总长度0xad = 173, zlib解压后的数据包长度应该是0xe0 = 224。 64 | 65 | 问 deepseek `写一段程序解压zlib压缩文件`,根据回答编辑文件`decompress_zlib.py`,内容如下: 66 | 67 | ``` 68 | import zlib 69 | import sys 70 | 71 | def decompress_zlib_file(input_path, output_path): 72 | try: 73 | # 读取压缩文件的二进制内容 74 | with open(input_path, 'rb') as f_in: 75 | compressed_data = f_in.read() 76 | 77 | # 解压数据 78 | decompressed_data = zlib.decompress(compressed_data) 79 | 80 | # 保存到输出文件 81 | with open(output_path, 'wb') as f_out: 82 | f_out.write(decompressed_data) 83 | 84 | print(f"解压成功!输出文件:{output_path}") 85 | 86 | except FileNotFoundError: 87 | print(f"错误:输入文件 {input_path} 未找到!") 88 | except zlib.error as e: 89 | print(f"错误:解压失败,可能不是有效的 zlib 压缩数据。详情:{str(e)}") 90 | except Exception as e: 91 | print(f"发生未知错误:{str(e)}") 92 | 93 | if __name__ == "__main__": 94 | # 使用示例:命令行传入输入和输出文件路径 95 | if len(sys.argv) != 3: 96 | print("用法:python decompress_zlib.py <输入压缩文件> <输出解压文件>") 97 | sys.exit(1) 98 | 99 | input_file = sys.argv[1] 100 | output_file = sys.argv[2] 101 | decompress_zlib_file(input_file, output_file) 102 | ``` 103 | 104 | 将前面生成的payload.hex备份,并删除789C之前的Magic Number、Total Length、Uncompressed Length部分,保留如下从789C开始的内容: 105 | ``` 106 | 789C4B53606098C3C0C0C006C48C40BC51968181094807A716956526A72A042426672B183294F6B03030ACA87263000111A0821F5C602683C74B378619E56E0C39956E0C3B840F33ACE8736368A85ECF34274A97A982E330C391685D2690F8CE9753CB41344C3F323DE1C492860B40F5600C541FAEAF5D0A720B0323A3DC027E0686032B186DC23DFD74432C43FD4C3C3C3D3D5C9D198800E520020054F52B5C 107 | ``` 108 | 执行命令 `cat payload.hex | xxd -r -p > zlib.bin`,执行命令 `python3 decompress_zlib.py zlib.bin zlib.out.bin`,输出`解压成功!输出文件:zlib.out.bin`,输出的文件zlib.out.bin长度224字节,与数据包头处的Uncompressed Length 0xe0 = 224一致。 109 | 110 | 执行命令`xxd payload.bin`,显示为: 111 | ``` 112 | 00000000: 6620 0000 9c00 0000 0600 0000 0100 0000 f .............. 113 | 00000010: b11d 0000 0200 0000 5365 7276 6963 6520 ........Service 114 | 00000020: 5061 636b 2031 0075 8c04 0000 a87a 4600 Pack 1.u.....zF. 115 | 00000030: 0000 0000 1402 0000 f80a 0000 0000 0000 ................ 116 | 00000040: 48e9 4600 9877 4600 6c79 4600 b813 c300 H.F..wF.lyF..... 117 | 00000050: a88e 4600 807b af02 9c5a 2d02 7808 c300 ..F..{...Z-.x... 118 | 00000060: c45b 2d02 b813 c300 b9e9 9577 b813 c300 .[-........w.... 119 | 00000070: 0000 0000 1402 0000 0000 0000 1402 0000 ................ 120 | 00000080: 0000 0000 90c8 a480 d05a 2d02 d05a 2d02 .........Z-..Z-. 121 | 00000090: d05b 2d02 572f 2b75 0100 0000 0001 011e .[-.W/+u........ 122 | 000000a0: a00f 0000 c0a8 013c 5749 4e2d 5439 554e .......> /var/log/xl2tpd.log 351 | ``` 352 | vi /etc/ppp/ip-down,增加 353 | ``` 354 | echo "`date -d today +%F_%T` $PEERNAME $IPREMOTE stop" >> /var/log/xl2tpd.log 355 | ``` 356 | 357 | 3.10 修改日志保存时间 358 | 359 | vi /etc/logrotate.d/syslog 360 | 增加 361 | ``` 362 | /var/log/xl2tpd.conf 363 | ``` 364 | 365 | vi /etc/logrotate.conf 366 | 367 | ``` 368 | rotate 40 369 | ``` 370 | 371 | 372 | 重启服务器就可以工作了。 373 | 374 | 375 | ## 参考资料 376 | 377 | * https://www.wenjinyu.me/zh/centos-7-build-l2tp-vpn/ 378 | * http://www.beijinghuayu.com.cn/centos7-l2tp-freeradius/ 379 | * http://www.majinlei.com/2018/11/05/Centos7-5%E7%B3%BB%E7%BB%9F%E4%BD%BF%E7%94%A8L2TP-IPSec-%E6%90%AD%E5%BB%BA%E6%9C%8D%E5%8A%A1%E5%99%A8/ 380 | 381 | 382 | *** 383 | 欢迎 [加入我们整理资料](https://github.com/bg6cq/ITTS) 384 | -------------------------------------------------------------------------------- /other/eduroam/README.md: -------------------------------------------------------------------------------- 1 | ## [原创] centos7 eduroam freeradius 安装记录 2 | 3 | 本文原创:**中国科学技术大学 张焕杰** 4 | 5 | 修改时间:2019.04.11 6 | 7 | eduroam@CERNET http://www.eduroam.edu.cn 8 | 9 | [Protocol and Password Compatibility](http://deployingradius.com/documents/protocols/compatibility.html) 10 | 11 | eduroam是education roaming的缩写,在各个国家的教育科研网广泛采用。如果所在学校/单位已经加入eduroam,那么他们可以非常容易地在其他支持eduroam的学校/单位免费使用Internet,不受国界限制。目前eduroam已经覆盖全球100余个国家,我国也覆盖了180余所高校和50余个中国科学院研究所。 12 | 13 | 我国高校的漫游认证中心由北京大学提供,详细的漫游认证中心,请见 eduroam@CERNET http://www.eduroam.edu.cn 14 | 15 | 如果您所在的学校还未加入eduroam认证体系,您可以建议学校网络管理部门尽快加入,以便尽快享受免费服务。 16 | 17 | ## 0. 基础 18 | 19 | 1. 有用户名,明文 或 NT Hash 密码,以便radius使用 (关于NT Hash密码,请见最后) 20 | 21 | 2. 准备一个IP地址,将来用作radius服务器。 22 | 23 | ## 1. 联系eduroam认证中心 24 | 25 | CERNET用户可以联系eduroam@CERNET http://www.eduroam.edu.cn 26 | 27 | 其他用户请联系 eduroam 中国无线网漫游交换中心 http://eduroam.cstnet.cn 28 | 29 | https://analysis.eduroam.edu.cn/admin/univ/create 填写申请表,打印盖章,寄快递,等北大的老师收到快递后,开通服务。然后就可以到 https://analysis.eduroam.edu.cn 登录,并获取到相关的key. 30 | 31 | ## 2. 安装radius服务器 32 | 33 | 2.1 虚拟机安装CentOS 7 34 | 35 | 设置好主机名、IP地址等信息。 36 | 37 | 2.2 安装如下包 38 | 39 | ``` 40 | yum install -y mariadb mariadb-server freeradius-mysql freeradius freeradius-utils git 41 | ``` 42 | 43 | ## 3. 启动mysqld 44 | ``` 45 | systemctl start mariadb #启动mariadb 46 | systemctl enable mariadb 47 | ``` 48 | 49 | ## 4. 初始化git,跟踪修改 50 | ``` 51 | cd /etc/raddb 52 | git init 53 | git add * 54 | git commit -m init 55 | ``` 56 | 57 | ## 5. 创建数据库 58 | 59 | 参考 /etc/raddb/mods-config/sql/main/mysql/schema.sql setup.sql 60 | 61 | 必要时修改setup.sql中的密码 62 | 63 | ``` 64 | echo "create database radius" | mysql 65 | mysql radius < /etc/raddb/mods-config/sql/main/mysql/schema.sql 66 | mysql radius < /etc/raddb/mods-config/sql/main/mysql/setup.sql 67 | ``` 68 | 69 | ## 6. 设置包过滤规则 70 | 71 | 下面的2个IP是上游radius服务器(北大维护)IP地址。 72 | 73 | 如果自己的无线控制器AC也要连接radius服务器认证,需要把自己的无线控制器放开。 74 | 75 | ``` 76 | firewall-cmd --permanent --remove-service=ssh 77 | firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="x.x.x.0/24" service name="ssh" accept" 78 | firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="162.105.129.2" service name="radius" accept" 79 | firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="121.194.2.97" service name="radius" accept 80 | firewall-cmd --reload 81 | ``` 82 | 83 | ## 7. 修改配置 84 | 85 | 7.1 ca有关配置 86 | 87 | 生成一个有效期足够长的证书,以免使用中更换。 88 | 89 | ``` 90 | cd /etc/raddb/certs 91 | make destroycerts 92 | vi ca.cnf 93 | 94 | #修改default_days 7200 95 | #修改[certificate_authority] 96 | 97 | vi server.cnf 98 | 99 | #修改default_days 7200 100 | #修改[certificate_authority] 101 | 102 | openssl dhparam -out dh 1024 103 | make ca.pem 104 | make ca.der 105 | make server.pem 106 | 107 | chgrp radiusd * 108 | ``` 109 | 110 | 如果想查看生成的证书,可以执行 111 | ``` 112 | openssl x509 -in ca.pem -text | more 113 | openssl x509 -in server.pem -text | more 114 | ``` 115 | 116 | 7.2 clients.conf & proxy.conf 117 | 118 | /etc/raddb/clients.conf增加如下: 119 | 120 | 注意:我这里仅仅作为漫游认证,并未增加本地无线控制器的信息。正常还需要增加无线控制器的信息 121 | 122 | ``` 123 | client flr.edu.cn { 124 | ipaddr = x.x.x.x 125 | proto = * 126 | secret = yyyyyyyyyyyyyyyy 127 | require_message_authenticator = no 128 | } 129 | client backup.flr.edu.cn { 130 | ipaddr = x.x.x.x 131 | proto = * 132 | secret = yyyyyyyyyyyyyyyy 133 | require_message_authenticator = no 134 | } 135 | ``` 136 | 137 | /etc/raddb/proxy.conf 138 | ``` 139 | realm fsyy.ustc.edu.cn { 140 | } 141 | 142 | home_server flr.edu.cn { 143 | type = auth 144 | ipaddr = x.x.x.x 145 | port = 1812 146 | secret = **************** 147 | response_window = 20 148 | zombie_period = 40 149 | status_check = status-server 150 | check_interval = 120 151 | num_answers_to_alive = 3 152 | max_outstanding = 65536 153 | } 154 | 155 | home_server backup.flr.edu.cn { 156 | type = auth 157 | ipaddr = x.x.x.x 158 | port = 1812 159 | secret = **************** 160 | response_window = 20 161 | zombie_period = 40 162 | status_check = status-server 163 | check_interval = 120 164 | num_answers_to_alive = 3 165 | max_outstanding = 65536 166 | } 167 | 168 | home_server_pool edu.cn-Failover { 169 | type = fail-over 170 | home_server = flr.edu.cn 171 | home_server = backup.flr.edu.cn 172 | } 173 | 174 | realm DEFAULT { 175 | auth_pool = edu.cn-Failover 176 | nostrip 177 | } 178 | ``` 179 | 7.3 其他 180 | 181 | /etc/raddb/mods-available/sql 182 | ``` 183 | driver = "rlm_sql_mysql" 184 | 185 | dialect = "mysql" 186 | 187 | # Connection info: 188 | # 189 | server = "localhost" 190 | port = 3306 191 | login = "radius" 192 | password = "radpass" 193 | ``` 194 | /mods-config/sql/main/mysql/queries.conf 195 | ``` 196 | sql_user_name = "%{%{Stripped-User-Name}:-%{%{User-Name}:-DEFAULT}}" 197 | ``` 198 | 199 | sites-available/default 200 | 将authorize中 201 | ``` 202 | auth_log 203 | ``` 204 | 205 | accounting中 206 | ``` 207 | #unix 208 | ``` 209 | post-auth中 210 | ``` 211 | #-sql 212 | ``` 213 | 214 | 这样设置,会把关键日志记录在 /var/log/radius目录下。 215 | 216 | 如果想记录更多的日志,可以把 pre-proxy 中的pre_proxy_log和post-proxy中的post_proxy_log也打开。 217 | 218 | 以下按照上海交通大学赖学亮老师的《eduroam配置建议》 https://www.eduroam.edu.cn/info/1021/1072.htm 219 | 220 | vi /etc/raddb/sites-enabled/default 文件, pre-proxy 段落里,增加了 221 | ``` 222 | update proxy-request { 223 | Operator-Name := "1fsyy.ustc.edu.cn" 224 | } 225 | ``` 226 | 227 | vi /etc/raddb/dictionary.eduroam.local,增加如下内容: 228 | ``` 229 | VENDOR eduroam 9048 230 | BEGIN-VENDOR eduroam 231 | ATTRIBUTE Eduroam-Proxy 0 String 232 | END-VENDOR eduroam 233 | ``` 234 | 235 | vi /etc/raddb/dictionary文件里增加一行 236 | ``` 237 | $INCLUDE /etc/raddb/dictionary.eduroam.local 238 | ``` 239 | 240 | ## 8. 启用sql模块 241 | 242 | ``` 243 | cd /etc/raddb/mods-enabled 244 | ln -s ../mods-available/sql . 245 | ``` 246 | 247 | ## 9. 测试用户 248 | ``` 249 | mysql radius 250 | INSERT INTO radcheck VALUES (1,'test','Cleartext-Password',':=','test123'); 251 | ``` 252 | 建立一个用户test,密码test123 253 | 254 | ## 10. 测试 255 | 256 | 1. 在radius服务器上执行 257 | radiusd -X 258 | 259 | 2. 访问 http://eduroam.ustc.edu.cn 260 | 261 | 输入 test@fsyy.ustc.edu.cn test123 测试正常 262 | 263 | 如果测试通过,说明本地用户已经可以在其他地方登录。 264 | 265 | 测试完毕后,把修改commit到git: 266 | ``` 267 | cd /etc/raddb 268 | git add * 269 | git commit -m "now works" 270 | ``` 271 | 272 | ## 11. 加入启动过程 273 | 274 | ``` 275 | systemctl start radiusd 276 | systemctl enable radiusd 277 | ``` 278 | 默认的设置,可能因为mariadb启动有点慢,自动启动会出错,修改以下文件: 279 | ``` 280 | vi /usr/lib/systemd/system/radiusd.service 281 | After后增加 mariadb.service 282 | ``` 283 | 284 | ## 12. 本地无线网络控制器设置 285 | 286 | 12.1 修改clients.conf,增加类似如下信息 287 | 288 | 其中x.x.x.x是无线控制器IP地址,secret是密码。 289 | 290 | ``` 291 | client x.x.x.x{ 292 | secret = ***** 293 | shortname = myac 294 | } 295 | ``` 296 | 297 | 注意每次修改后,需要重启radiusd后才生效。 298 | 299 | 12.2 防火墙允许无线控制器通信 300 | 301 | ``` 302 | firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="x.x.x.x" service name="radius" accept 303 | firewall-cmd --reload 304 | ``` 305 | 306 | 12.3 无线控制器设置 307 | 308 | 这里以H3C和华为的AC为例,设置如下: 309 | 310 | H3C例子: 311 | 312 | 假定用户在vlan 196,radius服务器IP是s.s.s.s 313 | 314 | ``` 315 | dot1x authentication-method eap 316 | 317 | wlan service-template 5 318 | ssid eduroam 319 | vlan 196 320 | akm mode dot1x 321 | cipher-suite ccmp 322 | cipher-suite tkip 323 | security-ie rsn 324 | security-ie wpa 325 | client-security authentication-mode dot1x 326 | dot1x domain eduroam 327 | service-template enable 328 | # 329 | 330 | # 331 | radius scheme eduroam 332 | primary authentication s.s.s.s key cipher ************************************* 333 | primary accounting s.s.s.s key cipher ************************************* 334 | timer realtime-accounting 0 335 | # 336 | domain eduroam 337 | authentication lan-access radius-scheme eduroam 338 | authorization lan-access radius-scheme eduroam 339 | accounting lan-access radius-scheme eduroam 340 | # 341 | 342 | ``` 343 | 344 | 华为的例子: 345 | 346 | ``` 347 | authentication-profile name wlan-eduroam 348 | dot1x-access-profile wlan-eduroam 349 | access-domain default dot1x force 350 | 351 | radius-server template radius_eduroam 352 | radius-server shared-key cipher ************************************************* 353 | radius-server authentication s.s.s.s 1812 weight 80 354 | radius-server accounting s.s.s.s 1813 weight 80 355 | 356 | aaa 357 | authentication-scheme radius_eduroam 358 | authentication-mode radius 359 | 360 | domain default 361 | authentication-scheme radius_eduroam 362 | radius-server radius_eduroam 363 | 364 | wlan 365 | 366 | security-profile name eduroam 367 | security wpa2 dot1x aes-tkip 368 | 369 | ssid-profile name eduroam 370 | ssid eduroam 371 | 372 | vap-profile name eduroam 373 | forward-mode tunnel 374 | service-vlan vlan-id 191 375 | ssid-profile eduroam 376 | security-profile eduroam 377 | authentication-profile wlan-eduroam 378 | 379 | ap-group name **** 380 | radio 0 381 | vap-profile eduroam wlan 1 382 | 383 | dot1x-access-profile name wlan-eduroam 384 | ``` 385 | 386 | 387 | 12.4 测试 388 | 389 | 如果需要调试,可以停止radiusd,并用调试模式启动,查看交互信息 390 | 391 | ``` 392 | systemctl stop radiusd 393 | radiusd -X 394 | ``` 395 | 396 | ## 13. 关于密码 397 | 398 | eduroam使用EAP-MSCHAPv2认证,需要使用明文密码或NT Hash密码。 399 | 400 | 如用户test,密码test,明文密码和NT Hash密码格式如下(只要一个即可): 401 | ``` 402 | MariaDB [radius]> select * from radcheck; 403 | +----+----------+--------------------+----+----------------------------------+ 404 | | id | username | attribute | op | value | 405 | +----+----------+--------------------+----+----------------------------------+ 406 | | 1 | test | NT-Password | := | 0CB6948805F797BF2A82807973B89537 | 407 | | 2 | test | Cleartext-Password | := | test | 408 | +----+----------+--------------------+----+----------------------------------+ 409 | ``` 410 | 411 | NT Hash密码是把密码MD4hash后得到的,使用如下php片段可以生成NT Hash密码: 412 | 413 | 来自 https://www.php.net/manual/en/ref.hash.php 414 | 415 | ``` 416 | 424 | 425 | ``` 426 | *** 427 | 欢迎 [加入我们整理资料](https://github.com/bg6cq/ITTS) 428 | --------------------------------------------------------------------------------