月度归档:2020年02月

设置openwrt路由器的防火墙_允许从外网访问内网的ipv6服务

家用宽带目前很多都部署了IPv6,家用路由器目前Padavan/Openwrt等系统都能较好地支持了IPv6。不过要充分利用IPv6链接设备,有些坑。

动态变化的IPv6地址

首先是IPv6地址,不同设备(操作系统)获取的IPv6地址有区别,较为通用的是【无状态EUI-64地址】,操作系统通过网卡的mac地址生成一个64位固定后缀,以及路由器下发的64位前缀,合成一个固定的IPv6地址。作为服务端,【无状态EUI-64地址】是较为适合的,Linux发行版很多组件(systemd-netword,dhcpcd等)默认都采用EUI-64地址。

另外还有通过DHCPv6下发的地址,这个就不大可控,跟DHCPv6服务器和终端客户有关,特点是生成的后缀较短。

此外,家用宽带ISP提供的IPv6前缀是不定期变化的。可见要访问家庭宽带内网的设备,光是地址就存在了蛮多的变化因素。

IPv6的【隐私扩展地址】

终端设备,比如手机、工作站版本Windows等设备,则使用【隐私扩展】的方式随机生成64位后缀,这样终端的地址每次链接时候都会随机改变,访问外部资源时候可避免被追踪。

如果要连接Windows远程桌面,安装的是工作站版本,系统默认已经启用【隐私扩展】,主机地址就是随机变化的,想要连接3389就很麻烦了,不过这个特性可以关闭。服务器版本的Windows默认不启用隐私扩展,而家庭版Windows不支持远程桌面[doge]。

管理员权限的CMD下执行

  • netsh interface ipv6 set global randomizeidentifiers=disabled store=active
  • netsh interface ipv6 set global randomizeidentifiers=disabled store=persistent
  • netsh interface ipv6 set privacy state=disabled store=active
  • netsh interface ipv6 set privacy state=disabled store=persistent

IPv6防火墙ip6tables

要从外网通过IPv6访问家里路由器下的设备,最关键一点是路由器上的防火墙要允许这样的转发。

Padavan/Openwrt都是基于Linux – ip6tables的防火墙。默认情况下,ip6tables只允许了v6子网内的设备被ping,只允许特定类型的ICMPv6报文通过,其他通信报文一律丢弃了。所以虽然IPv6下每个设备都有公网地址,但是还不至于不安全到每个设备都可让人随便连。

动态匹配EUI-64后缀

考虑到前缀变化因素,要访问特定设备,就是让IPTABLES匹配特定设备的EUI-64后缀放通这个地址:

  • ip6tables -I FORWARD -d ::abcd:1234:5678:90ef/::ffff:ffff:ffff:ffff -j ACCEPT

可见iptables对v6地址的匹配掩码可以非常灵活,不像v4下只按前缀适配。坑的就是这个特征是没有文档的,目前文档中写的mask解释还是适配IPv4的内容,有人专门发邮件去netfilter列表问了才知道。IPv6地址中,双冒号::的写法代表是前/后均为0位,双冒号只能出现一次。

Openwrt中配置转发规则

Padavan中设置转发规则

其实padavan中的防火墙功能并没有配置地址匹配转发规则的功能界面,只能在自定义脚本中写原始的iptables命令。截图中使用的padavan是增加了QOS组件的老毛子版本。

padavan-ip6tables

以上。

参考文章:

现在家庭宽带的运营商,都已经提供 ipv6 了。
当你拨号上网后,运营商给你的路由器分配一个 ipv6 的同时,还会给你分配一个 ipv6 的前缀。
这样,你路由器后面的所有设备都会得到一个公网的 ipv6 地址。
但是,你会发现,内网的设备,虽然有公网ipv6地址,但无法从外网访问它们。仅能从外网ping通它们。
这是因为路由器的缺省设置。为了保护内网设备,缺省没有把内网设备暴露到公网上,仅仅允许从公网ping它们。

如果你内网有一台机器,提供了https或别的什么的服务,需要允许从公网访问它。
就需要修改路由器防火墙的设置,允许从公网访问这台机器的指定端口。

OpenWRT 的防火墙设置:

添加一个规则:

返回后,可以看到有一个”未命名的规则”,编辑它:

按需设置:

  • 内网设备的ipv6地址,
    前半部分是ipv6前缀,是运营商分配的。重拨后会变化。
    后半部分,如果不是eui64,就是随机生成的,也会变。如果是eui64,则与mac地址相关,不会变化,除非换网卡。
  • 如果整个ipv6都会变,防火墙规则就没办法写了。除非全网放行(内网目标地址掩码填::/0any)。
  • 所以配置内网设备的ipv6地址为eui64,防火墙的内网目标地址掩码填 ::xxxx:xxxx:xxxx:xxxx/::FFFF:FFFF:FFFF:FFFF, 这样就比较安全了。
    (ipv6地址掩码比v4灵活,v6可以掩前面,也可以掩后面。v4就只能掩前面)比如: 你的ipv6地址为,2408:ebcd:ebcd:ebcd:5678:5678:5678:5678
    则目标地址掩码填, 0:0:0:0:5678:5678:5678:5678/0:0:0:0:FFFF:FFFF:FFFF:FFFF
    连续的 0 简写为两个冒号,即,::5678:5678:5678:5678/::FFFF:FFFF:FFFF:FFFF
  • 设置Linux的ipv6为eui64模式,请参考:(Linux ipv6 无状态 设置为 eui64)
  • 获取本机ipv4/ipv6,更新ddns,请参考:(Linux中获取本机的最新IPv6地址_更新ddns的脚本)

