分类 linux 下的文章

本站在西部数码的虚拟主机上面。之前有卖一元的ssl,就用上了,当时的页面说了“续费将收取功能使用费¥28每年”。去年到期还是1元,又开心的续了一年。现在点进去需要38元,当然不干了。
于是上网找了一圈,首先zerossl.com,很有名,但是登录进去说我已经用了3次的90天额度,不能再免费了。而sslforfree.com是对接zerossl的,我注册时说我的邮件已经在zerossl用过了。freessl.cn要手机号,他是国内备案站,可以理解,但我不想给他。
于是,在某网找了一下“free ssl certificate online”,找到这个
https://punchsalad.com/ssl-certificate-generator/
直接申请了90天的,他是对接Let's Encrypt的,希望没有3次的限制。
记在这里,给自己备忘,也给看到的有缘人一个参考。

国内的虚拟主机还是不方便,不像国外的directadmin或者cpanel,直接就可以免费部署ssl。

生成文件
dd if=/dev/zero of=/var/swap bs=1k count=1024k
设置权限
chmod 600 /var/swap
设置交换区
mkswap /var/swap

启用交换器:
swapon /var/swap
开机自动挂载:
echo '/var/swap swap swap default 0 0' >> /etc/fstab

2017-11-07 06:42
2023-02-14 12:46
linux建立最小权限用户

添加用户
useradd -s /bin/false username

-s参数可指定用户的shell,设置成 /bin/false。这样用户就无法与系统进行交互。

设置密码:
passwd username

Linux下查看用户列表

cat /etc/passwd 可以查看所有用户的列表
w 可以查看当前活跃的用户列表
cat /etc/group 查看用户组

修改linux系统时间为北京时间
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
还有一个方法: /etc下有个timezone文件,把里面的改成Asia/Shanghai

scp命令 适合没有web服务的
scp 本地文件 root@192.168.0.101:/远程目录/远程子目录/
如果是远程传本地则调换过来。

zip加密
zip -q -r -P yourpassword zipfile.zip sourcefiles.txt

使用zip格式打包文件

-r 递归,将指定目录下的所有文件和子目录一并处理

-S 包含系统和隐藏文件

-y 直接保存符号连接,而非该连接所指向的文件

-X 不保存额外的文件属性

-m 将文件压缩并加入压缩文件后,删除源文件

-<压缩级别> 1~9,数字越大,压缩率越高

-F 尝试修复已损坏的压缩文件

-T 检查备份文件内的每个文件是否正确无误

-q 不显示指令执行过程

-g 将文件压缩后附加在既有的压缩文件之后,而非另行建立新的压缩文件

-u 更新压缩包内文件

-f 更新压缩包内文件。如果符合条件的文件没有包含在压缩包中,则压缩后添加

-$ 保存第一个被压缩文件所在磁盘的卷标

-j 只保存文件名称及其内容

-D 压缩文件内不建立目录名称

-i <表达式> 压缩目录时,只压缩符合条件的文件

-x <表达式> 排除符合条件的文件

-n <文件名后缀> 排除指定文件名后缀的文件

-b <缓存路径> 指定临时文件目录

-d <表达式> 从压缩文件内删除指定的文件

-t <日期时间> 把压缩文件的日期设成指定的日期

-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该文件相同

-A 调整可执行的自动解压缩文件

-c 替每个被压缩的文件加上注释

-z 替压缩文件加上注释

-k 使用MS-DOS兼容格式的文件名称。

-l 压缩文件时,把LF字符置换成LF+CR字符。

-ll 压缩文件时,把LF+CR字符置换成LF字符。

查看debian的版本和位数
more /etc/debian_version
getconf LONG_BIT

Debian中修改时区

获取当前系统可用的时区名称
timedatectl list-timezones
如想要将系统时区设置为 Asia/Shanghai,可用以下命令
timedatectl set-timezone Asia/Shanghai

      location / {
proxy_ssl_server_name on;
proxy_pass https://www.a.com;
proxy_set_header Accept-Encoding "";
sub_filter "www.a.com"  "替换成你的域名";
sub_filter_once off;}

