作者归档:Ferrets

openwrt 国内镜像源

原文:https://mirrors.tuna.tsinghua.edu.cn/help/openwrt/

由于某些众所周知的原因,openwrt直接从国外源下载的时候通常都会出现缓慢,短线之类的情况。清华大学的同学十分友好地建立了软件源,如此一来,软件的安装就变得友好了很多~

原文可能是由于字符之类的原因导致命令明显的不对,稍作修正,就得到下方的命令:

cp /etc/opkg/distfeeds.conf /etc/opkg/distfeeds.conf.backup
sed -i 's/downloads.openwrt.org/mirrors.tuna.tsinghua.edu.cn\/openwrt/g' /etc/opkg/distfeeds.conf

完了之后就可以十分愉快地安装软件包了~

为RDP启用显卡加速,提升远程桌面效果

参考:https://www.orgleaf.com/3771.html

在为虚拟机添加了虚拟显卡之后,虚拟机的图形性能大大提升,但是远程桌面似乎没什么两样。稍作一番Google之后,找到打开RDP调用显卡的教程:

RDP启用显卡加速

打开电脑的组策略管理器(运行gpedit.msc

按顺序打开文件夹 “计算机配置->管理模板->Windows组件->远程桌面服务->远程桌面会话主机->远程会话环境”。在文件夹目录内能看到一个叫“将硬件图形适配器应用于所有远程桌面服务会话“的设置。从”未配置“改为”已启用“。

提升传输帧率

这一步需要修改注册表,在[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations]新增一个DWORD项,名称为“DWMFRAMEINTERVAL”,值为0000000f(16进制)或者15(10进制)。可以参照教程从regedit.exe进去一步一步添加,或者是直接用.reg修改。

.reg的内容如下:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations]
"DWMFRAMEINTERVAL"=dword:0000000f

复制内容,用笔记本文档保存为一个.reg文件,双击导入即可。

完毕后重启生效。

调整后远程桌面的效果显著提升,就算是跑点小黄油之类的也不会觉得画面卡卡的了。

为proxmox启用intel核显的虚拟化

参考:https://cetteup.com/216/how-to-use-an-intel-vgpu-for-plexs-hardware-accelerated-streaming-in-a-proxmox-vm/

家里跑着两个proxmox的虚拟化服务器,其中一个是用NUC6i5SYK跑的,有张Iris 540的核显,之前一直没用上,前阵子某天看到有视频UP主在讲Nvidia逐步支持消费级显卡的显卡虚拟化,能让虚拟机共享母机的显卡。同时提到了,Intel的显卡也有一样的功能,而且发布了挺久了,于是我稍作Google,找到教程并成功开启。

不过这个功能要求CPU是Intel酷睿5代以后的CPU或者Xeon E3 v4之后的CPU,同时,也被称为GVT-g。比起PCI直通显卡,这个功能让母机依然能够使用该核显,也能给多个虚拟机共享核显的资源,对我们这种抠抠索索的穷逼友好了不少。

在Proxmox上启用PCI直通和GVT-g

首先,命令行登陆proxmox的母机,进行下一步操作前建议先执行一次apt更新,确保系统是最新的状态。

第二步,修改/etc/default/grub文件,修改GRUB_CMDLINE_LINUX_DEFAULT的参数,在后面添加“intel_iommu=on i915.enable_gvt=1”,就像这样:

GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on i915.enable_gvt=1"

然后保存,执行update-grub以更新grub的配置。

参考中在执行update-grub之后,在这里会重启检查dmesg,个人推荐放做完全部修改之后再重启,可以少重启那么一次……

第三步,修改/etc/modules文件,插入以下内容,启用PCI直通和GVT-g

# Modules required for PCI passthrough
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd

# Modules required for Intel GVT
kvmgt
exngt
vfio-mdev

最后重启服务器,重启完毕之后,可以使用这个命令检查一下是否有输出,如果没有输出的话,可能在哪里出了问题。

dmesg | grep -e DMAR -e IOMMU

给虚拟机添加虚拟显卡