—end—

linux服务器创建swap

如果你想提高你的服务器的性能,增加交换空间(内存交换)是一个强大的和相对简单的开始。

swap介绍

一旦内存快满的时候,交换空间是一个专用的服务器可以在其内存转储的内容的硬盘。要理解的真正好处,您需要熟悉处理器架构,但这里有一个简要的说明:

  • RAM处理器快速提供数据,这使得它非常有价值。
  • 一旦你的内存满是它需要删除或移动数据。
  • 删除内存的数据意味着它必须找到和检索的硬盘(缓慢)下次请求的数据。
  • 通过将数据从内存和交换空间,而不是简单地删除它从RAM,更快找到下一次的数据请求。
  • 从内存到交换空间移动数据消耗处理器资源,这样做实际上不断会降低应用程序的性能(这就是所谓的交换)。为了找到最优交换率,它需要调优。

最后———虽然差异是分钟,为了清楚起见,本文将指导您通过创建一个交换文件——不是一个交换分区。如果你不知道这意味着什么,别担心。

检查当前使用交换空间

防止添加交换时有任何问题,首先检查你的系统没有启用已经交换空间。

找到任何交换空间驱动:

sudo swapon -s

如果结果是空的,输出类似于下面的例子,你目前没有交换空间启用:

Filename                Type        Size    Used    Priority

如果您的系统是否已经配置了交换,结果看起来像这个例子:

Filename           Type         Size      Used  Priority
/dev/sda7          partition    123450    100   -1

检查你的可用空间

现在,您已经准备好创建一个交换文件,你需要找到你的服务器的硬盘空间。

检查服务器上的可用空间量:

df -h

这个命令显示了硬盘上的自由空间。在接下来的例子中,你有40 GB可用。确保有足够的自由空间交换文件。取决于你的需求所需要的空间,但一般来说,相当于系统RAM的二倍。

Filesystem      Size  Used Avail Use% Mounted on    
/dev/vda         50G  10G   40G   20% /             
none            4.0K     0  4.0K   0% /sys/fs/cgroup  
udev            2.0G   12K  2.0G   1% /dev           
tmpfs           396M  312K  396M   1% /run    
none            5.0M     0  5.0M   0% /run/lock  
none            2.0G     0  2.0G   0% /run/shm  
none            100M     0  100M   0% /run/user      

创建一个交换文件

将交换空间添加到系统通过创建一个名为swapfile的文件在你的根目录(/)和分配它作为交换。有两个命令,您可以使用它来创建交换文件:

  • fallocate
  • dd

你只需要使用其中的一个。我们建议使用fallocate,但如果它不支持的文件系统上,您可以使用dd。

你可以获得更多的文件空间使用fallocate,fallocate是一个用于操作文件空间的命令。fallocate命令创建了一个预先分配大小并且没有初始化的文件,与dd命令相比,它需要更长的时间,因为它必须写入0作为虚拟内容。

使用fallocate创建一个交换文件

创建用于交换的文件。对于这个示例,我们添加一个4 GB的文件:

#4G
sudo fallocate -l 4G /swapfile

#1G
sudo fallocate -l 1G /swapfile

#512MB
sudo fallocate -l 512M /swapfile

确认正确的数量的空间被保留:

#确认
ls -lh /swapfile

这个结果表明,添加文件是使用正确的留出的空间量:

-rw------- 1 root root 4.0G Jul 08 10:52 /swapfile

如果你得到一个失败消息说fallocate失败:操作不支持,您的文件系统目前不支持fallocate(例如,ext3)。使用更传统的方式使用dd命令。(这种情况应该很少)。

使用dd创建一个交换文件

在这个例子中,我们将添加一个不同大小的交换文件,1 GB,为了适应小型服务器。

添加1 GB交换文件,通过指定一个块大小250MB并且数量为4。

记得要仔细检查你的指令!这个命令有可能破坏数据如果(输出文件)指出错误的位置。

#1G
sudo dd if=/dev/zero of=/swapfile bs=1M count=1024

#512M
sudo dd if=/dev/zero of=/swapfile bs=1M count=512

几秒钟后,生成的输出是这样的:

4+0 records in
4+0 records out 
1048576000 bytes (1.0 GB) copied, 1.47414 s, 711 MB/s

验证文件在服务器上创建:

ls -lh /swapfile

如果文件被创建,命令返回类似于:

-rw-r--r-- 1 root root 1.0G Jul 08 10:30 swapfile

使交换文件

现在创建的文件,格式互换,然后启用它。

锁定交换文件的权限,因此只有root用户可以访问它:

#权限
sudo chmod 600 /swapfile

当第一次创建时,交换文件是可读的,所以锁权限可以防止用户阅读潜在的敏感信息。

确认文件正确的权限:

ls -lh /swapfile

这个命令返回类似于:

-rw------- 1 root root 4.0G Jul 08 10:40 /swapfile

这证实了,只有root用户启用了读写权限。

格式文件创建一个交换空间:

#创建
sudo mkswap /swapfile

如果成功,该命令会返回类似这样:

