Servers Intranet

Servers Intranet connect all the servers together, including physics servers and virtual machines.

Network Topology

topology

The network contains three parts:

  • Physical Switch in East Library Data Center
  • Virtual Switch on vSphere host machine
  • tincVPN

tincVPN is a mesh VPN, which can be abstructed as a virtual Switch.

vm-nfs.s.ustclug.org runs a layer 2 bridge, connecting tincVPN and SRW2024(physical switch).

It is obvious that vm-nfs is a single point of failure of communicating between tinc host and vSphere virtual machine. I had tried to add another bridge node, but resulted in a broadcast storm. Maybe we can fix it by MPLS (merged in mainland kernel 4.3). But it isn't a right timing at this time.

Network information

The network contains two subnets:

  • 10.254.0.0/21
  • 10.254.10.0/24

Every server binds one and only one IP address in 10.254.0.0/21, used to communicate with each other.

10.254.10.0/24 is used for 1to1 IP mapping. At this time, it just used between linode(10.254.10.2) and blog(10.254.10.1).

Address planning

  • 10.254.0.1~ 10.254.0.254: physics server and virtual machine
  • 10.254.1.1~ 10.254.1.254: docker container
  • other address: not used yet.

PXE

LUG Intranet VPN

service: intranet.ustclug.org

server: board.s.ustclug.org

Introduction

Server intranet is a closed network, which cannot be accessed from Internet. LUGI VPN helps maintainer get access to intranet temporarily.

LUGI VPN is running in Banana Pi, the only ARM architecture device we owned. Using OpenVPN protocal, authorizing via LDAP.

Configuration

OpenVPN LDAP auth plugin config /etc/openvpn/auth-ldap.conf:

<LDAP>
    URL             ldaps://ldap.ustclug.org
    Timeout         15
    FollowReferrals yes
    TLSCACertFile   /etc/ldap/ssl/slapd-ca-cert.pem
</LDAP>

<Authorization>
    BaseDN          "ou=people,dc=lug,dc=ustc,dc=edu,dc=cn"
    SearchFilter    "(uid=%u)"
    RequireGroup    false
</Authorization>

In openvpn configuration:

...
plugin /usr/lib/openvpn/openvpn-auth-ldap.so /etc/openvpn/auth-ldap.conf

Servers intranet is a layer 2 network without default gateway. So NAT is needed:

iptables -t nat -A POSTROUTING -s 10.254.248.0/22 -d 10.254.0.0/21 -j MASQUERAD

LDAP服务使用及配置说明

LDAP是轻量目录访问协议,我们用的软件是OpenLDAP。

LDAP的配置很麻烦,所以装了一个网页前端来配置它,网页前端是gosa。

GOsa 使用

网页界面位于 ldap.ustclug.org

用你的账号登录进去之后,可以在右上角退出,右上角还有两个按钮分别是修改账号信息和修改密码。账号信息第一页大部分是没用的,只有一个登录名是有用的,这是你登录任何地方的用户名。

Users 和 Groups

Users是用来添加和配置用户信息的地方。最主要的功能位于每个User的第二页POSIX,这里可以设置用户的家目录,UID,GID,以及所属的用户组。这里需要注意的地方如下:

  • UID,GID从2000开始计数,由于gosa不能对UID自动增长,所以管理员需要人工增长,GID建议不要每人一个,我们建一个member组,给大家都加进来,这样就只需要考虑UID的增长了。
  • 建账号之前先注意一下各个服务器上有没有相同的用户名,有的话把原家目录chown到新的UID,GID,删除同名用户。

Access Control

这里可以配置gosa的编辑权限,现在这里面只有一个组,是完全权限的。另外,每个项可以设置专门针对这个项的ACL。

Sudo rules

这里配置sudo权限。这里的语法和sudoers一样(请无视System trust)。特别要说的一点是通过在System中加入主机名可以针对每个主机配置权限,这里要填的是主机名而不是域名,具体范例请看里面的lugsu wikimanager等项。

其它我没提到的项我也没搞明白怎么用。。。