当母机支持显卡虚拟化之后,就可以给虚拟机添加虚拟显卡了,全程可以在web页面完成操作。

在虚拟机-硬件里面添加PCI设备

选择完成虚拟化的显卡

选择MDev类型,这时候有两个选择,根据原文,两个其实性能没什么差别,就是V5_8能有2个,而V5_4只能有1个……

这里要注意的是,根据参考,勾选“主GPU”的话,会使得Proxmox的console失效,这个我没验证。

完了之后重启虚拟机,然后就能在设备管理器里面看到显卡了,打上补丁之后,就能正确显示显卡型号了。

因为是Intel的显卡,用windows自带的驱动更新就可以自动下载驱动并安装了。

大功告成~

我还看到个为RDP启用显卡的教程,明天整一整。

windows无法解析域名

参考:https://answers.microsoft.com/en-us/windows/forum/windows_7-networking/windows-7-browsers-unable-to-resolve-domain-names/77e1f86d-618d-4d37-b693-8c37bed3b28d

今天不幸办公的PC炸了,不得不重置win10,在重置之后出现了一个非常诡异的问题,浪费了我一整个下午。

这个故障的特征是windows不会向DNS服务器查询域名,手动用nslookup是可以正常获取到解析结果,但是除了nslookup以外,ping之类的工具、浏览器都会直接返回一个无法解析地址的错误。在整个过程中,用wireshark抓包会发现系统根本没有向dns服务器发起解析的请求。

经过一番google(垃圾百度),找到一个问题,就在上面的参考,里面有位Lakusus的老哥给出了一个答案,就是电脑的计算机名丢了,一检查,果然如此,在重新设置上计算机名并重启就正常了。

顺便一说,我在设置的时候不能在win10的“设置”程序里面修改,只能去控制面板-系统那里修改。

希望能对某位不幸的朋友提供一些帮助。

在openwrt路由上运行shairplay作为远程音箱

参考:

  1. https://blog.csdn.net/luotong86/article/details/53207387
  2. https://zhuanlan.zhihu.com/p/103121214

因为手里空闲着一条漫步者的M16,现在我又用着iPhone,就想尝试一下airplay,没想道意外的简单,这里做个简单的记录。

首先,使用opkg更新软件包缓存

opkg update

然后,安装kmod-usb-audio:

opkg install kmod-usb-audio

这将安装usb声卡的驱动,如无意外,就可以看到/dev/audio的出现,这意味着系统能够正常识别到声卡。如果没认出来,那可能是系统尚不支持声卡,推荐换一只,毕竟重新移植驱动这种事情还是比较麻烦的,如果官方没有Linux驱动那就更没希望了。

下一步就是安装shairplay:同样非常简单,因为有对应的luci管理界面,顺便装上。

opkg install luci-app-shairplay

接着就可以去网页进行管理了:

这里只要简单的修改一下Airport Name,AO Driver选择alsa,然后勾选上enabled,保存并应用即可。

下一步就能在播放器上选择Airport后,点击播放就能听到音箱响起来啦~

建立私有docker镜像源

参考:https://linuxhint.com/setup_own_docker_image_repository/

最近非常着迷docker和kubernetes这玩意,感觉完全就是未来发展方向,于是决定好好研究一番。

有时候服务器处于内网环境,不好上网扒镜像,又或者说,由于一些众所周知的原因,从docker hub扒镜像会非常的缓慢,所以,我觉得有必要建立一个本地的docker镜像源。

建立方法

建立方法很简单,docker官方提供了一个镜像方便人们建立私有的镜像源。

根据参考文档,可以直接用一条命令来将服务跑起来,就像这样:

docker container run -d -p 5000:5000 --name registry -v<br> ~/docker/registry:/var/lib/registry registry

不过我个人推荐使用yaml文件+docker compose,方便日后维护,也习惯一下这种方式,为以后上kubernetes做准备。我就弄了一个,内容如下:

[root@docker-repo ~]# cat repo.yaml 
version: "2.4"
services:
  private_docker_repo:
    image: library/registry:latest
    ports:
      - "5000:5000"
    restart: unless-stopped
    volumes:
      - /storage:/var/lib/registry