Setting up swapspace version 1, size = 4194300 KiB 
no label, UUID=e2f1e9cf-c0a9-4ed4-b8ab-714b8a7d6944

挂载/启用系统中的交换空间:

#挂载
sudo swapon /swapfile

验证交换空间是通过检查系统报告:

#验证
sudo swapon -s

这个命令返回类似于:

Filename Type Size Used Priority 
swapfile file 4194300 0 -1

使交换文件永久生效

最后一步是将交换文件集成到您的系统的存储分区,通过fstab

打开fstab

#写入
sudo vim /etc/fstab

在fstab文件最后,添加这一行告诉系统自动使用新创建的交换空间:

#增加这一行
/swapfile none swap sw 0 0

保存并关闭该文件:

:wq!

在下次重新启动后,自动交换使用

调整交换文件

现在您已经创建了交换文件,你应该进行调优,以确保它给你最佳性能。这不是你可以轻松地一口气就完成的工作,而是你会定期的作为管理员工作。

优化你的交换文件意味着修补的设置,使其执行交换(也就是说,将内容从RAM交换):

  • 虚拟运存控制
  • 缓存压力
    调优是很重要的,因为一个配置不佳的交换文件会损害应用程序的性能。系统的RAM和交换空间之间的相互作用是时间密集的(在计算规模上),并且尝试交换频率太高(即交换冲突)可能需要更多的时间,而不仅仅是从硬盘中恢复数据。

虚拟运存控制

Swappiness只是设置控制频率使用交换文件。

一个0到100之间的比例,swappiness值:

  • 0意味着避免交换过程的物理内存,直到绝对必要的(内存耗尽)
  • 100意味着积极(立刻)移动交换过程的物理内存和交换缓存

你可以改变你的服务器的swapinesssysctl.conf文件中。

打开/etc/sysctl.conf:

sudo vim /etc/sysctl.conf

在文件的最后一行添加:

vm.swappiness=10

保存并且退出:

:wq!

来优化您的应用程序中,您可以测试更改swappiness值(0到100之间)和运行性能测试。

缓存压力

另一个设置是vfs_cache_pressure。 当VFS(虚拟文件系统)缓存对象(称为dentry和inode_cache对象)占用更大量的内存而不是其他数据(如页面缓存和交换)时,更改此设置可能会有所帮助。 因为VFS缓存访问有关文件系统的数据,所以经常被请求并且非常耗资源。 因此,它是您的系统缓存的主要设置。

vfs_cache_pressure的值越高,您的服务器越有可能使用其交换。

你可以改变你的服务器的缓存压力在sysctl.conf

打开/etc/sysctl.conf:

sudo vim /etc/sysctl.conf

在文件最后一行添加:

vm.vfs_cache_pressure = 50

保存并关闭文件:

:wq!

swappiness,你可以提高性能通过测试不同的值。

启用交换空间

使用以下三个命令检查您的工作:

swapon -s命令:

sudo swapon -s

输出可能如下所示:

Filename                Type        Size    Used    Priority 
/swapfile               file        4194300 0       -1

您会看到添加了4 G的交换文件。

有关更详细的报告:

free -m

关于交换详细信息的报告:

cat /proc/meminfo | grep -i swap

结论

交换可以有利于允许您的系统利用比原来可用的更多的内存。 在优化应用程序配置,添加更多RAM或升级服务器之前,这是一个可行的选择。

但是,请务必记住定期调整交换文件,以确保您最充分地使用它。

树莓派3B主板接口定义

查看树莓派版本

树莓派3B主板接口定义

安装软件的时候想查看树莓派系统是32位还是64位就出现了以下的操作

具体命令及作用如下:

#Raspberry Pi 树莓派查看CPU温度
#
/opt/vc/bin/vcgencmd measure_temp
#temp=51.5'C
cat /sys/class/thermal/thermal_zone0/temp
#50464, 除以1000,单位是℃。
#
#
getconf LONG_BIT        # 查看系统位数
uname -a            # kernel 版本
/opt/vc/bin/vcgencmd  version   # firmware版本
strings /boot/start.elf  |  grep VC_BUILD_ID    # firmware版本
cat /proc/version       # kernel
cat /etc/os-release     # OS版本资讯
cat /etc/issue          # Linux distro 版本
cat /etc/debian_version     # Debian版本编号

虽然树莓派3b的硬件支持64位的系统,但是官方的系统还是32位的,主要应该是为了兼容之前的硬件

通过树莓派的硬件版本号和型号,我们可以确定树莓派是几代产品,还可以确定它是在哪里生产的等信息。目前树莓派的版本有:

型号及 PCB 批次内存cpuinfo中的硬件编号
Model B Rev 1256MB0002
Model B Rev 1
ECN0001 (no fuses, D14 removed)
256MB0003
Model B Rev 2256MB0004
0005
0006
Model A256MB0007
0008
0009
Model B Rev 2512MB000d
000e
000f
Model B+512MB0010
0013
900032
Compute Module512MB0011
Compute Module512MB0014 (Embest, China)
Model A+256MB0012
Model A+256MB0015 (Embest, China)
Model A+512MB0015 (Embest, China)
Pi 2 Model B v1.11GBa01041 (Sony, UK)
Pi 2 Model B v1.11GBa21041 (Embest, China)
Pi 2 Model B v1.21GBa22042
Pi Zero v1.2512MB900092
Pi Zero v1.3512MB900093
Pi Zero W512MB9000C1
Pi 3 Model B1GBa02082 (Sony, UK)
Pi 3 Model B1GBa22082 (Embest, China)
Pi 3 Model B+1GBa020d3 (Sony, UK)