gosa的配置文件在/etc/gosa/gosa.conf,它是在第一次运行gosa时候自动生成的,但在之后就只能通过手动编辑来修改。由于配置文件几乎没有文档,官方的FAQ有好多是错的,所以我基本没动:-D。

LDAP 客户端配置

Debian配置方法

软件包安装

Debian 7系统需要安装如下软件包,libnss-ldapd libpam-ldapd sudo-ldap。Debian 5 中没有 libpam-ldapd,相应的软件包叫做 libpam-ldap。

注 :更新这些软件包时,注意保留一个root终端,更新后可能需要重启daemon进程

在安装过程中会被问一些问题(不同版本的 Debian 的问题可能不同):

  • ldap 服务器地址是 ''ldap://ldap.lug.ustc.edu.cn''
  • Base DN为 ''dc=lug,dc=ustc,dc=edu,dc=cn''
    • 协议为版本3
    • 配置 libnss-ldapd 时有个选 “Name services to configure” 的,全部选

/etc/ldap/ldap.conf

编辑 /etc/ldap/ldap.conf 内容如下

BASE dc=lug,dc=ustc,dc=edu,dc=cn
URI ldaps://ldap.lug.ustc.edu.cn
TLS_CACERT /etc/ldap/ssl/slapd-ca-cert.pem
TLS_REQCERT demand
SUDOERS_BASE ou=sudoers,dc=lug,dc=ustc,dc=edu,dc=cn

为了安全性考虑,要以ldaps的方式连接ldap服务器,同时应配置好证书(/etc/ldap/ssl/slapd-ca-cert.pem,暂时需要从其它服务器下载)

/etc/sudo-ldap.conf

这个文件应该直接软链接到 /etc/ldap/ldap.conf。

/etc/nslcd.conf

注意检查一下此配置文件是否与/etc/ldap/ldap.conf下的内容相一致,如

uid nslcd
gid nslcd
uri ldaps://ldap.lug.ustc.edu.cn
base dc=lug,dc=ustc,dc=edu,dc=cn
ssl on
tls_reqcert demand
tls_cacertfile /etc/ldap/ssl/slapd-ca-cert.pem

/etc/nsswitch.conf

安装软件包时,安装脚本已经处理过该文件。检查一下内容,大致为:

passwd:         compat ldap
group:          compat ldap
shadow:         compat ldap
......
sudoers:	files ldap

注意每一项后面的“ldap”,如果没有要手动加上。不太清楚具体含义,反正给每一项都加上“ldap”是没有问题的。

此时输入getent passwd,应该可以看到比/etc/passwd更多的内容,这就说明配置正确了。如果还有问题,重启一下 nscd、nslcd 服务试试。

PAM 配置

如果 PAM 配置错误,可能导致用户无法使用 SSH 登录,甚至连 sudo 也可能挂掉。所以修改 PAM 配置时:

  1. 请做好文件备份;
  2. 请另开一个 root 终端以防万一。

对于 Debian 7,只需设置一处。为了登录时自动创建家目录,在/etc/pam.d/common-session中添加下面这句:

session     required      pam_mkhomedir.so skel=/etc/skel umask=0022

对于 Debian 5,需要手动修改 PAM 配置文件http://www.rjsystems.nl/en/2100-openldap-client.php#pamc

/etc/pam.d/common-auth:

auth	    sufficient	  pam_unix.so	     nullok_secure
auth	    sufficient	  pam_ldap.so	     use_first_pass
auth	    required	  pam_deny.so

/etc/pam.d/common-account:

account     sufficient	  pam_unix.so
account     sufficient	  pam_ldap.so
account     required	  pam_deny.so

/etc/pam.d/common-password

password    sufficient	  pam_unix.so	     nullok obscure md5
password    sufficient	  pam_ldap.so
password    required	  pam_deny.so

/etc/pam.d/common-session

session     required      pam_unix.so
session     required      pam_mkhomedir.so skel=/etc/skel umask=0022
session     optional      pam_ldap.so

CentOS配置方法