上面的location / 也可以是其他的目录。

这是我从一个已经失效的shell里面扒拉出来的。

另附:ip透传的用法
proxy_set_header可更改或添加客户端的请求头部信息内容并转发至后端服务器,Nginx本身有个变量叫$remote_addr,它可以转发客户端地址,我们还需要对设置取个别名,官方有专门的的名称为X-Real-IP,当然也可以自定义。

proxy_set_header X-Real-IP $remote_addr;

与此同时,后端web服务器配置文件的LogFormat部分要添加与Nginx反代服务器中相同的名称(如X-Real-IP)作为日志记录的头部信息。

以上变更都要重启服务的。

apt update
apt-get install nginx -y
systemctl start nginx
systemctl enable nginx

nano /etc/nginx/sites-available/your-domain-name.com

server {

  listen 80;
  server_name example.com www.example.com;

  root /var/www/html;
  index index.php index.html index.nginx-debian.html;
  access_log /var/log/nginx/example_access.log;
  error_log /var/log/nginx/example_error.log;

  location / {
    try_files $uri $uri/ /index.php$is_args$args;
  }

  location ~ \.php$ {
    try_files $uri =404;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_pass unix:/run/php/php7.4-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  }

}



ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com

systemctl reload nginx

apt-get install mariadb-server -y
systemctl start mariadb
systemctl enable mariadb
mysql_secure_installation

Press Y to Switch to unix_socket authentication.

apt-get install php php-fpm php-curl php-cli php-zip php-mysql php-xml -y

apt install snapd

snap install core
snap refresh core

apt remove certbot
snap install --classic certbot

ln -s /snap/bin/certbot /usr/bin/certbot

certbot --nginx --agree-tos --redirect --email your_email@example.com -d example.com -d www.example.com

nginx 设置nginx.conf server_tokens off

交待背景
某域名,设为example.com,dns设为cloudflare,SSL/TLS设为“完全”,即“端到端加密,使用服务器上的自签名证书”

vps为nat vps + ipv6,ip地址是6.6.6.6,可用端口是1001-1020。
在nginx里面设置https监听ipv4的1001端口,ipv6的443端口。http监听ipv4的80端口。
nginx设置了自签名ssl证书。
然后访问http://6.6.6.6:1001会出现

400 Bad Request
The plain HTTP request was sent to HTTPS port
nginx/1.14.2

说明nginx发现http端口用1001访问不到的,而https端口才是1001

其2
cloudflare里面,test子域名指向6.6.6.6,直接指向,不经过cf代理。test2子域名指向6.6.6.6,但通过cf代理。
子域名“2”指向ipv6。

https://test2.example.com:1001/

无法访问此网站test2.example.com 的响应时间过长。
请试试以下办法:

检查网络连接
检查代理服务器和防火墙
运行 Windows 网络诊断
ERR_CONNECTION_TIMED_OUT

如果直接访问https://test.example.com:1001/ 和直接访问ip加端口是一样的。出现自签名证书的警告。忽略后,可以访问。
访问子域名“2”是完全正常的。

1、改ssh端口:
改掉默认的22端口,可以避免99%以上的扫描,除非他盯上了你,专门对着你来扫。

2、开启bbr(通常境内可免此步骤)

echo "net.core.default_qdisc = fq" >> /etc/sysctl.conf && echo "net.ipv4.tcp_congestion_control = bbr" >> /etc/sysctl.conf && sysctl -p && sysctl net.ipv4.tcp_available_congestion_control && lsmod | grep bbr

3.其他

其实之前也看过相关文章,说要修改ssh默认端口22以提高安全性,但也有文章指出,如果对方有意爆破的话,他也可以扫描你所有端口。

我个人比较认同后面的说法,觉得高强度的长密码才是王道。当然也有懒的原因。

但是还是决定要修改端口号了。