该表不是固定的,随着树莓派版本的不断更新,该表可能未包含全部产品。

查找树莓派硬件版本号的方法

要查找出树莓派的硬件版本号,可以使用两种方法:

方法1 – Pinout应用程序

在新版本的Raspbian系统中添加了查看pinout的命令。它可以通过命令提示符或通过命令终端窗口运行: pinout , 输出如下图 :

Raspbian系统 pinout输出

Raspbian系统 pinout输出

该方法还能查看其他信息,比如在树莓派上的各个GPIO针的GPIO编号位置和所板载的RAM数量。

方法2 – cpuinfo文件

比较通用的查找树莓派硬件修订号的方法,是在命令提示符下或通命令过终端窗口运行以下命令读取“cpuinfo”文件: cat /proc/cpuinfo 。命令执行后将输出一段文本,如下显示:

Processor       : ARMv6-compatible processor rev 7 (v6l)
BogoMIPS        : 847.05
Features        : swp half thumb fastmult vfp edsp java tls
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x0
CPU part        : 0xb76
CPU revision    : 7
Hardware        : BCM2708
Revision        : 0002
Serial          : 000000000abc0ab1

在这个文本中,可以看到该开发板是一个修订代码为0002的PCB,对比前面的表判断这是一个旧的“ Model B Rev 1 ”树莓派开发板。

确定树莓派的型号

在新版本的Raspbian系统中,可以通过以下方式检查树莓派的型号:

#
#
 cat /proc/device-tree/model

输出结果如下(型号不同结果也有不同),如:

Raspberry Pi 3 Model B Plus Rev 1.3

利用openwrt路由器屏蔽小米电视广告

小米电视便宜是便宜,就是开机广告很是烦人,我们可以利用路由器的黑名单功能屏蔽小米电视广告推送域名,由此屏蔽开机广告,我使用的是自己刷了openwrt的路由器,操作起来稍微复杂一些。

准备工具

需要使用putty或者其他能够使用ssh连接openwrt的工具,我使用的是windows 10的Linux子系统(似乎我使用的windows10版本的命令提示符也可以是用ssh工具,可以尝试)

操作过程

(一)使用windows10自带的命令提示符输入以下命令

ssh root@192.168.1.1

输入密码登录

《利用openwrt路由器屏蔽小米电视广告》

在/etc/目录下新建一个文件“myhosts”

vi /etc/myhosts

输入上述命令回车后会进入vi编辑器,然后输入“i”进入编辑模式

复制以下内容,到vi编辑器里点击鼠标右键粘贴

127.0.0.1 ad.mi.com
127.0.0.1 api.ad.xiaomi.com
127.0.0.1 t7z.cupid.ptqy.gitv.tv
127.0.0.1 stat.pandora.xiaomi.com
127.0.0.1 upgrade.mishop.pandora.xiaomi.com
127.0.0.1 logonext.tv.kuyun.com
127.0.0.1 config.kuyun.com
127.0.0.1 api.io.mi.com
127.0.0.1 mishop.pandora.xiaomi.com
127.0.0.1 dvb.pandora.xiaomi.com
127.0.0.1 de.pandora.xiaomi.com
127.0.0.1 data.mistat.xiaomi.com
127.0.0.1 jellyfish.pandora.xiaomi.com
127.0.0.1 gallery.pandora.xiaomi.com
127.0.0.1 o2o.api.xiaomi.com
127.0.0.1 bss.pandora.xiaomi.com
127.0.0.1 gvod.aiseejapp.atianqi.com
127.0.0.1 sdkconfig.ad.xiaomi.com
127.0.0.1 staging.ai.api.xiaomi.com
127.0.0.1 b.netcheck.gallery.pandora.xiaomi.com
127.0.0.1 f1.market.xiaomi.com
127.0.0.1 f2.market.xiaomi.com
127.0.0.1 f3.market.xiaomi.com
127.0.0.1 f4.market.xiaomi.com
127.0.0.1 f5.market.xiaomi.com
127.0.0.1 ad.doubleclick.net
127.0.0.1 v.admaster.com.cn
127.0.0.1 f1.market.mi-img.com
127.0.0.1 f2.market.mi-img.com
127.0.0.1 f3.market.mi-img.com
127.0.0.1 f4.market.mi-img.com
127.0.0.1 f5.market.mi-img.com
127.0.0.1 g.dtv.cn.miaozhan.com
127.0.0.1 new.api.ad.xiaomi.com
127.0.0.1 o2o.api.xiaomi.com

按下键盘 的“Esc”键,再输入“:wq”回车保存退出

(二)使用浏览器登录进入openwrt,并转到“网络”-“DHCP/DNS”

《利用openwrt路由器屏蔽小米电视广告》

转到“HOSTS和解析文件”,检查“额外的HOSTS文件”部分是否包含“/etc/hosts”,没有就自己输入。

《利用openwrt路由器屏蔽小米电视广告》

(三)进入小米电视使用电视管家清除所有缓存文件,重启小米电视就应该没有广告了。

R7800 openwrt安装 阿里云DDNS

固件下载

https://openwrt.org/toh/netgear/r7800

更改来源