通过 yum 安装 openldap openldap-clients nss_ldap nss-pam-ldap

以 root 身份执行

authconfig --enablecache \
       --enableldap \
       --enableldapauth \
       --ldapserver="ldaps://ldap.lug.ustc.edu.cn/" \
       --ldapbasedn="dc=lug,dc=ustc,dc=edu,dc=cn" \
       --enableshadow \
       --enablemkhomedir \
       --enablelocauthorize \
       --update

注意,由于 authconfig 的 bug,上一条命令的执行环境必须是 en_US.UTF-8

Sudo 的配置是通过 sssd 实现的,参考https://access.redhat.com/site/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Deployment_Guide/sssd-ldap-sudo.html

安装 sssd libsss_sudo 将 /usr/share/doc/sssd-common-xxx/sssd-example.conf 复制到 /etc/sssd/sssd.conf 并修改权限为 600。

[zguangyu@pxe ~]$ sudo diff /usr/share/doc/sssd-common-1.14.0/sssd-example.conf /etc/sssd/sssd.conf
3c3
< services = nss, pam
---
> services = nss, pam, sudo
8c8
< ; domains = LDAP
---
> domains = LDAP
15,17c15,17
< ; [domain/LDAP]
< ; id_provider = ldap
< ; auth_provider = ldap
---
> [domain/LDAP]
> id_provider = ldap
> auth_provider = ldap
22,24c22,25
< ; ldap_schema = rfc2307
< ; ldap_uri = ldap://ldap.mydomain.org
< ; ldap_search_base = dc=mydomain,dc=org
---
> ldap_schema = rfc2307
> ldap_uri = ldaps://ldap.lug.ustc.edu.cn/
> ldap_search_base = dc=lug,dc=ustc,dc=edu,dc=cn
> ldap_sudo_search_base = ou=sudoers,dc=lug,dc=ustc,dc=edu,dc=cn
30c31
< ; cache_credentials = true
---
> cache_credentials = true

另外记得像前面在 Debian 中安装介绍到的那样修改 /etc/nsswitch.conf 以及 /etc/nslcd.conf.

NSCD 使用说明

NSCD是用于LDAP缓存的服务,目前在mirrors上的配置是保持30天。这导致的问题是每当ldap服务器上做出修改的时候需要在mirrors上执行 ((目前 mirrors 服务器暂未配置 LDAP 认证。))

nscd -i passwd
nscd -i group

参考: https://wiki.debian.org/LDAP/NSS

部署情况

目前所有服务器均已部署LDAP

已知的 GID

GID 名称 说明
2001 ldap_users 所有用户都在这个组里
1001 ssh_docker2 -
2013 ssh_bbs -
2014 ssh_linode -
2101 ssh_ldap -
2102 ssh_blog -
2103 ssh_dns -
2104 ssh_gitlab -
2105 ssh_lug -
2106 ssh_vpn -
2107 ssh_mirrors -
2108 ssh_pxe -
2109 ssh_freeshell -
2110 ssh_backup -
2112 ssh_vmnfs -
2113 ssh_homepage -
2201 sudo_ldap -
2202 sudo_blog -
2203 sudo_dns -
2204 sudo_gitlab -
2205 sudo_lug -
2206 sudo_vpn -
2207 sudo_mirrors -
2208 sudo_pxe -
2209 sudo_freeshell -
2210 sudo_backup -
2212 sudo_vmnfs -
2213 sudo_homepage -
2000 super_manager -
2999 nologin 不确定这个组有没有用
  • 从上文的规范来讲,应该从 2000 开始编号 GID,但有些组可能创建者没注意,不过后期再改就不方便了。
  • ssh_* 这些组,是在每个主机的 sshd_config 里只允许相应的组登陆。
  • sudo_* 这些组,是在 LDAP sudo rules 里允许了相应的组。

本文档原始版本复制自LUG wiki,由张光宇、崔灏、朱晟菁、左格非撰写。

SSH Certificate Authentication

discussion: SSH升级到证书登陆方案讨论

usage: SSH证书认证的使用方法