原因是看了这篇文章《虚拟主机和VPS的几个区别》http://www.auiou.com/relevant/00001444.jsp
提到“尤其是Linux主机下的/var/log/btmp文件的增长速度特别快”。

笛声大佬评论说:

你怎么总是纠结 /var/log/btmp 这个文件,这个文件你用 lastb -f /var/log/btmp
看看,里面全是记录了失败的登录,就是说有人一直在爆破你的密码,你把sshd的端口改一下,一般就没人来爆破了,我登录了好几台机器去看了,这个文件大小一直是0。

所以虽然目前我的vps没有被破,但是为了节约磁盘空间,还是说干就干。

第一、修改 /etc/ssh/sshd_config
找到#Port 22,再插入一行设置成你想要的端口号,注意不要跟现有端口号重复。建议一万以上的,当然要小于65535。
第二、重启ssh: systemctl restart sshd
第三、用你刚才的端口登录进去,如果成功了,就注释掉port 22,继续重启ssh。
第四、用端口22登录,发现登不了了,再用新端口,能用,那么就恭喜啦!

另附:清空文件的方法

: > filename
> filename  #最简单,推荐
echo "" > filename
echo > filename

1和2两种方式是0字节,3和4两种方式是1字节。

清空多个文件,比如清空多个log:
ls *.log | awk 'NR>1 {print "echo > " $NF }' |sh

为什么要清空文件,而不是删除文件呢?其实还可以写一篇文章,但我还是一并写在这里了。有一次按照网上的文章,删除了许多log文件,但是nginx等却启动不了了,要手动启动。我感觉linux下的软件简直是白莲花,就不能像windows下面的软件一样,自己再生成文件吗?比如Windows下某某软件,我删了他的缓存,启动该软件后,它又重新生成了一堆缓存。感觉自己是习惯了这些流氓行为,而对linux下的白莲花行为不习惯呢!(晕……)

附上勇哥的脚本:

port='3635'; a=''; a2='/etc/ssh/sshd_config'; a1=`cat $a2`; if [[ $a1=~ '#Port 22' ]]; then sed -i "s/#Port 22/Port $port/g" $a2; fi; if [[ $a1 =~ 'Port 22' ]]; then sed -i "s/Port 22/Port $port/g" $a2; fi; if [[ $a1 =~ 'Port ' ]]; then a=''; else sed -i '$a\'"\nPort $port" $a2; fi; reboot;

请修改上述的 port='3635'; 的值.

递归修改目录权限为755,文件权限为644

linux的原则是最小权限够用就行,不相关的文件只需要只读权限即可。

实现方法:递归修改权限方法是通过 find命令 根据文件参数查找到对应的类型之后执行指定权限。

说明:以下**path**为你需要修改的目录的路径。

1.修改所有者:
chown -R root.root path (递归修改指定路径的所有文件为root用户组所有)
如果是网站目录建议修改所有者为:www-data:www-data

2.递归修改目录权限、文件权限:
find -type d|xargs chmod 755
find -type f|xargs chmod 644
方法二:
#find 路径 -type d -exec chmod 755 {} \;
#find 路径 -type f -exec chmod 644 {} \;

Let's encrypt Wildcard(Wildcard其实是通配符的意思,但是网友们喜欢称“野卡”)

网上的代码,我试过很多都不行,下面这个代码是我从certbot官网以及经过本人一些改动得来,在Debian 8 nginx下通过。

apt-get remove certbot
wget https://dl.eff.org/certbot-auto
sudo mv certbot-auto /usr/local/bin/certbot-auto
sudo chown root /usr/local/bin/certbot-auto
sudo chmod 0755 /usr/local/bin/certbot-auto

sudo /usr/local/bin/certbot-auto certonly --manual
解释:certonly 表示只要申请证书,不需要它自动配置nginx,--manual表示手动的意思。
接下来,会有几个yes or no,自己看清楚来选,然后有一个是添加dns解析的,请按提示操作即可。
/usr/local/bin/certbot-auto renew #这个代码是用来更新证书的,其实有一个是加入任务列表,自动更新的,但运行不了,不知道怎么回事。