http://mirrors.ustc.edu.cn/lede/releases/

ssh连接

opkg install luci-i18n-base-zh-cn luci-i18n-firewall-zh-cn luci-i18n-upnp-zh-cn luci-app-upnp luci-i18n-ddns-zh-cn luci-app-ddns luci-app-nlbwmon luci-i18n-nlbwmon-zh-cn wpad ddns-scripts_cloudflare.com-v4 vsftpd openssh-sftp-server luci-app-wifischedule luci-i18n-wifischedule-zh-cn luci-app-mwan3 luci-i18n-mwan3-zh-cn wget libpcre
/etc/init.d/vsftpd enable
/etc/init.d/vsftpd start

下载阿里云DDNS

https://github.com/sensec/ddns-scripts_aliyun

https://www.right.com.cn/forum/thread-267501-1-1.html

负载均衡关闭IPv6

请把这个文件/lib/mwan3/mwan3.sh
中的
改成

#IPT6="/usr/sbin/ip6tables -t mangle -w"
IPT6="/bin/true"

ipv6不再受负载均衡限制了。一切正常了。

/usr/share/miniupnpd/firewall.include

#IP6TABLES=/usr/sbin/ip6tables
IP6TABLES=/bin/true

CentOS 安装Wireguard

2017年,新一代VPN技术wireguard诞生。wireguard基于linux kernel内核运行,效率极高,速度很快,而且支持设备IP地址漫游功能,不仅适合服务器之间的互联,还适合在NAT环境下使用,包括家中的智能路由器,配合openwrt等路由器,可安装wireguard,实现路由器绑定wireguard代理功能。