Introduction

There are two types of SSH Certificate:

  • Root certificate
  • Host certificate

Root certificate can only be used to issue a host certificate. Host certificate can be used for authentication on both server side and client side. But host certificate cannot issue a new certificate, it is the very difference from x509 certificate.

Root certificate is stored in cuihaoleo's loongson laptop. And knight42 have another backup.

issue a server certificate

copy the /etc/ssh/ssh_host_rsa_key.pub from target server. (salt is your frined)

Then, run ssh-keygen to issue a public key. For example:

ssh-keygen -s /path/to/ssh_ca -I blog -h -n blog.s.ustclug.org,blog.p.ustclug.org,10.254.0.15,202.141.176.98,202.141.160.98 ssh_host_rsa_key.pub

Then, copy the certificate file ssh_host_rsa_key-cert.pub back to target server.

At last, add the following line to /etc/ssh/sshd_config:

HostCertificate /etc/ssh/ssh_host_rsa_key-cert.pub

Certificate will take effect until ssh daemon restarted.

issue a client certificate

ssh-keygen -s /path/to/ssh_ca -I certificate_identity -n principals -O option -V validity_interval public_key_file

For example:

ssh-keygen -s /path/to/ssh_ca -I "Yifan Gao" -n yifan -V +365d yifan.pub

In general, certificate_identity is user full name, and principals is the LDAP user name. In addition, one user can own multiply principals in one certificate, like:

ssh-keygen -s /path/to/ssh_ca -I "Yifan Gao" -n yifan,root,liims -V +365d yifan.pub

It authorizes the certificate owner to login server with yifan, root and liims username.

tip: "liims" principal is used to login to library inquiring machine.

PXE

PXE

PXE

PXE

PXE

PXE

PXE

PXE

PXE

PXE

PXE

开源镜像站

历史

debian.ustc.edu.cn

2000年左右,科大校内的Debian爱好者使用自己实验室的机器为大家提供Debian镜像服务。随着一届届师兄的毕业,服务器在各实验室间接力。

2002年5月,Debian镜像站有了自己的域名debian.ustc.edu.cn,但服务器仍在实验室间辗转。

2002年6月23日,科大Debian镜像站开始提供非官方(UO)软件仓库。2004年4月23日,提供新的UO仓库。

2005年6月20日,科大LUG发起为科大Debian镜像站捐款的倡议,截至10月1日募捐活动停止,LUG共收到2922.05元捐款。10月6日新机器安装配置到位。在大家的齐心努力之下,科大Debian镜像站有了一个相对固定的“家”。

2009年底,debian.ustc落户图书馆技术部。

oss.ustc.edu.cn

2008年12月25日,科大开源软件(OSS)镜像站正式启用。其服务器由吴峰光师兄提供。Novell公司为我们提供了一块1.5T的硬盘。

2009年12月,张成师兄为OSS镜像站提供捐赠1T硬盘。

2010年6月,科大LUG使用出售版衫余下的钱为OSS镜像站添置了一块2T硬盘。

mirrors.ustc.edu.cn

2011年4月8日,科大LUG从网络中心处获得了新的服务器,并申请到了mirrors.ustc的域名。debian.ustc与oss.ustc开始向mirrors.ustc迁移。

同年4月15日,几大热门发行版镜像同步完毕。mirrors开始正式对外提供服务,同时debian.ustc与oss.ustc退出了历史舞台。

2013年1月6日,科大LUG从网络中心处获得了新的磁盘阵列,大大缓解了mirrors因磁盘空间不足而带来的压力。

2016年12月29日,科大LUG从网络中心处获得了新的服务器。解决了近一年来由于服务器和阵列老化带来的稳定性问题。

硬件配置

2016年-至今

参数 配置
CPU 双路E5-2620
Mem 256GB DDR4
Disk 6T*12(HDD), 250G*2(SSD)
Ethernet 1Gbps * 2

曙光I620-G20 导航光盘

2011年-2016年