然后,只要用

docker-compose -f repo.yaml up -d

就可以将服务跑起来了。-f参数是用来指定yaml文件,如果使用了docker-compose.yml作为文件名,可以省略掉。不过推荐自定义文件名,这样就可以将很多yaml放在同一个文件夹了。

日后如果registry镜像有更新,或者是修改什么设置,只要修改好配置文件,再pull一次和up一次即可,docker-compose会处理好更新的。

例子中,我的给机器挂了个100G的盘,挂在了/storage,到时候,数据会存在这里。

DNS修改

然后就是处理dns或者hosts,根据参考文档来看,不做也行,不过做了的话,可以少打几只字。( =ω=)

推荐做dns强制解析,那就不需要和原文一样去修改hosts。以后镜像源迁移、或者是docker母机增加减少之类的就不需要每次都处理hosts文件了。

举个例子,我修改DNS,将pdr(private docker registry)解析为镜像源服务器地址。

在docker母机上增加源

默认情况下,docker只会从docker hub拉镜像,要指定似有的源,就要修改一下配置文件。配置文件是/etc/docker/daemon.json,如果没有的话,就新建一个,添加以下内容:

{
"insecure-registries": ["pdr:5000", "192.168.11.207:5000"]
}

然后,重启docker。(对,是要重启docker的,所有容器都会重启)然后就可以在客户端使用这个似有源了。

对于在私有源上的镜像,用法和官方源差不多,只不过用户名变成了“服务器ip:端口”,于是,镜像名称格式如下:

IP:PORT/IMAGE_NAME:TAG_NAME

比如说,mariadb,在docker hub上,镜像的名称就是mariadb,或者其他用户的话就是xxx/mariadb(xxx是用户名)。但是在私有源上,就是192.168.11.207:5000/mariadb,或者在处理了dns或者hosts之后,可以用pdr:5000/mariadb。(看,可以少打很多个字!)

至此,似有镜像源搭建完成!

至于镜像源里面有什么镜像和有什么tag这个我暂时还没发现,暂时只发现在/storage/docker/registry/v2/repositories能看到有啥镜像。根据官方文档的说明:可以使用 http://服务器IP:5000/v2/_catalog 查看都有什么image。

列出镜像

做了个小脚本,放在docker-compose文件挂载的目录里面,我的是/storage,然后就可以直接列出镜像和列出指定镜像的tag了

#!/bin/bash
case $1 in
	"")
		ls -l docker/registry/v2/repositories/ | grep "drwx" | awk '{print $9}'
		;;
	*)
		ls -l docker/registry/v2/repositories/$1/_manifests/tags/ | grep "drwx" | awk '{print $9}'
		;;
esac

效果如下图

RouterOS上抵挡扫描的防火墙策略

背景

因为家里的宽带是找电信要了公网IP地址的,所以互联网可以直接访问到我作为出口的RouterOS,而众所周知,互联网上扫描机不知何几,被盯上了的话也是一件相当麻烦的事。

起因

之前在玩RouterOS上的防火墙的时候,发现有一个动作,叫做“add src to address list”,能够将包的源地址添加到某个列表中。俺寻思了一下,发现这能够很好的抵挡扫描机,思路是这样的:

防火墙策略

建立防火墙策略,指定一些经常被扫描的目的端口,然后,防火墙的动作是将包的源地址添加到一个叫做sniffer的地址列表中,设定有效时间为30天,然后,让防火墙直接丢弃来自这些地址的包,这样如果某个机器尝试扫描我的出口,触发了这个机制,那这个机器就会直接被ban掉30天。

命令行的话,添加起来是这样的:

/ip firewall filter add action=drop chain=input comment="drop sniffer" in-interface=China-Telecom src-address-list=sniffer
/ip firewall filter add action=add-src-to-address-list address-list=sniffer address-list-timeout=30d chain=input comment="mark sniffer" dst-port=22,23,876,3306,3389,137,139,445,5001,6379,27017 in-interface=China-Telecom log=yes log-prefix=sniffer protocol=tcp
/ip firewall filter add action=add-src-to-address-list address-list=sniffer address-list-timeout=30d chain=input comment="mark sniffer" dst-port=22,23,876,3306,3389,137,139,445,5001,6379,27017 in-interface=China-Telecom log=yes log-prefix=sniffer protocol=udp
/ip firewall filter add action=add-src-to-address-list address-list=sniffer address-list-timeout=30d chain=input comment="mark sniffer" dst-port=2323,5555,80,81,37215,8000,8080,8081,8291,8443,53 in-interface=China-Telecom log=yes log-prefix=sniffer protocol=tcp
/ip firewall filter add action=add-src-to-address-list address-list=sniffer address-list-timeout=30d chain=input comment="mark sniffer" dst-port=2323,5555,80,81,37215,8000,8080,8081,8291,8443 in-interface=China-Telecom log=yes log-prefix=sniffer protocol=udp
/ip firewall filter add action=drop chain=input comment="drop sniffer" in-interface=China-Telecom src-address-list=sniffer

然后放着一阵子,就会在address list里面看到大量的IP地址。

继续改进

如果想要更加全面的保护,可以选择在防火墙上添加允许一些正常的策略,比如说,允许每秒不超过20个echo-request的icmp包啊之类的,然后在防火墙的末尾,加一条策略,将其他未知的包,都当作扫描机处理,一律有杀错无放过。

但是有时候,ban了对方的ip,也就意味着无法访问对方的IP地址,因为回包会被防火墙丢弃。这时候就要额外的添加一条策略,插在丢弃sniffer的策略的前面:

action是accept就可以了。这样如果是主动对外访问的话,回的包要么是related,要么是established,这样就可以正常访问被ban掉的ip。至于说udp访问可能没有这个状态标记……先暂时忽略吧,出现问题再继续改进。

Windows Server作为Mikrotik设备管理员的3A服务器

在使用了Mikrotik的RouterOS作为出口路由使用了相当一段时间之后,我彻底成为了ROS的粉丝,现在手里有一个x86的小机和一直RB750Gr3分别在家里和出租屋做出口路由。

虽然设备不多,管理员也就我一个,根本没有3A什么的出场的机会,只不过嘛,生命在于折腾,研究研究不是也很好嘛。

安装NAPS服务器并配置

首先,安装网络访问策略服务器(NAPS),这可以用来作为Radius服务器。通过服务器管理器添加角色与功能,一路下一步,在角色一页勾选上“网络策略与访问服务”,然后继续下一步直至安装完毕为止。我因为懒得卸掉重装,后面的就没继续截图了。

安装完NPS之后,就可以开始配置。当然,首先,是添加用户组,并将用户添加到组,顺便确认一下用户的拨入属性由NAPS控制。

然后,去网络策略服务器,添加radius客户端。允许ROS使用NPS作为radius服务器。IP地址写ROS使用的源地址,机密随意只要和ROS设备上一样即可。

下一步是新建网络策略,填写策略名称之后,服务类型选择未指定。

然后下一步里面,指定匹配那个Mikrotik管理员组;这时候可以限定NAS标识符或者限定被叫站ID(前者默认是ROS的system identity,后者默认是radius客户端的IP地址)。

选择匹配策略的授权访问。至于身份验证方法,暂时知道ROS使用的mschapv2,以后会不会改就不知道了。至于约束,默认下一步。

到了配置设置的一步,把默认的两个标准删掉,手动添加Service-Type,值为Login,虽然默认的似乎也能用。

然后就是精华所在:在“供应商特定”一项里面,手动添加一个属性,属性是Vendor-Specific,添加。添加一个属性,供应商为“14988”,符合RFC规格,然后配置属性。供应商分配的属性号为3,属性格式为字符串,属性值就是用户组的名字。系统默认最高权限的组的名字是full,我这里填的就是full。

然后禁用BAP(因为感觉没什么乱用,似乎不禁用也行),下一步,完成。Windows Server这边就OK了。

配置ROS

首先,选好ROS的系统名称,保证能够匹配到NAPS上的那个过滤策略。