其实我已经用Wireguard 很久了,但是一直没有时间去写如何配置,抽空写一篇博客来证明一下我自己还没死(

1. Wireguard 服务器配置

我用的是CentOS 7 64bit系统,而内核我使用的是 Linux 4.11.2-1.el7.elrepo 这个版本,因为这个版本是支持lotServer的,如果没有lotServer的授权,你也可以用nanqinglang 魔改版BBR。

首先先更新系统内核,我们执行以下命令

sudo yum update -y 

设置 grub 来使使用新内核默认启动

sudo grub2-set-default 0
sudo grub2-mkconfig

启动完毕后我们加入 Wireguard 的 yum 源

sudo curl -Lo /etc/yum.repos.d/wireguard.repo https://copr.fedorainfracloud.org/coprs/jdoss/wireguard/repo/epel-7/jdoss-wireguard-epel-7.repo
sudo yum install epel-release -y
sudo yum install wireguard-dkms wireguard-tools -y

记得开启IPv4的转发

echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p

随后,使用命令创建Publickey和PrivateKey

mkdir /etc/wireguard
cd /etc/wireguard
wg genkey | tee privatekey | wg pubkey > publickey
chmod 777 -R /etc/wireguard
vim /etc/wireguard/wg0.conf

服务器端需要以下内容

[Interface]
Address = 10.0.0.1/24
ListenPort = 56660
PrivateKey = <Private Key>
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
SaveConfig = true

PrivateKey则是你刚生成的PrivateKey,需要填入进去。PostUP和PostDown是开启和关闭时分别执行的命令,你需要根据需求自行修改。

创建服务器端的自动启动

systemctl enable wg-quick@wg0

启动服务器端

wg-quick up wg0
wg-quick down wg0 && wg-quick up wg0 

至此,服务器端已经配置完毕,我们需要配置客户端

2.客户端配置

安装过程与服务器一直,但是配置文件是不一样的,具体的需要看你的需求。

假设我们需要将两台服务器互联,以便访问其内网中设备。我们的配置将如下:

[Interface]
Address = 10.0.0.2/24
ListenPort = 56660
PrivateKey = <Private Key>
PostUp = bash /etc/route-add 
PostDown = bash /etc/route-del
SaveConfig = true
 
[Peer]
PublicKey = <服务器端的Public Key>
AllowedIPs = 10.0.0.1/32
Endpoint = 服务器端的公网IP:56660

然后,这边需要注意的是AllowedIPs  如果你写了0.0.0.0/0,你可能会被全部reroute,从而导致连不上服务器。因此我这边推荐你设置为两边的IP先测试完毕再调全局。

随后一样的,启动wireguard。

在服务器端设置以下内容

wg set wg0 peer <客户端的Public Key> allowed-ips 10.0.0.1/32

然后你会发现两个内网IP可以互通,

ping -c 10 10.0.0.1
PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=28.5 ms
64 bytes from 10.0.0.1: icmp_seq=2 ttl=64 time=28.4 ms
64 bytes from 10.0.0.1: icmp_seq=3 ttl=64 time=28.5 ms
64 bytes from 10.0.0.1: icmp_seq=4 ttl=64 time=28.5 ms
64 bytes from 10.0.0.1: icmp_seq=5 ttl=64 time=28.5 ms
64 bytes from 10.0.0.1: icmp_seq=6 ttl=64 time=28.3 ms
64 bytes from 10.0.0.1: icmp_seq=7 ttl=64 time=28.6 ms
64 bytes from 10.0.0.1: icmp_seq=8 ttl=64 time=28.6 ms
64 bytes from 10.0.0.1: icmp_seq=9 ttl=64 time=28.3 ms
64 bytes from 10.0.0.1: icmp_seq=10 ttl=64 time=28.5 ms

--- 10.0.0.1 ping statistics ---
10 packets transmitted, 10 received, 0% packet loss, time 9012ms
rtt min/avg/max/mdev = 28.360/28.522/28.688/0.207 ms

那么,我们的wireguard就算是通了,现在要仔细来调整这个路由让他来符合我们的需求。

就拿刚刚所说,如果是为了访问互相的内网,你需要把内网IP加入到 AllowedIPs  里面,用逗号区分。

比如说如下

[Interface]
Address = 10.0.0.2/24
ListenPort = 56660
PrivateKey = <Private Key>
PostUp = bash /etc/route-add 
PostDown = bash /etc/route-del
SaveConfig = true
 
[Peer]
PublicKey = <服务器端的Public Key>
AllowedIPs = 10.0.0.1/32, 192.168.0.0/16
Endpoint = 服务器端的公网IP:56660

在你启动wireguard后,你能访问到服务器端的192.168.0.0/16这个段,哦当然,这种可以认为是对等互联,所以不存在服务器或者客户端这种说法。

而另外一种做法,是在路由器上部署的,实现翻墙功能,这种配置应该是这么写的

[Interface]
Address = 10.0.0.2/24
ListenPort = 56660
PrivateKey = <Private Key>
PostUp = bash /etc/route-add 
PostDown = bash /etc/route-del
SaveConfig = true
 
[Peer]
PublicKey = <服务器端的Public Key>
AllowedIPs = 0.0.0.0/0
Endpoint = 服务器端的公网IP:56660
PersistentKeepalive = 25

另外一点,你需要编辑一下 /etc/route-add 来确保你的服务器IP不走wireguard,否则可能会连不上。

启动后,默认会将你所有流量都通过wg0这个接口到你的服务器上,实现科学上网。

2.用 wg-quick 调用 wg0.conf 管理 WireGuard

可以把 WireGuard 的配置保存在一个配置文件中(见 1.用 Linode 主机搭建 WireGuard 网络 ),启动虚拟网卡时直接调用。配置文件可以起任何文件名,扩展名必须为 .conf ,默认存储在 /etc/wireguard/ 目录,也可以存储到其它系统默认的查找路径中,以下假设使用的配置文件为 wg0.conf 。

1. wg0.conf 参数

配置文件分两部分,一个是 [Interface] 部分,用于设置本机的参数;一个是 [Peer] 部分,用于设置连接到本机的其它电脑的参数,[Peer] 部分可以包含多个节点。

[Interface]
Address =  
ListenPort =  
PrivateKey =  
DNS =  

[Peer]
AllowedIPs =  
Endpoint =  
PublicKey =  
PersistentKeepalive =  

1.1 [Interface] 部分介绍

  1. Address:设置虚拟网卡的内网地址(可选子网掩码),填写规则:
    • 可以填写任何符合规范(内网地址可选范围见链接 1,2)的内网地址,但要保证不与虚拟局域网内其它电脑的内网地址相同;
    • 可以写两行;(可选)可以写成自己的IPV6地址: Address = fd86:ea04:1115::1/64 。
  2. ListenPort:设置 udp 监听端口,可选范围为 49152 到 65535 。
  3. PrivateKey:填写本机的私钥,默认存储在本机的 /etc/wireguard/private.key 文本中。
  4. PostUp:wg-quick up wg0 启动后执行的内核防火墙( iptables )规则,可以打通 VPN ,服务器端需此参数。
  5. PostDown:wg-quick down wg0 执行删除启动时定义的内核防火墙( iptables )规则 ,服务器端需此参数。
  6. DNS ,设置 DNS ,不正确设置客户端浏览器网页会无法访问外网地址。
  7. SaveConfig:设为 true 之后,每次重启服务(stop service时)都会自动保存 config 。
  8. MTU:一般不用改,1500没问题

1.2 [Peer] 部分介绍

  1. PublicKey :连接来节点的公钥,默认存储在其它电脑的 /etc/wireguard/public.key 文本中。
  2. AllowedIPs:允许连接的内网 ip 地址。
    • 服务器与客户端应该在同一网段,如客户端的IP为 10.0.2.1/24 ,那么这里可以设置为 10.0.2.0/24 ;
    • 可以写多个,用逗号隔开。
    • 如果写为 0.0.0.0/0 表示允许任何节点连接。
  3. Endpoint :节点的外网 IP 及端口号,服务器端不需要填写。
  4. PersistentKeepalive:用来保持连接检查的,每过25s会自动检查连通性,如果IP有变化,也是通过这个自动更新endpoint。

2. 服务器配置实例

以下是一对实际可用的服务器及本地机配置文件。

文件位置:服务器 /etc/wireguard/wg0.conf

[Interface]
Address = 10.0.0.1
ListenPort = 39814
PrivateKey = UA0je5EciV9i2+dSbf5mWAvRkUDVLxE/4ijMb1VnWWw=
DNS = 8.8.8.8
PostUp   = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

[peer]
AllowedIPs = 10.0.0.2 
PublicKey = odnA2mMWrxRuKydr61bOL3xyGcKiD0KY7O33X8Rm4Hg= 

注:服务器端必须填写路由规则,也就是 PostUp 、PostDown ;如果执行 ifconfig 显示服务器的网卡设备名称不是 eth0 而是别的名称 ,需要把 PostUp 与 PostDown 参数中的 eth0 改为你设备的名称。

3. 本地机可用配置

文件位置:本地机 /etc/wireguard/wg0.conf

[Interface]
Address = 10.0.0.2
ListenPort = 39815
PrivateKey = +JzG3eOIR0gNPzU3IDIDSR0sYgHKGH3Otr4ronpAVHw=
DNS = 8.8.8.8

[Peer]
AllowedIPs = 0.0.0.0/0
Endpoint = 139.162.88.79:39814
PublicKey = hIGcDUcR1Ob+GyLKQ9NJhx4qjWmXpOcKURXWkMDYKjc=
PersistentKeepalive = 25

4. 虚拟网络的启动与关闭

启动虚拟网络执行 wg-quick up wg0 ,正确执行后显示如下:

[#] ip link add wg1 type wireguard
[#] wg setconf wg1 /dev/fd/63
[#] ip address add 10.0.0.2 dev wg1
[#] ip link set mtu 1420 dev wg1
[#] ip link set wg1 up
[#] resolvconf -a tun.wg1 -m 0 -x
[#] wg set wg1 fwmark 51820
[#] ip -4 route add 0.0.0.0/0 dev wg1 table 51820
[#] ip -4 rule add not fwmark 51820 table 51820
[#] ip -4 rule add table main suppress_prefixlength 0

关闭虚拟网络执行 wg-quick down wg0 ,正确执行后显示如下:

[#] ip -4 rule delete table 51820
[#] ip -4 rule delete table main suppress_prefixlength 0
[#] ip link delete dev wg1
[#] resolvconf -d tun.wg1

5. 参考链接

https://github.com/wgredlong/WireGuard

参考 https://www.wireguard.com/install/
参考 https://kotori.net/2018/10/21/centos-安装最新版的wireguard/

关于Nginx反向代理DDNS的DNS缓存问题

在使用nginx做反向代理的,将请求发送到一个动态DDNS域名的时候,该动态DDNS域名对应的IP是A ,刚开始运行一切正常,但是当运行了一段时间以后,该动态DDNS域名对应的IP变了之后(例如对应的IP由A变为B),nginx的转发仍然还在向原先的IP A发送请求,导致反向代理中断,此时reload nginx后才会重新恢复正常,且日志显示数据转发到新的IP B了,请问如何让nginx自动去重新解析域名,而不用每次出现问题了人工去reload?

造成这个问题的主要原因是,在Nginx启动的时候会做域名解析,然后把IP缓存起来以后会一直使用解析到的IP并且不会再更改,除非重新启动Nginx,Nginx才会重新解析域名。

第一种解决方案,利用nginx的resolver

1、默认nginx会通过操作系统设置的DNS服务器(/etc/resolv.conf)去解析域名

2、其实nginx还可以通过自身设置DNS服务器,而不用去找操作系统的DNS

3、下面来讲一个这个resolver示例配置如下:

server {
listen 8080;
server_name localhost;
resolver 114.114.114.114 223.5.5.5 valid=3600s;
resolver_timeout 3s;
location / {
proxy_pass http://mydomain.com;
}
}

参数说明:

# resolver 可以在http全局设定,也可在server里面设定
# resolver 后面指定DNS服务器,可以指定多个,空格隔开
# valid设置DNS缓存失效时间,自己根据情况判断,建议600以上
# resolver_timeout 指定解析域名时,DNS服务器的超时时间,建议3秒左右

#注意:当resolver 后面跟多个DNS服务器时,一定要保证这些DNS服务器都是有效的,因为这种是负载均衡模式的,当DNS记录失效了(超过valid时间),首先由第一个DNS服务器(114.114.114.114)去解析,下一次继续失效时由第二个DNS服务器(223.5.5.5)去解析,亲自测试的,如有任何一个DNS服务器是坏的,那么这一次的解析会一直持续到resolver_timeout ,然后解析失败,且日志报错解析不了域名,通过页面抛出502错误。

第二种解决方法——最佳解决方案是升级到tengine 2.1.2,淘宝出品的东西,已经自带了解决方案。

Tengine的模块ngx_http_upstream_dynamic_module,此模块提供了在运行时动态解析upstream中server域名的功能。

upstream backend {
dynamic_resolve fallback=stale fail_timeout=30s;
server a.com;
server b.com;
}

server {

location / {
proxy_pass http://backend;
}
}

(一)upstream的用法
1、upstream

作用:是用来定义服务器组的模块

使用范围:proxy_pass、fastcgi_pass、memcached_pass

结构:

upstream groupName {    server serverName1 [param1=value1] [param2=value2] [param3];    server serverName2;}

groupName即为组名,是自定义的,如:upstream webserver;

2、server

upstream中的server用来指定一个服务器。

server的类型可以是:

  • (1)域名:如:webserver.website.com;
  • (2)IP:如:192.168.0.239:80;
  • (3)Unix套接字文件:如unix:/tmp/webserver;

例如:

upstream webserver {     server httpweb.withec.com;     server 192.168.18.201 weight=5 max_fails=3 fail_timeout=20s;     server 192.168.18.202 backup;     server 192.168.18.293 down;     server unix:/tmp/httpdweb;}

server中可用的参数:

  • (1)weight:表示权重,权重越大,表示被访问的概率越大

用法:weight=数字;

server 192.168.18.201 weight=4;
  • (2)max_fails:表示连接失败重新连接的最多次数

用法:max_fails=3;

如:

server 192.168.18.202 max_fails=3;
  • (3)fail_timeout:连接超时的时间(即多久算连接失败)

用法:fail_timeout=时间;

如:20秒就算连接失败

server 192.168.18.202 max_fails=3 fail_timeout=20s;
  • (4)backup:标记一台服务器作为备用服务器(它只在其他服务器繁忙的时候工作)

用法:server serverName backup;

如:

server 192.168.18.203 backup;
  • (5)down:标记一台服务器下线或者暂时不可用

用法:server serverName down;

如:

server 192.168.18.203 down;
  • (6)max_conns:表示指定的服务器最大连接数限制(nginx1.5.9以上版本才有的参数)

用法:max_conns=数字;

如:

server 192.168.18.202 max_conns=1024;
(二)、upstream实验:

4台机器:

  • IP:192.168.18.200(作前端服务器)
  • 192.168.18.201
  • 192.168.18.202
  • 192.168.18.203

步骤:

  • 1、三台机器上的nginx都需要启动,并在各自web根目录下的index.html的文件中加入机器识别信息,具体如下:
    • 200的机器上的index.html添加:from 200
    • 201的机器上的index.html,添加:from 201
    • 202的机器上的index.html,添加:from 202
    • 203的机器上的index.html,添加:form 203
  • 2、在237的机器上配置nginx(1)在http块中加入:
upstream webserver {      
server 192.168.18.201:80;      
server 192.168.18.202:80;      
server 192.168.18.203:80;}

       (2)在server区段的location段加入:

location / {    proxy_pass http://webserver;}

注:webserver这个组名前一定要记住加http://

打开浏览器访问:http://192.168.18.200,查看显示内容

  • 发现显示”from 201”
  • 刷新显示”from 202”
  • 再刷新显示”from 203”
  • 再刷新显示””from 201

依次刷新会在这三台机器之间循环(这种专业的叫法叫轮询)

(三)upstream模块主要指令
  • 1、hash:指定轮询的规则按照指定的key值来计算

用法:hash key;

这个key可以包含文本,变量或者文本与变量的组合。

  • 2、ip_hash;指定轮询的规则按照ip的hash值来计算

针对上面的实验:我们在upstream中加入ip_hash,再查看:

发现我们无论怎么刷新,访问的都是201上面的文件(因为客户端的IP没变)

升级到tengine

下载

https://tengine.taobao.org/download_cn.html

yum install lua-devel
wget -c https://tengine.taobao.org/download/tengine-2.3.2.tar.gz
tar zxvf tengine*
cd tengine*
./configure --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-openssl=/usr/local/src/openssl --with-openssl-opt=enable-tls1_3 --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_degradation_module --with-http_flv_module --with-http_geoip_module=dynamic --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-stream=dynamic --with-stream_ssl_module --with-stream_realip_module --with-stream_geoip_module=dynamic --with-stream_ssl_preread_module --with-stream_sni --with-jemalloc --with-pcre --with-pcre-jit --with-cc-opt='-O2 -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=native' --with-ld-opt='-Wl,-z,relro -Wl,-E' --add-dynamic-module=./modules/ngx_http_concat_module --add-dynamic-module=./modules/ngx_http_footer_filter_module --add-dynamic-module=./modules/ngx_http_proxy_connect_module --add-dynamic-module=./modules/ngx_http_reqstat_module --add-dynamic-module=./modules/ngx_http_sysguard_module --add-dynamic-module=./modules/ngx_http_trim_filter_module --add-dynamic-module=./modules/ngx_http_upstream_check_module --add-dynamic-module=./modules/ngx_http_upstream_consistent_hash_module --add-dynamic-module=./modules/ngx_http_upstream_dynamic_module --add-dynamic-module=./modules/ngx_http_upstream_dyups_module --add-dynamic-module=./modules/ngx_http_upstream_session_sticky_module --add-dynamic-module=./modules/ngx_http_user_agent_module --add-dynamic-module=./modules/ngx_slab_stat --add-dynamic-module=./modules/ngx_http_lua_module --add-dynamic-module=/usr/local/src/ngx_devel_kit --add-dynamic-module=./modules/ngx_http_slice_module
sudo make install

设置为系统服务
1:系统用户登录系统后启动的服务 的目录

/usr/lib/systemd/system

2:如需要开机没有登陆情况下就能运行的程序在系统目录内

/lib/systemd/system

3:我希望系统开机就启动目录,所以我把文件放在系统目录内。

vim /lib/systemd/system/nginx.service 创建文件

[Unit]
Description=The nginx HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target
 
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
 
[Install]
WantedBy=multi-user.target
chmod 745 /lib/systemd/system/nginx.service 
systemctl enable nginx.service
systemctl start nginx.service

Raspberrypi 源使用帮助

地址

https://mirrors.ustc.edu.cn/archive.raspberrypi.org/

说明

树莓派的 archive.raspberrypi.org 软件源,也即 /etc/apt/sources.list.d/raspi.list ,

是由树莓派基金会提供的软件源,包括 ui 相关程序 ( 如 Raspbian 的桌面环境 PIXEL DE) 及部分由树莓派基金会为 树莓派编写的软件,通常与 archive.raspbian.org ( 参考 Raspbian 源使用帮助 ) 一起使用。

收录架构

  • armhf
  • x86
  • x86_64

收录版本

  • jessie
  • stretch
  • buster