参数 配置
CPU Intel(R) Xeon(R) CPU E5620 @ 2.40GHz
Mem 48GB
Disk LSI Logic MegaRAID SAS 8708EM2 x 2
DFT RS-3016I-S/D30 磁盘阵列
Ethernet Ethernet Intel 82574L Gigabit x 2

曙光i620r-G 用户手册

PXE

PXE

PXE

PXE

PXE

PXE

PXE

Mail List

Plugin Email Subscribers & Newsletters on servers.ustclug.org sends a mail to Google Group when a new article posted on mirrors catalogue.

The mails are sent from servers@ustclug.org, which is a member of Google Group with write permission.

Google Group: ustc-mirrors@googlegroups.com

Refer to Gitlab Wiki.

PXE

Authoritative DNS

services:

  • ns-a.ustclug.org
  • ns-b.ustclug.org

servers:

  • ns-a.s.ustclug.org
  • ns-b.s.ustclug.org

Deploy

  • Bind configuration https://git.ustclug.org/ustclug/auth-dns
  • Bind Dockerfile https://github.com/zhsj/dockerfile/tree/master/bind9

The bind configuration repository is only visible to admins since private key is included.

# copy the ssh key https://git.ustclug.org/ustclug/auth-dns/blob/master/git_pull_key
# to ~/.ssh/id_ed25519

# now get the conf
git clone git@git.ustclug.org:ustclug/auth-dns.git /var/lib/bind

# delete the ssh key
rm ~/.ssh/id_ed25519
docker run --restart=always -v /var/lib/bind/:/etc/bind \
       --net host -it -d --name=auth-dns zhusj/bind9

Update DNS Record

Just commit your change to the configuartion repository. More details can be found in the repository.

Webhook

Please add a webhook in the configuration repository, so that the DNS record can be automatically updated when we commit.

The webhook endpoint is http://<server_ip>:9000/hooks/bind, see https://git.ustclug.org/ustclug/auth-dns/settings/integrations for example.

PXE

PXE

PXE

PXE

PXE

PXE

PXE

Light Accelerator

service: light.ustclug.org

Git Repositry:

DockerHub:

mail list: 轻量级网络加速服务

server:

  • swarm.s.ustclug.org (docker container)
    • light-mysql
    • light-freeradius
    • light-server
    • light-web
  • gateway-el.s.ustclug.org (port mapping)
    • 29979 -> light-server.d.ustclug.org:29979
    • 29980 -> light-server.d.ustclug.org:29980
  • revproxy-el.s.ustclug.org (reverse proxy)
    • light.ustclug.org -> light-web.d.ustclug.org
  • docker2.s.ustclug.org

deploy

deploy script: docker-run-script/light

deploy order:

  1. mysql
  2. freeradius, light-web
  3. squid

Add new domain

git clone https://git.ustclug.org/lug-light/accelerate-list.git
cd accelerate-list
./tools/add-domain.sh accelerate.list www.example.com
git commit -v -a
git push origin master

Travis CI will update PAC files in LUG FTP automatically.

PGP Key Server

service: sks.ustclug.org

server: docker2.s.ustclug.org

Deploy

  • Dockerfile: https://github.com/zhsj/dockerfile/tree/master/sks
  • Web Front: https://git.ustclug.org/ustclug/sks-index

运行时需要将容器内的 /var/lib/sks 挂载出来,第一次运行请在 /var/lib/sks/dump/ 目录放初始数据库,网页前端相关的文件请放 /var/lib/sks/web/

服务需要暴露 11370 端口,11371 端口则请不要直接暴露。11370 端口是和别的服务器做 peer 用的。 11371 端口提供 HTTP 服务,所以请经过 Nginx 反代。同时 Nginx 通过给 11371 端口反代提供 80, 443 端口的 HTTP 服务。

可选:

docker2 上有一个 webhook 的进程(用的是 https://github.com/adnanh/webhook ),所以可以配置 Web Front 自动从 gitlab 上 pull。

相关配置:

# /srv/webhook/hooks.json
{
     "id": "sks-index",
     "execute-command": "/usr/bin/git",
     "command-working-directory": "/srv/docker/sks/web/",
     "pass-arguments-to-command": 
     [
         {
             "source": "string",
             "name": "pull"
         },
         {
             "source": "string",
             "name": "--ff-only"
         }
     ]
 }

在 gitlab 上配置 Webhook endpoint 为 http://docker2.p.ustclug.org:9000/hooks/sks-index

Maintenance

/var/lib/sks/sksconf 是 SKS 服务参数配置,/var/lib/sks/membership 是 peer 信息。这两个文件更新后需要重启 container 才能生效。

Web Front 的 Git 仓库配置了 Webhook,所以需要更新前端的话,直接 push 到 Git 仓库就可以了。

注意事项

membership 由 @zhsj 维护,任何改动请务必事先联系。

由于要和别人做 peer,所以对 sks.ustclug.org 域名的解析、docker 服务的部署有一定要求。假设 sks.ustclug.org 解析的 A 记录和 AAAA 记录 集为 SetA,那么 container 内部访问外部的出口 ip 需在 SetA 里。这是因为做 peer 的对方会把 SetA 加入访问白名单。

在容器内部,sks 进程需要知道访问者的真实 ip,因为 sks 也只会把别人的域名解析出来的 ip 加入 peer 的白名单。

外部的服务器访问 [ip for ip in SetA]:11370 至少有一个 ip 能访问通(最好是都可以)。 同时 [ip for ip in SetA]:11371 是提供 HTTP 服务的,所以所有 ip 都要能访问通。80,443 端口同 11371 端口。

PXE

LIIMS

perhaps short for Libray Independent Inquery Machine System

server: pxe.s.ustclug.org

Git Repository:

使用liimstrap在ArchLinux下进行构建,liimstrap使用 方法参考仓库中的说明。

构建后需要推送到服务器上的/nfsroot/liims下,并设置/usr的所有者为liims。 机器的默认pxe启动配置在/home/pxe/tftp/pxelinux.cfg/下

示例qemu调试方法

创建并挂载临时镜像:

dd if=/dev/zero of=liims.img bs=4k count=1200000
mkfs.ext4 liims.img
mount -o loop liims.img /mnt

假设当前路径为liimstrap,修改initcpio/mkinitcpio.conf, 去掉HOOKS中的liims_root,增加block(仅调试时需要)。 使用liimstrap制作镜像./liimstrap /mnt。完成后使用 qemu打开调试:

qemu -kernel /mnt/boot/vmlinuz-lts\
     -initrd /mnt/boot/initramfs-linux-lts.img\
     -hda liims.img\
     -netdev user,id=mynet0,net=114.214.188.0/24,dhcpstart=114.214.188.9\
     -device i82557a,netdev=mynet0\
     -append "root=/dev/sda rootflags=rw"

注:其中netdev中的ip段可以自由选取,device中的设备名通过qemu -device \?查看后选择任一网络设备即可

Telegram Web

Service:telegram.ustclug.org

Repository:github.com/ustclug/telegram-web

DockerHub:ustclug/telegram-web

Deployment:telegram-web.sh

Servers:

  • swarm.s.ustclug.org(Docker Container)
  • revproxy-el.s.ustclug.org(reverse proxy)

Blog:add-telegram-web-service

LUG FTP

service: FTP/FTPS, SFTP, HTTP, HTTPS, AFP

Git Repository: github.com/ustclug/lugftp

DockerHub: ustclug/ftp

server: docker2.s.ustclug.org

theme: h5ai

deploy: ftp.sh

USTC Life

USTC Life is a navigation page, which included useful sites in USTC.

service: ustc.life

Git Repository: github.com/ustclug/ustclife

DockerHub: ustclug/ustclife

server: docker2.s.ustclug.org

deploy: /srv/webhook/ustclife.sh

webhook from DockerHub: /srv/webhook/hooks.json

Generate 204

Service: 204.ustclug.org

Configration: GitLab/nginx-config/sites-available/204.ustclug.org

Server: revproxy-el.s.ustclug.org

Blog: add-http-204-service