然后,在ROS上配置Radius客户端。Service选择login就行,address填NAPS的地址,Secret就是刚才在NAPS添加Radius客户端的机密,同时,建议指定一下源地址,特别是ROS有多个接口IP地址的时候。

下一步,在system-users中启用AAA登录,Default Group选择最低权限的一个,那就行了。

最后验证一下,大功告成!

使用ipv6连接Proxmox VE

最近家里上了电信的ipv6,计划直接用ipv6直连,管理起来就方便多了。但是发现死活连不上,ssh登上去一看,发现pveproxy只监听了ipv4,并没有监听ipv6。

经过一番Google,官方论坛上也有人有同样的问题,解决的办法就是在hosts文件中添加ipv6的部分。

在添加hosts中ipv6的部分之后,重启pverproxy服务就可以了

根据audit.log来放通SELinux的拦截

参考:https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/security-enhanced_linux/sect-security-enhanced_linux-fixing_problems-allowing_access_audit2allow

Redhat系的linux发行版,默认都打开了SELinux,总所周知,SELinux可以很好的提高系统安全性,但同时也会对系统的配置造成影响,所以,很多教程开始都会包含关闭SELinux的内容,避免出现异常。

Redhat对于配置SELinux也提供了一些很有用的帮助,比如说/var/log/audit/audit.log里面就包含了SELinux的审计日志,只要一搜denied就能看到SELinux拦截了的内容,配合audit2allow工具,就可以很方便的新增SELinux的放通策略。

下面是摘抄于参考文档中的内容:

第一步,先检查/var/log/audit/audit.log,里面包含了被SELinux拦截的内容,比如说这样内容

type=AVC msg=audit(1226270358.848:238): avc:  denied  { write } for  pid=13349 comm="certwatch" name="cache" dev=dm-0 ino=218171 scontext=system_u:system_r:certwatch_t:s0 tcontext=system_u:object_r:var_t:s0 tclass=dir

type=SYSCALL msg=audit(1226270358.848:238): arch=40000003 syscall=39 success=no exit=-13 a0=39a2bf a1=3ff a2=3a0354 a3=94703c8 items=0 ppid=13344 pid=13349 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 comm="certwatch" exe="/usr/bin/certwatch" subj=system_u:system_r:certwatch_t:s0 key=(null)

例子中一个叫做certwatch(comm="certwatch")的进程被拦截了,被禁止写操作({ write }),写的目标文件夹的带有的var_t标签(tcontext=system_u:object_r:var_t:s0)。如果仔细阅读另外一节之后发现,这个拦截不能用简单的sebool来解决,就需要使用audit2allow来根据audit的日志来生成允许策略。

第二步,用audit2allow -w -a生成一个方便人看懂的报告。audit2allow可以读取/var/audit/audit.log,需要root权限运行,-w参数代表方便阅读,-a参数表示读取所有的audit日志。结果会是类似这样的

~]# audit2allow -w -a
type=AVC msg=audit(1226270358.848:238): avc:  denied  { write } for  pid=13349 comm="certwatch" name="cache" dev=dm-0 ino=218171 scontext=system_u:system_r:certwatch_t:s0 tcontext=system_u:object_r:var_t:s0 tclass=dir
 Was caused by:
 Missing type enforcement (TE) allow rule.

 You can use audit2allow to generate a loadable module to allow this access.

第三步,执行audit2allow -a检查需要放通的权限

~]# audit2allow -a


#============= certwatch_t ==============
allow certwatch_t var_t:dir write;

原文中提到一个重要的提醒,提到,出现这种情况都算软件没配好,是应该向Redhat提交故障报告的。

第四步,用 audit2allow -a -M 生成一个可以加载的模块

~]# audit2allow -a -M mycertwatch

******************** IMPORTANT ***********************
To make this policy package active, execute:

semodule -i mycertwatch.pp

~]# ls
mycertwatch.pp  mycertwatch.te

生成模块后,用semodule加载上。原文中提到,生成的模块往往会超出实际所需的权限,建议先提交结果去  fedora-selinux-list 之类的让大家先看看有没有问题。

最后,如果出现多个denied的原因,建议用grep过滤出几个结果,分开几个模块来允许。