centos开启ssh密钥登录总结 Linux
centos开启SSH的密钥登录相信大家都会吧,而且很多的一键脚本都会配备,比如wdlinux面板的一件安装包都会配备而且支持自定义修改SSH端口,和一键生成密钥,很方便的,但是我们有时候没有必要安装这些一键脚本(比如内存小,不是用来做web服务的等等原因就不细说了);比如我们只是在梯子服务器上安装呢?这就需要我们自己手动了.博主我呢也经常折腾linux服务器,自己的或朋友的,今天抽时间写这篇文章,把我配置SSH密钥过程中遇到的坑都一一道来,
一来是做个总结,二来是方便后人^^.不要再往坑了跳了!跳了的也能尽快出坑!(此处应有掌声 -_-|)
先来看配置SSH的步骤
大致分为以下下几步:
- 本地使用xshell软件生成公钥(不推荐linux端生成,照顾小白)
- 使用非常著名方便小巧的运维工具--lrzsz(点我传送)--来上传公钥到服务端
- 服务端常规配置(会附上详细的步骤shell操作代码)
- 本文的重点--常见的坑的排除,解决方法(附上几种出错的情况以及解决办法)
1.本地使用xshell软件生成公钥:
- 在xshell的工具栏里面找到 工具-新建用户密钥向导 如下图所示:
2.SSH登录服务器,把id_rsa_2048.pub上传到服务器上并注册公钥,配置SSH
- 上传可以参考我这篇文章 lrzsz(点我传送) ,如果安装好了lrzsz,只需要一条命即可把pub文件上传到服务器,输入:
rz
然后在弹出的窗口选择上传的文件即可,如果出现报错,暂时关闭防火墙即可.- 其实使用sftp也可以在xshell里直接传文件,但是我不常用没有做,抱歉,但是教程网上有的,搜索一下即可.
3.服务端注册公钥.pub文件到系统,并分配好权限,权限没设置好后面登录会出问题的,这就是其中的一个坑,很多人都被坑过...具体步骤如下代码 :
就是把id_rsa_2048.pub的内容替换到/root/.ssh/下: [root@test ~]# ls -a . .. id_rsa_2048.pub [root@test ~]# mkdir .ssh [root@test ~]# chmod 700 .ssh/ [root@test ~]# cd .ssh/ [root@test .ssh]# cat ../id_rsa_2048.pub > ./authorized_keys [root@test .ssh]# ls authorized_keys [root@test .ssh]# chmod 600 authorized_keys [root@test ~]# diff id_rsa_2048.pub .ssh/authorized_keys [root@test ~]#
最后的diff命令来比较两个文件,确保文件内容相同。
4.接下来配置server的ssh服务(/etc/ssh/sshd_config)只允许使用密钥登录不允许口令登录(小提示:sshd重启完先不要关闭当前的ssh链接,以防万一):
[root@test~]:# vi /etc/ssh/sshd_config #然后在vi界面用i来insert修改,找个空,回车一下,粘贴下面的代码 PasswordAuthentication no # 不允许口令登录 PubkeyAuthentication yes # 使用key登录 AuthorizedKeysFile .ssh/authorized_keys # key的名字 #然后Esc,输入冒号:wq,保存退出
service sshd restart #重启ssh服务
现在暂时不修改端口,不然修改完端口很多童鞋就直接exit了,就GG了,因为很多人的iptables规则没有设置就退出了,结果就进不去了,要是vps有控制台还好,可以通过控制台的VNC修改配置文件.要是没有就麻烦了.
这时候,xshell新开一个窗口,输入你的服务器IP,端口,默认22,然后回车链接,在弹出的对话框输入用户名,root,然后选择public key,在用户密钥里选择刚刚生成的那个,默认名字是id_rsa_2048,然后在下面输入刚刚设置的密钥密码,登录,看是否正常,如果正常登录,就OK了,然后就可以去修改端口,修改防火墙了:
修改端口,直接,vi /etc/ssh/sshd_config,增加一行,Port 3211 #端口请随意,但要记住.
然后防火墙增加一条规则允许 32211端口链接,命令大概如下,具体的请自行酌情修改:
iptables -A INPUT -p tcp --dport 3211 -j ACCEPT /*允许包从3211端口进入*/ iptables -A OUTPUT -p tcp --sport 3211 -m state --state ESTABLISHED -j ACCEPT /*允许从3211端口进入的包返回*/ service iptables save /*保存配置*/ service iptables restart /*重启iptables*/
下面说一下常见的坑(错误),如何爬出来:
这时候,请先检查存放authorized_keys的文件的权限,是否为600或者是644,如果不知道怎么看,那就直接执行下面的命令一次好了:
chmod 600 .ssh/authorized_keys 即可或者 644 也行. #600权限即-rw-------
注:执行这些命令的前提是,默认你是root账户,且在root目录下.如果不是,请自行调整用户和目录.不懂得可以留言/评论/发邮件.
然后再次登录,成功就不说了,没成功请继续往下看:
没成功就请查看登录日志,具体的命令如下(centos为例,其他的linux目录可能不一样,请注意):
cat /var/log/secure
如果出现如图所示的 xxx because account is locked :
这种有可能是用户被锁定了,于是查看状态 准备解锁用户,命令如下: pam_tally2 --user root #root为你需要登录的账号 pam_tally2 -r -u root #root为你需要登录的账号 通过pam_tally2 --user 指令发现没有锁定,都是0, [root@test~]# pam_tally2 --user root Login Failures Latest failure From root 0 [root@test~]# pam_tally2 -r -u root Login Failures Latest failure From root 0 那就有可能是sshd没开启PAM 修改/etc/ssh/sshd_config 配置后 ,再次登录测试,应该能解决问题
2.如果按照上面这些修改完还是登录不进去,并且查看日志,大概内容如下:
Mar 29 01:36:12 localhost sshd[2645]: Received disconnect from 192.123.123.123: 11: Bye Bye Mar 29 01:49:48 localhost sshd[2031]: Received signal 15; terminating. Mar 29 01:49:48 localhost sshd[2704]: Server listening on 0.0.0.0 port 22. Mar 29 01:49:48 localhost sshd[2704]: Server listening on :: port 22. Mar 29 01:50:12 localhost sshd[2707]: Received disconnect from 192.123.123.123: 0: Mar 29 01:50:43 localhost sshd[2784]: Received disconnect from 192.123.123.123: 0: Mar 29 01:52:21 localhost sshd[2812]: Received disconnect from 192.123.123.123: 0:
出错的是直接就断开了连接,并且没有任何错误提示,请检查服务器的selinux和iptables是否开启,iptables前面讲过,开放想相应端口,
如果还是连接不上,那就检查selinux, 使用下面的代码检查selinux 是否开启 :
查看SELinux状态: 1、/usr/sbin/sestatus -v ##如果SELinux status参数为enabled即为开启状态 SELinux status: enabled 2、getenforce ##也可以用这个命令检查 关闭SELinux: 1、临时关闭(不用重启机器): setenforce 0 ##设置SELinux 成为permissive模式 ##setenforce 1 设置SELinux 成为enforcing模式 2、修改配置文件需要重启机器: 修改/etc/selinux/config 文件 将SELINUX=enforcing改为SELINUX=disabled 重启机器即可 #reboot
目前就写这么多,欢迎补充,交流!
我们下次再会.
LInux远程文件传输效率工具-lrzsz Linux
wget
tar xf lrzsz-0.12.20.tar.gz
cd lrzsz-0.12.20
#当前目录下有个INSTALL,详细讲述了如果安装
./configure && make && sudo make install #如果你不需要特别自定义,这条指令就够了
echo $? # 如果结果是0,就表示你安装成功了
error while loading shared libraries: libsodium.so.18: cannot open shared Linux
昨晚在部署环境编译pureFTP的时候,报错:
error while loading shared libraries: libsodium.so.18: cannot open shared
百度,Google一阵总算找到解决方法:
首先确认libsodium.so.18在你得系统里是否存在,直接一行命令就搞定:
cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
/lib
/usr/lib
/usr/lib64
/usr/local/lib
或者是下面的find命令:
find / -name "libsodium.so.18" ,我的系统返回的是存在的,一般的系统都存在的....
/usr/lib/libsodium.so.18 ...那既然存在好报错,那就软连接到另一个 libsodium.so 上,具体命令如下:
ln -sf /usr/lib/libsodium.so /usr/lib/libsodium.so.18
最后一定要记得
ldconfig
注:参考链接--
http://www.jb51.net/LINUXjishu/268747.html
下面记录一下.使用acme.sh安装ssl证书时需要注意的,按照作者的步骤clone或者wget,curl且运行完脚本后,请reboot一下vps,
不然你执行acme.sh --可能会提示找不到命令,如果不重启,也可以,切换到acme.sh的安装目录,
cd /root/.acme.sh/ ,然后执行, ./acme.sh --参数 .推荐重启一下,方便.
如果在安装证书过程中出错,Verifying invalid这类的最好就换一种方式验证域名.作者那里有提到.
在安装证书前,域名切记不要被Google或者是火狐报毒...不然是不能通过的,不能颁发证书的.更多的使用方法去作者的github主页看,很详细.
Linux Find 命令精通指南(转) Linux
简单介绍这一无处不在的命令的强大的方面以及混乱的方面。
2008 年 7 月发布
Linux find 命令是所有 Linux 命令中最有用的一个,同时也是最混乱的一个。它很难,因为它的语法与其他 Linux 命令的标准语法不同。但是,它很强大,因为它允许您按文件名、文件类型、用户甚至是时间戳查找文件。使用 find 命令,您不但可以找到具这些属性任意组合的文件,还可以对它找到的文件执行操作。
本文的目的是,通过概述 find 命令的用途和潜能,简化该命令的学习和使用。同时,它将针对 find 命令的某些最强大但最混乱的方面提供一个基本的指南和参考。
[注意:本文使用的 find 版本是 GNU 版本,因此,某些细节可能与其他版本的 find 有所不同。]
基本格式
开始之前,我们先来看一下 find 命令的基本结构:
find start_directory test options criteria_to_match action_to_perform_on_results
在以下命令中, find 将开始在当前目录(用“.”表示)中查找任何扩展名为“java”的文件:
find . -name "*.java"
下面是该命令所找到的命令的缩略清单:
find . -name "*.java" ./REGEXPvalidate/src/oracle/otnsamples/plsql/ConnectionManager.java ./REGEXPvalidate/src/oracle/otnsamples/plsql/DBManager.java ..
[注意:如果您从本文剪切并粘贴来运行该 find 命令,您可能需要使用自己的键盘替换双引号 (“”) 才能得出正确的结果。]
以下命令将执行相同的操作。在这两种情况下,您都需要对通配符进行转义以确保它传递到 find 命令并且不由 shell 解释。因此,请将您的搜索字符串放到引号里,或者在它前面加上反斜线:
find . -name \*.java
尽管 find 的所有参数均为可选,但是如果您未指定从哪里开始搜索,搜索默认将在当前目录中开始。如果您不指定要匹配的测试连接、选项或值,您的结果将不完整或者无区别。
运行以下三个 find 命令将得出同样的结果 — 当前目录和所有子目录中的所有文件(包括隐藏文件)的完整清单:
find find . find . -print
这类似于运行一个带 -la 选项的 ls 命令。如果您希望上述命令的输出包含完整的路径名(或许是为了备份),您将需要指定起始目录的完整路径:
find /home/bluher -name \*.java /home/bluher/plsql/REGEXPvalidate/src/oracle/otnsamples/plsql/ConnectionManager.java /home/bluher/plsql/REGEXPvalidate/src/oracle/otnsamples/plsql/DBManager.java/ ...
您还可以在搜索字符串中指定多个起始目录。如果以具有相应权限的用户身份运行,以下命令将下到 /usr、/home /tmp 目录查找所有 jar 文件:
find /usr /home /tmp -name "*.jar"
但是,如果您没有相应的权限,您在开始浏览许多系统目录时将生成错误消息。以下是一个示例:
find: /tmp/orbit-root: Permission denied
您可以通过附加您的搜索字符串来避免混乱的输出,如下所示:
find /usr /home /tmp -name "*.jar" 2>/dev/null
这会将所有错误消息发送到空文件,因此提供清理器输出。
默认情况下,find 是区分大小写的。对于不区分大小写的 find,将 -iname 测试替换为 -name 测试。
find downloads -iname "*.gif" downloads/.xvpics/Calendar05_enlarged.gif downloads/lcmgcfexsmall.GIF
除文件名外,您还可以按类型搜索文件。例如,您可以使用以下命令查找一个目录中的所有子目录:
find . -type d
您可以使用以下命令查找您的/usr 目录中的所有符号链接:
find /usr -type l
这可能会列出 3,000 多个链接。以下的任何一个命令使用根权限运行都将列出 /usr 目录中的链接以及它所指向的文件:
# find /usr/bin -type l -name "z*" -exec ls -l {} \; lrwxrwxrwx 1 root root 8 Dec 12 23:17 /usr/bin/zsh -> /bin/zsh lrwxrwxrwx 1 root root 5 Dec 12 23:17 /usr/bin/zless -> zmore lrwxrwxrwx 1 root root 9 Dec 12 23:17 /usr/bin/zcat -> /bin/zcat
find /usr/bin -type l -name "z*" -ls
但是,第二个更短的命令将列出更多的文件,以及目录和 inode 信息:在本文后面的部分中,我们将讨论 -exec 和 -ls 操作的用法。
其他 find 可以找到的文件类型包括:
• b — 块(缓存)特殊
• c — 字符(未缓存)特殊
• p — 命名管道 (FIFO)
• s — 套接字
使用根作为 find 命令的起点会极大地降低系统的速度。如果您必须运行这样一个命令,您可以在非高峰时段或晚上运行它。您可以使用以下语法将输出重定向到一个文件:
find / -print > masterfilelist.out
如果您错误地输入一个 find 命令,生成大量不必要的输出,只需按 CTRL-C 中断该命令,这将停止最近执行的命令。
在具多个文件系统的企业网络上,限制 find 查找的文件也是一个特别好用的方法。尽可能多地使用选项和测试以减少系统上的负载。用于此目的的两个最有用的选项是 -xdev 和 -mount。它们通过阻止 find 下到其他文件系统(如 MS-DOS、CD-ROM 或 AFS)上的目录中缩短了搜索范围。这将搜索限制为同一类型的文件系统作为起始目录。
如果运行 mount 命令,双引导系统上的用户可以使用这些选项。假设涉及 Windows 分区,您可以使用类似以下的命令安装它:
mount -t vfat /dev/sda1 /mnt/msdos
您使用的实际命令取决于您的系统设置。您可以通过运行 df 或执行以下命令验证该分区已安装:
find /mnt/msdos -name "*.txt" 2> /dev/null
您应该看到 MS Windows 分区上列出了很多的文件。现在,运行以下带 -mount 或 -xdev 选项的命令:
find / -name "*.txt" -mount 2> /dev/null
或者
find / -name "*.txt" -xdev 2> /dev/null
还可以使用 -fstype 测试明确告知 find 在哪个文件系统中查找,如以下示例中所示:
find / -name "*.txt" -fstype vfat 2> /dev/null
查找时间
find 命令有几个用于根据您系统的时间戳搜索文件的选项。这些时间戳包括
• mtime — 文件内容上次修改时间
• atime — 文件被读取或访问的时间
• ctime — 文件状态变化时间
mtime 和 atime 的含义都是很容易理解的,而 ctime 则需要更多的解释。由于 inode 维护着每个文件上的元数据,因此,如果与文件有关的元数据发生变化,则 inode 数据也将变化。这可能是由一系列操作引起的,包括创建到文件的符号链接、更改文件权限或移动了文件等。由于在这些情况下,文件内容不会被读取或修改,因此 mtime 和 atime 不会改变,但 ctime 将发生变化。
这些时间选项都需要与一个值 n 结合使用,指定为 -n、n 或 +n。
• -n 返回项小于 n
• +n 返回项大于 n
• n 返回项正好与 n 相等
下面,我们来看几个例子,以便于理解。以下命令将查找在最近 1 小时内修改的所有文件:
find . -mtime -1 ./plsql/FORALLSample ./plsql/RegExpDNASample /plsql/RegExpSample
用 1 取代 -1 运行同一命令将查找恰好在 1 小时以前修改的所有文件:
find . -mtime 1
上述命令不会生成任何结果,因为它要求完全吻合。以下命令查找 1 个多小时以前修改的所有文件:
find . -mtime +1
默认情况下,-mtime、-atime 和 -ctime 指的是最近 24 小时。但是,如果它们前面加上了开始时间选项,则 24 小时的周期将从当日的开始时间算起。您还可以使用 mmin、amin 和 cmin 查找在不到 1 小时的时间内变化了的时间戳。
如果您在登录到您的帐户后立即运行以下命令,您将找到在不到 1 分钟以前读取的所有文件:
find . -amin -1 ./.bashrc /.bash_history ./.xauthj5FCx1
应该注意的是,使用 find 命令查找文件本身将更改该文件的访问时间作为其元数据的一部分。
您还可以使用 -newer、-anewer 和 –cnewer 选项查找已修改或访问过的文件与特定的文件比较。这类似于 -mtime、-atime 和 –ctime。
• -newer 指内容最近被修改的文件
• -anewer 指最近被读取过的文件
• -cnewer 指状态最近发生变化的文件
要查找您的主目录中自上一个 tar 文件以来以某种方式编辑过的所有文件,使用以下命令:
find . -newer backup.tar.gz
按大小查找文件
-size 选项查找满足指定的大小条件的文件。要查找所有大于 5MB 的用户文件,使用
find / -size +5000000c 2> /dev/null /var/log/lastlog /var/log/cups/access_log.4 /var/spool/mail/bluher
结尾的“c”以字节为单位报告我们的结果。默认情况下,find 以 512 字节块的数量报告大小。如果我们将“c”替换为“k”,我们还会看到以千字节的数量报告的结果,如果使用“w”,则会看到以两字节字的数量报告的结果。
-size 选项经常用于搜索所有零字节文件并将它们移至 /tmp/zerobyte 文件夹。以下命令恰好可以完成这一任务:
find test -type f -size 0 -exec mv {} /tmp/zerobyte \;
-exec 操作允许 find 在它遇到的文件上执行任何 shell 命令。在本文的后面部分,您将看到其用法的更多示例。大括号允许移动每个空文件。
选项 -empty 还可用于查找空文件:
find test -empty test/foo test/test
按权限和所有者查找
要监视您的系统安全离不开 find 命令。您可以使用符号或八进制表示法查找面向广大用户开放的文件,如下所示:
find . -type f -perm a=rwx -exec ls -l {} \;
或者
find . -type f -perm 777 -exec ls -l {} \; -rwxrwxrwx 1 bluher users 0 May 24 14:14 ./test.txt
在这一部分中,在上面和下面的命令中,我们使用了 -exec ls -l 操作,因此,您可以看到返回的文件的实际权限。以下命令将查找可由“other”和组写入的文件:
find plsql -type f -perm -ug=rw -exec ls -l {} \; 2>/dev/null
或者
find plsql -type f -perm -220 -exec ls -l {} \; 2>/dev/null -rw-rw-rw- 1 bluher users 4303 Jun 7 2004 plsql/FORALLSample/doc/otn_new.css -rw-rw-rw- 1 bluher users 10286 Jan 12 2005 plsql/FORALLSample/doc/readme.html -rw-rw-rw- 1 bluher users 22647 Jan 12 2005 plsql/FORALLSample/src/config.sql ..
下一个命令将查找由用户、组或二者共同写入的文件:
find plsql -type f -perm /ug=rw -exec ls -l {} \; 2>/dev/null, or, find plsql -type f -perm /220 -exec ls -l {} \; 2>/dev/null -rw-r--r-- 1 bluher users 21473 May 3 16:02 plsql/regexpvalidate.zip -rw-rw-rw- 1 bluher users 4303 Jun 7 2004 plsql/FORALLSample/doc/otn_new.css -rw-rw-rw- 1 bluher users 10286 Jan 12 2005 plsql/FORALLSample/doc/readme.html -rw-rw-rw- 1 bluher users 22647 Jan 12 2005 plsql/FORALLSample/src/config.sql
您可能会看到以下命令在 Web 和较早的手册中引用过:
find . -perm +220 -exec ls -l {} \; 2> /dev/null
+ 符号的作用与 / 符号相同,但是现在新版 GNU findutils 中不支持使用该符号。
要查找您的系统上所有人都可以写入的所有文件,使用以下命令:
find / -wholename '/proc' -prune -o -type f -perm -0002 -exec ls -l {} \; -rw-rw-rw- 1 bluher users 4303 Jun 7 2004/home/bluher/plsql/FORALLSample/doc/otn_new.css -rw-rw-rw- 1 bluher users 10286 Jan 12 2005 /home/bluher/plsql/FORALLSample/doc/readme.html ...
第 4 个权限将在稍后进行讨论,但最后一个字段中的“2”是文件权限中的“other”字段,也称为写入位。我们在权限模式 0002 前面使用了破折号,以指明我们希望看到为 other 设置了写权限的文件,无论其他权限设置为什么。
上述命令还引入了三个新概念。针对文件模式“/proc”使用 -wholename 测试,如果该模式已找到,-prune 可防止 find 下到该目录中。布尔类型“-o”使 find 可以针对其他目录处理该命令的其余部分。由于每个表达式之间有一个假设的隐式 and 运算符 (-a),因此,如果左侧的表达式计算结果为 false, and 之后的表达式将不进行计算;因此需要 -o 运算符。Find 还支持布尔类型 -not、!,就像使用括号强行优先一样。
系统管理员经常使用 find 通过用户或组的名称或 ID 搜索特定用户或组的常规文件:
[root] $ find / -type f -user bluher -exec ls -ls {} \;
下面是这样一个命令的高度精简的输出示例:
4 -rw-r--r-- 1 bluher users 48 May 1 03:09 /home/bluher/public_html/.directory 4 -rw-r--r-- 1 bluher users 925 May 1 03:09 /home/bluher/.profile
您还可以使用 find 按组查找文件:
[root] $ find / -type f -group users
find / -type d -gid 100
该命令将列出由 ID 为 100 的组拥有的目录。要找到相应的 uid 或 gid,您可以针对 /etc/passwd 或 /etc/group 文件运行 more 或 cat 命令。
除了查找特定已知用户和组的文件外,您还会发现它对于查找没有这些信息的文件也很有用。下一个命令将识别未列在 /etc/passwd 或 /etc/group 文件中的文件:
find / -nouser -o -nogroup
上述命令可能不会在您的系统上生成实际的结果。但是,它可用于识别或许在经常移动后没有用户或组的文件。
好了,现在我们可以解决本部分开始时提到的格外重要的权限了。
SGID 和 SUID 是特殊访问权限标志,可以分配给基于 UNIX 的操作系统上的文件和目录。设置它们是为了允许访问计算机系统的普通用户使用临时提升的权限执行二进制可执行文件。
find / \( -perm -2000 -o -perm -4000 \) -ls 167901 12 -rwsr-xr-x 1 root root 9340 Jun 16 2006 /usr/bin/rsh 167334 12 -rwxr-sr-x 1 root tty 10532 May 4 2007 /usr/bin/wall
在上述命令中,您可以看到转义括号的使用。您还可以看到权限的不同。第一个文件设置了 SGID 权限,第二个文件设置了 SUID 权限。上述命令中的最后的操作与带 -exec ls -dils 操作的 find 效果类似。
控制 find
与 Linux 中的许多命令不同,find 不需要 -r 或 -R 选项即可下到子目录中。它默认情况下就这样操作。但是,有时您可能希望限制这一行为。因此,选项 -depth、-maxdepth 和 -mindepth 以及操作 -prune 就派上用场了。
我们已经看到了 -prune 是多么有用,下面让我们来看看 -depth、-maxdepth 和 -mindepth 选项。
-maxdepth 和 -mindepth 选项允许您指定您希望 find 搜索深入到目录树的哪一级别。如果您希望 find 只在目录的一个级别中查找,您可以使用 maxdepth 选项。
通过运行以下命令在目录树的前三个级别中查找日志文件,您可以看到 -maxdepth 的效果。使用该选项较之不使用该选项所生成的输出要少得多。
find / -maxdepth 3 -name "*log"
您还可以让 find 在至少下至目录树三个级别的目录中查找:
find / -mindepth 3 -name "*log"
-depth 选项确保先在一个目录中进行查找,然后才在其子目录中进行查找。以下命令提供了一个示例:
find -name "*test*" -depth ./test/test ./test ./localbin/test ./localbin/test_shell_var ./localbin/test.txt ./test2/test/test ./test2/test ./test2
find 世界
我们已经看过了 find 命令的一些更加有用以及有点难懂的功能,但是 find 还可以执行更多的任务。例如,有多个选项可以使 find 与较低的 UNIX 版本和其他操作系统相兼容并允许您执行打印输出到多个文件等操作。阅读本文后,您现在已经有了理解 find 参考指南的背景,我鼓励您深入研究这一强大、有用的工具。
原文:http://www.oracle.com/technetwork/cn/topics/calish-find-096463-zhs.html
搭建 nginx + mysql + php-fpm 环境(CentOS 6) Linux
前言:这几天帮朋友部署一个项目,一开始为了方便,(我懒-_-|),使用一键lanmp脚本部署,结果项目测试的时候bug一大堆...,声明:这不是说这些一键脚本不好,客观的来说,这些脚本用来建站,普通的单纯的站,一般没问题的,也很方便,但是部署项目,如果对这个脚本不是特别了解,特别了解,特别了解!重要的是说三遍...千万不要用,老实的手动部署环境吧....于是本想写一篇的,但是发现有人写了...就转载过来,存着当笔记吧.
本文档介绍如何使用一台普通配置的云服务器ECS实例搭建LNMP平台的web环境。
- Linux:自由和开放源码的类UNIX操作系统。
- Nginx:轻量级网页服务器、反向代理服务器。
- MySQL:关系型数据库管理系统。
- PHP:主要适用于Web开发领域的一种脚本语言。
适用对象
适用于熟悉Linux操作系统,刚开始使用阿里云进行建站的个人用户。
基本流程
使用云服务器 ECS 搭建LNMP平台的操作步骤如下:
- 准备编译环境
- 安装nginx
- 安装mysql
- 安装php-fpm
- 测试访问
步骤一:准备编译环境
1、系统版本说明
# cat /etc/redhat-release CentOS release 6.5 (Final)
注:这是本文档实施时参考的系统版本。您的实际使用版本可能与此不同,下文中的nginx,mysql,及php版本,您也可以根据实际情况选择相应版本。
2、关闭SELINUX
修改配置文件,重启服务后永久生效。
# sed -i 's/SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
命令行设置立即生效。
# setenforce 0
3、安全组设置
在ECS安全组放行需访问的端口和访问白名单,下面的示例表示允许所有IP访问服务器的80端口。您可以根据实际情况放行允许访问的客户端IP。
步骤二:安装nginx
Nginx是一个小巧而高效的Linux下的Web服务器软件,是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,已经在一些俄罗斯的大型网站上运行多年,目前很多国内外的门户网站、行业网站也都在是使用Nginx,相当稳定。
1、下载源码包解压编译。
# wget http://nginx.org/download/nginx-1.10.2.tar.gz # tar xvf nginx-1.10.2.tar.gz -C /usr/local/src # yum groupinstall "Development too # yum -y install gcc wget gcc-c++ automake autoconf libtool libxml2-devel libxslt-devel perl-devel perl-ExtUtils-Embed pcre-devel openssl-devel # cd /usr/local/src/nginx-1.10.2 # ./configure \ --prefix=/usr/local/nginx \ --sbin-path=/usr/sbin/nginx \ --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/tmp/nginx/client \ --http-proxy-temp-path=/var/tmp/nginx/proxy \ --http-fastcgi-temp-path=/var/tmp/nginx/fcgi \ --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \ --http-scgi-temp-path=/var/tmp/nginx/scgi \ --user=nginx \ --group=nginx \ --with-pcre \ --with-http_v2_module \ --with-http_ssl_module \ --with-http_realip_module \ --with-http_addition_module \ --with-http_sub_module \ --with-http_dav_module \ --with-http_flv_module \ --with-http_mp4_module \ --with-http_gunzip_module \ --with-http_gzip_static_module \ --with-http_random_index_module \ --with-http_secure_link_module \ --with-http_stub_status_module \ --with-http_auth_request_module \ --with-mail \ --with-mail_ssl_module \ --with-file-aio \ --with-ipv6 \ --with-http_v2_module \ --with-threads \ --with-stream \ --with-stream_ssl_module # make && make install # mkdir -pv /var/tmp/nginx/client2、添加SysV启动脚本。
# vim /etc/init.d/nginx #!/bin/sh # # nginx - this script starts and stops the nginx daemon # # chkconfig: - 85 15 # description: Nginx is an HTTP(S) server, HTTP(S) reverse \ # proxy and IMAP/POP3 proxy server # processname: nginx # config: /etc/nginx/nginx.conf # config: /etc/sysconfig/nginx # pidfile: /var/run/nginx.pid # Source function library. . /etc/rc.d/init.d/functions # Source networking configuration. . /etc/sysconfig/network # Check that networking is up. [ "$NETWORKING" = "no" ] && exit 0 nginx="/usr/sbin/nginx" prog=$(basename $nginx) NGINX_CONF_FILE="/etc/nginx/nginx.conf" [ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx lockfile=/var/lock/subsys/nginx start() { [ -x $nginx ] || exit 5 [ -f $NGINX_CONF_FILE ] || exit 6 echo -n $"Starting $prog: " daemon $nginx -c $NGINX_CONF_FILE retval=$? echo [ $retval -eq 0 ] && touch $lockfile return $retval } stop() { echo -n $"Stopping $prog: " killproc $prog -QUIT retval=$? echo [ $retval -eq 0 ] && rm -f $lockfile return $retval killall -9 nginx } restart() { configtest || return $? stop sleep 1 start } reload() { configtest || return $? echo -n $"Reloading $prog: " killproc $nginx -HUP RETVAL=$? echo } force_reload() { restart } configtest() { $nginx -t -c $NGINX_CONF_FILE } rh_status() { status $prog } rh_status_q() { rh_status >/dev/null 2>&1 } case "$1" in start) rh_status_q && exit 0 $1 ;; stop) rh_status_q || exit 0 $1 ;; restart|configtest) $1 ;; reload) rh_status_q || exit 7 $1 ;; force-reload) force_reload ;; status) rh_status ;; condrestart|try-restart) rh_status_q || exit 0 ;; *) echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}" exit 2 esac3、赋予脚本执行权限。
# chmod +x /etc/init.d/nginx
4、添加至服务管理列表,设置开机自启。
# chkconfig --add nginx # chkconfig nginx on5、启动服务。
# service nginx start
6、浏览器访问可看到默认欢迎页面。
步骤三:安装mysql
1、准备编译环境。
# yum groupinstall "Server Platform Development" "Development tools" -y # yum install cmake -y2、准备mysql数据存放目录。
# mkdir /mnt/data # groupadd -r mysql # useradd -r -g mysql -s /sbin/nologin mysql # id mysql uid=497(mysql) gid=498(mysql) groups=498(mysql)3、更改数据目录属主属组。
# chown -R mysql:mysql /mnt/data
4、解压编译官网下载稳定版的源码包。
# tar xvf mysql-5.6.24.tar.gz -C /usr/local/src # cd /usr/local/src/mysql-5.6.24 # cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ -DMYSQL_DATADIR=/mnt/data \ -DSYSCONFDIR=/etc \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DWITH_ARCHIVE_STORAGE_ENGINE=1 \ -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \ -DWITH_READLINE=1 \ -DWITH_SSL=system \ -DWITH_ZLIB=system \ -DWITH_LIBWRAP=0 \ -DMYSQL_TCP_PORT=3306 \ -DMYSQL_UNIX_ADDR=/tmp/mysql.sock \ -DDEFAULT_CHARSET=utf8 \ -DDEFAULT_COLLATION=utf8_general_ci # make && make install5、修改安装目录的属组为mysql。
# chown -R mysql:mysql /usr/local/mysql/
6、初始化数据库。
# /usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/mnt/data/
注:在CentOS 6.5版操作系统的最小安装完成后,在/etc目录下会存在一个my.cnf,需要将此文件更名为其他的名字,如:/etc/my.cnf.bak,否则,该文件会干扰源码安装的MySQL的正确配置,造成无法启动。
7、拷贝配置文件和启动脚本。
# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld # chmod +x /etc/init.d/mysqld # cp support-files/my-default.cnf /etc/my.cnf8、设置开机自动启动。
# chkconfig mysqld on # chkconfig --add mysqld9、修改配置文件中的安装路径及数据目录存放路径。
# echo -e "basedir = /usr/local/mysql\ndatadir = /mnt/data\n" >> /etc/my.cnf
10、设置PATH环境变量。
# echo "export PATH=$PATH:/usr/local/mysql/bin" > /etc/profile.d/mysql.sh # source /etc/profile.d/mysql.sh11、启动服务。
# service mysqld start # mysql -h 127.0.0.1步骤四:安装php-fpm
Nginx本身不能处理PHP,作为web服务器,当它接收到请求后,不支持对外部程序的直接调用或者解析,必须通过FastCGI进行调用。如果是PHP请求,则交给PHP解释器处理,并把结果返回给客户端。PHP-FPM是支持解析php的一个FastCGI进程管理器。提供了更好管理PHP进程的方式,可以有效控制内存和进程、可以平滑重载PHP配置。
1、安装依赖包。
# yum groupinstall "X Software Development" # yum install libmcrypt libmcrypt-devel mhash mhash-devel libxml2 libxml2-devel bzip2 bzip2-devel2、解压官网下载的源码包,编译安装。
# tar xvf php-5.6.23.tar.bz2 -C /usr/local/src # cd /usr/local/src/php-5.6.23 # ./configure --prefix=/usr/local/php \ --with-config-file-scan-dir=/etc/php.d \ --with-config-file-path=/etc \ --with-mysql=/usr/local/mysql \ --with-mysqli=/usr/local/mysql/bin/mysql_config \ --enable-mbstring \ --with-freetype-dir \ --with-jpeg-dir \ --with-png-dir \ --with-zlib \ --with-libxml-dir=/usr \ --with-openssl \ -enable-xml \ --enable-sockets \ --enable-fpm \ --with-mcrypt \ --with-bz2 # make && make install3、添加php和php-fpm配置文件。
# cp /usr/local/src/php-5.6.23/php.ini-production /etc/php.ini # cd /usr/local/php/etc/ # cp php-fpm.conf.default php-fpm.conf # sed -i 's@;pid = run/php-fpm.pid@pid = /usr/local/php/var/run/php-fpm.pid@' php-fpm.conf4、添加php-fpm启动脚本。
# cp /usr/local/src/php-5.6.23/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm # chmod +x /etc/init.d/php-fpm5、添加php-fpm至服务列表并设置开机自启。
# chkconfig --add php-fpm # chkconfig --list php-fpm # chkconfig php-fpm on6、启动服务。
# service php-fpm start
7、添加nginx对fastcgi的支持,首先备份默认的配置文件。
# cp /etc/nginx/nginx.conf /etc/nginx/nginx.confbak # cp /etc/nginx/nginx.conf.default /etc/nginx/nginx.conf编辑/etc/nginx/nginx.conf,在所支持的主页面格式中添加php格式的主页,类似如下:
location / { root /usr/local/nginx/html; index index.php index.html index.htm; }取消以下内容前面的注释:
location ~ \.php$ { root /usr/local/nginx/html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html/$fastcgi_script_name; include fastcgi_params; }重新载入nginx的配置文件。
# service nginx reload
在/usr/local/nginx/html/新建index.php的测试页面,内容如下。
# cat index.php <?php $conn=mysql_connect('127.0.0.1','root',''); if ($conn){ echo "LNMP platform connect to mysql is successful!"; }else{ echo "LNMP platform connect to mysql is failed!"; } phpinfo(); ?>
浏览器访问测试,如看到以下内容则表示LNMP平台构建完成。
原文地址:https://help.aliyun.com/document_detail/50700.html
在UEFI+GPT下使用rEFind实现Win10 + Kali2.0 双引导 Linux
前言:转载这篇文章主要是因为以下几点原因:
- 我的这篇博文主要是在硬盘分区为mbr+bios(更多gpt+mbr介绍点我)启动的情况下安装的Kali.详情:https://mrxn.net/Linux/363.html
- 这就导致后来很多同学通过搜索引擎搜索win10+Kali双系统来到那片文章,跟着操作,最后出现了不能添加引导的问题,在此表示抱歉.
-
关于easybcd出现一下的提示:
EFI Bootloader Detected! EasyBCD has detected that your machine is currently booting in EFI mode. Due to limitations set by Microsoft, many of EasyBCD’s multi-booting features cannot be used in EFI mode and have been disabled. Press ‘OK’ to continue or ‘Help’ to read more about these limitations and possible workarounds.
如图所示,在添加linux引导这里是灰色的不可选状态,easybcd的官方介绍看这里: EasyBCD and UEFI ,翻译过来的大致意思就是说:
检测到EFI引导的启动程序! EasyBCD已检测到您的机器是目前在EFI引导模式。由于微软设定的限制,许多EasyBCD其中的特性不能用于EFI模式,已经被禁用。 按“OK”继续或“帮助”来了解更多关于这些限制和可能的解决方法。
easybcd官方的意思大概是这样的:
起因缘由:
微软已经禁止加载遗留或非Windows操作系统从BCD菜单。这意味着你不能再使用easybcd添加Windows 9x,XP或Server 2003项BCD启动菜单。你也不能添加DOS,Linux,BSD,或MAC条目。你可以添加多个Windows Vista、Windows 7、Windows 8、Windows 10和条目;也可以引导到BCD型便携式媒体,如WinPE 2 +图像。
easybcd 100% UEFI的准备。在UEFI模式,多easybcd的功能将被禁用的安全您遵守限制微软放在bootloader,将阻止任何试图加载非微软签核(包括chainloaders)从顶层BCD菜单,它将创造100%项符合UEFI的其他安装Windows操作系统在你的电脑。这些限制都是不存在的不足easybcd也不能轻易绕过,他们已经到位,微软。
解决方法如下:
1 禁用uefi模式(分区模式转为非gpt格式)
2 使用虚拟机安装(这个当然纯属废话)
3 使用grub2 EFI作为你主要的启动管理器
详解如下
大多数个人电脑和笔记本电脑目前航运和使用UEFI固件和程序可以被配置为禁用UEFI完全相反,回到“遗产”引导模式。两个单独的步骤往往需要充分实现;我们有视觉引导和样本图像取自更常见的UEFI配置页面文件:
UEFI引导模式使传统PC
禁用安全启动
这些步骤不关闭UEFI(这是不可能的,因为那是你的主板运行),但他们却使你开机进入Windows传统的方式(通过MBR)。不过,您的Windows安装已在UEFI、GPT模式,和Windows UEFI启动装置无法通过传统MBR的方法!你需要的格式(确保完全重新初始化磁盘摆脱GPT)并重新安装Windows,或使用其他实用工具易回收的要领它可以将您现有的安装被引导在UEFI BIOS / GPT和MBR模式/地方,而不会丢失任何数据。执行一个单一的“自动修复”运行在easyre足以使您的Windows安装启动遗留/ MBR模式以及EFI / GPT模式。你可能需要给传统BIOS加载方式优先于你的BIOS设置/配置UEFI(负载遗产第一”)。
选项2:使用 虚拟机
随着近年来虚拟化技术的改进,运行另一个操作系统不再是痛苦(或几个,因为这件事)在一个虚拟机来代替双启动。使用任何流行的、免费的虚拟化软件Windows虚拟PC ,VirtualBox,或VMware服务器它可以安装Linux,旧版本的Windows、DOS等操作系统在一个所谓的“虚拟机”的外观和行为像一个电脑,但运行在桌面上的窗口–没有重新启动所需的–让你同时运行两个操作系统。这种方法是完全兼容的(独立的)MBR / UEFI的问题,并且应该在最现代的机器做工精细。在旧的机器或机器的内存限制的金额(在4或8钩),这是一个繁重的工作量,为您的PC,然而。
选项3:使用grub2 EFI作为你主要的启动管理器
easybcd控制Windows的启动菜单,历来被用作主要的启动管理器。与easybcd,可以添加条目为Linux和Windows的老顶层BCD菜单看到当你的机器第一靴版本。由于Windows启动管理器在UEFI模式下运行不支持传统的和非微软的操作系统的加载,另一种选择是可能的。
安装Linux或具有其自己的Bootloader船舶其他任何第三方的操作系统时,不要选择安装GRUB引导扇区是传统时,选择使用easybcd控制你的启动菜单,选择安装GRUB到MBR(或盘,在这种情况下),使它的主要启动你的电脑。您可以添加Windows启动菜单的grub2 EFI启动菜单–在这种情况下,你会看到GRUB的启动菜单时,你的电脑开始,从那里你可以选择Windows。你仍然可以使用easybcd控制Windows的启动菜单和设置多的靴子,再在BCD启动菜单配置Vista +条目,但与grub2 EFI菜单加载,你可以用它来启动到Linux和chainload NTLDR开机进入Windows 9x。
注:以上为机器翻译,大致看懂就行了,我也没去翻译成国语的那种语法模式,很累,我又懒!
至于怎么看自己的机器是否为mbr或者是gpt,知道的就不说了,不知道的下载一个easybcd不就知道了:) https://pan.baidu.com/s/1c201R8G(easybcd2.3)
我刚刚又看了一遍我的文章,我写了安装引导到主mbr上,和官方的第三种方式类似啊!算了,我不甩锅,这锅我背了....下面开始正式的介绍
在UEFI+GPT下使用rEFind实现Win10 + Kali2.0 双引导吧:
一、Win10和Kali2.0的安装:
1.Win10安装以及激活:
关于Win10的安装我就不再这里赘述,激活工具呢,kms之类的也有很多。
2.Kali2.0安装:
a.这个是kali2.0官网的下载地址:https://www.kali.org/downloads/,我下载的是64位的完整版。
b.然后我使用了UltraISO的写入硬盘映像功能,将kali2.0的ISO写入到U盘中
c.插上做好的启动U盘,调整启动首选项为USB,不同的电脑,会有不同修改方式,这个请自己百度之。
d.安装的步骤没有差别,只是需要在安装GRUB的时候,我们要停下来,然后跳过GRUB引导安装。
e.等待安装完成,重启后进入Windows系统
二、rEFind的安装以及双引导实现:
本部分最大的特点就是,你无须进入PE系统即可完成对于rEFind的安装和双引导的实现,就在Win下就可以了,相关工具软件下载:
软碟通UltraISO v9.5.3.2901 简体中文完美注册版 http://www.linuxidc.com/Linux/2012-11/74577.htm
DiskGenius 4.6.5 正式版发布下载 http://www.linuxidc.com/Linux/2014-10/108329.htm
BOOTICE: 引导扇区维护工具下载: http://www.linuxidc.com/Linux/2011-04/34185.htm
rEFind 到Linux公社资源站下载:
------------------------------------------分割线------------------------------------------
免费下载地址在 http://linux.linuxidc.com/
用户名与密码都是www.linuxidc.com
具体下载目录在 /2016年资料/7月/29日/在UEFI+GPT下使用rEFind实现Win10 + Kali2.0 双引导/
下载方法见 http://www.linuxidc.com/Linux/2013-07/87684.htm
------------------------------------------分割线------------------------------------------
一共四个工具(UltraISO是上个步骤用到的,实际上这步只用到其他的三个);
说了一大堆其实都是废话,现在进入正题:
1.rEFind的安装:
首先,打开DiskGenius,然后找到ESP分区也就是我们的EFi引导分区,右键选择“指派新的驱动器号(盘符)”
然后,你任意选择一个就可以了。
我选择了Z:
双击进入rEFind文件夹,我们开始搬文件了!
解压refind.zip
创建一个文件,仿照refind.conf-sample写一个文件,命名为refind.conf.
不会写也没关系,建个空文件也行,但是必须要有refind.conf,否者启动会报错,为了美观一点吧。
将里面的文件逐个放入,
注意:由于软件功能的限制,遇到文件夹时只能手动创建,文件倒是可以一次搬一个目录的
截图如下:
注意文件夹中的文件也要搬进来哦!
下边该使用另外一款工具了,名字叫BOOTICE
解压后你会发现有两个文件,一个是64位版本一个是32位版本,我是64位所以选择BOOTICEx64.exe,打开看到软件界面:
我们选择UEFI:
选择修改启动序列:
点击添加:
在这里直接输入路径:
当然这个也要看你一开始指派的盘符了,我之前指派的是Z:所以就是Z:\EFI\rEFind;
然后由于我是64位所以选择,
然后点击打开:
提示成功后,
修改菜单标题:
我修改成了rEFind,点击上移,
直到最顶端:
点击"保存当前启动设置(S)",
然后点击关闭。
重启你的计算机,
然后就能愉快的UEFI+GPT的模式下愉快的使用Win10和Kali2.0了。
3.小结
总结下,我这个教程的关键是使用rEFind来接管系统的启动,所以并没有安装grub!
本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-07/133717.htm
注:转载以方便更多初入门的小白同学,少走弯路.我们下回见!
Kali渗透测试演练Metasploitable靶机(附详细word文档+乌云_vmware_201606) Linux
Kali渗透测试演练Metasploitable靶机
准备工作:
l VM虚拟机(http://www.vmware.com/cn.html)
l Kali(https://www.offensive-security.com/kali-linux-vmware-virtualbox-image-download/)
l Metasploitable靶机(https://sourceforge.net/projects/metasploitable/)
l 要求Kali和靶机在同一个Lan段
在开始工作前都确认一一下是否在同一个Lan段,分别登录Kali和靶机使用ifconfig 命令查看
注意:Metasploitable的默认账号、密码是:msfadmin:msfadmin,Kali的默认是root:toor
命令:隐蔽扫描:nmap -sS 192.168.209.138
端口爆破:FTP、SSH等
工具:Hydra
备用字典:
l 爆破FTP
hydra -L /root/Desktop/user.txt -P /root/Desktop/pass.txt ftp://192.168.209.138
l 爆破ssh
hydra -L /root/Desktop/user.txt -P /root/Desktop/pass.txt 192.168.209.138 ssh
通过23端口telnet登录进系统
图片过多,我就不一一上传了,都在文档里面,主要包括以下的测试列表,初学者可以测试体验:
- 端口爆破:FTP、SSH等
- 利用metasploit进行端口渗透等
- 8180——-Apache Tomcat弱口令等
利用 iptables 折腾安全的服务器环境 Linux
0x00 概述
iptables 是 Linux 内核集成一套包过滤系统,并且可以实现状态防火墙,建立精细的包过滤列表,功能十分强大,所以选择折腾 iptables 来实现防火墙。
iptables 一共有 4 个表:filter,nat,mangle,raw
,5 个链:INPUT,OUTPUT,FORWARD,POSTROUTING,PREROUTING
。
功能
-
filter:实现防火墙一般的数据包过滤功能。(默认表)
- Chain: INPUT,OUTPUT,FORWARD
-
nat:网络地址转换。
- Chain: PREROUTING,POSTROUTING
-
mangle:修改数据包。
- Chain: INPUT,OUTPUT,FORWARD,POSTROUTING,PREROUTING
-
raw:不让 iptables 做数据包链接跟踪,提高性能。
- Chain: PREROUTING,OUTPUT
0x01 简单应用
iptables 有基础的命令还有可选的模块,在 Terminal 中直接可以使用man iptables
查看 iptables 的 man page (Online)。
清除现有 iptables 规则:iptables -F
or iptables --flush
(清除 Chain 中的所有规则,可以加上 -t
or --table
指定某个表,不指定则清除所有)。iptables -X
or iptables --delete-chain
(删除所有用户自定义的 Chain ,即通过 -n
or --new-chain
增加的 Chain )。iptables -Z
or iptables --zero
(清空封包计数器)。
设定默认策略:不符合任何一条规则的时候,按照设定好的默认策略处理,最安全的就是全部 DROP ,再单独添加例外,添加 DROP 的默认策略必须在 Console 下,不然 Terminal 会掉。
iptables -p INPUT DROP iptables -p OUTPUT DROP iptables -p FORWARD DROP
-p
or--policy
是为 Chain 添加默认策略。iptables 默认都是 ACCPET 的,如果需要删除此限制,改回 ACCPET 即可。
设置了 DROP 的默认策略之后,必须添加允许回环!
iptables -A INPUT -i lo -p all -j ACCEPT
iptables -A OUTPUT -o lo -p all -j ACCEPT
-i
or--in-interface
是定义入网 NIC 的,表示数据包从何进入,可以使用加号+
作为通配符,比如eth+
表示所有的 eth,也可以用感叹号!
进行排除匹配。
部分版本的 Linux 需要重启 iptables 服务才能生效(server iptables restart
or/etc/init.d/iptables restart
),我使用的是 Debian,现在 Debian 已经是实时生效 iptables 的了,不需要重启服务。也可以使用iptables-save > /home/iptables.rule
导出 iptables 规则,到时候再使用 iptables-restore
恢复。
开启允许通过的端口:如果刚刚上面设置了默认 DROP 策略,现在就要来设置例外规则了,不然任何流量出入都会被丢弃了。现在来开个 SSH(22)端口。
iptables -A INPUT -p tcp --dport 22 -j ACCEPT iptables -A INPUT -p tcp --sport 22 -j ACCEPT
-A
or--append
新增一条规则,默认是最后一条规则,如果需要插入优先级别更高的可以使用-I
or--insert
。-p
or--protocol
是指定协议,常见协议有:tcp,udp,icmp,igmp
等,可以使用all
匹配所有协议,在协议名称前加感叹号!
表示排除此协议,如!tcp
表示除了 tcp 协议以外的协议。--dport
or--destination-port
是目的端口,限制要访问的目的端口,可以用:
号表示范围,比如1:100
表示 1 - 100 端口。--sport
or--source-port
是来源端口,使用方法和目的端口一致。-j
or--jump
代表了处理动作,常见处理动作有:ACCEPT,REJECT,DROP,REDIRECT,MASQUERADE,LOG,DNAT,SNAT,MIRROR,QUEUE,RETURN,MARK
等,ACCPET 代表放行,REJECT 代表拒绝,DROP 代表丢弃,其他更多的说明请参考 man page。
如果要限制允许访问的 IP 来源地址,可以用 -s
or --src
or --source
来限制。
iptables -A INPUT -s 8.8.8.8 -p tcp --dport 22 -j ACCEPT iptables -A INPUT -m iprange --src-range 8.8.8.1-8.8.8.10 -p tcp --dport 22 -j ACCEPT
来源地址可以是单个 IP 地址,也可以是地址段
8.8.8.0/24
这种格式,如果要限定范围就需要用-m iprange --src-range
加范围限制,地址也可以使用感叹号!
进行排除匹配。
要开放常用端口,也可以使用 -m multiport --dport
参数。
iptables -A INPUT -m multiport --dport 21,22,80,3306,8000:8999 -p tcp -j ACCPET
禁止 ping:ping 是基于 ICMP 协议的,所以禁掉 ICMP 包就 OK 了。
iptables -A INPUT -p icmp -j DROP iptables -A OUTPUT -p icmp -j DROP
但是,用这种方式禁用掉 ICMP 协议,服务器就不可以发起 ping 请求,我们可以利用状态防火墙的特性,根据状态来过滤。先删除旧的策略。
iptables -D INPUT -p icmp -j DROP iptables -D OUTPUT -p icmp -j DROP
-D
or--delete
是用于删除规则,输入完整的策略即可删除。
iptables -A INPUT -p icmp --icmp-type Echo-Request -j DROP iptables -A INPUT -p icmp --icmp-type Echo-Reply -j ACCEPT iptables -A INPUT -p icmp --icmp-type destination-Unreachable -j ACCEPT
--icmp-type
是用于定位 ICMP 数据包的类型,可以使用iptables -p icmp --help
查看详细定义或者在 man page 中查看。这里选择 DROP 掉请求,但是允许返回报文通过。
丢弃状态为 INVALID 的 HTTP 数据包:状态为 INVALID 的都是无效的包,直接 DROP。
iptables -A INPUT -m state --state INVALID -j DROP iptables -A OUTPUT -m state --state INVALID -j DROP iptables -A FORWARD -m state --state INVALID -j DROP
-m state --state
是用来识别连接状态的,常见的有 4 种状态,NEW,INVALID,ESTABLISHED,RELATED
。
丢弃外网的私网源地址请求:服务器是公网的,没有内网互联机器,源地址是私网地址的基本都是 IP 欺骗,直接 DROP。
iptables -A INPUT -i eth0 -s 10.0.0.0/8 -j DROP iptables -A INPUT -i eth0 -s 172.16.0.0/12 -j DROP iptables -A INPUT -i eth0 -s 192.168.0.0/16 -j DROP
0x02 高级应用
防止 DDOS 和 CC 攻击:可以通过 iptables 记录访问过频,然后禁止掉过频密的请求。
iptables -A INPUT -p tcp --dport 80 --syn -m recent --name web_viewer --rcheck --seconds 60 --hitcount 10 -j LOG --log-prefix 'CC_ATTACK:' --log-ip-options iptables -A INPUT -p tcp --dport 80 --syn -m recent --name web_viewer --rcheck --seconds 60 --hitcount 10 -j DROP iptables -A INPUT -p tcp --dport 80 --syn -m recent --name web_viewer --set -j ACCEPT
每 60 秒只允许建立 10 个新连接,超出则丢弃。
防止 SSH 爆破:公网服务器总会被人爬到然后爆破 SSH 密码,直接用 iptables 中的 recent 模块将爆破的禁掉。
iptables -A INPUT -p tcp --dport 22 -m recent --name SSH_Brute --rcheck --seconds 300 --hitcount 3 -j DROP iptables -A INPUT -p tcp --dport 22 -m recent --name SSH_Brute --set -j ACCEPT
这里的流程就是,第一次发出 SSH 连接的时候,会先检查 SSH_Brute 列表中有无记录,并且是否满足 3 次,如果满足则丢弃,生存期是 5 分钟(300 秒),如果是第一次连接,自然不会符合第一条规则,所以就跳到第二条,将当前用户的 IP 添加到 SSH_Brute 表中,并允许此次通过。这样就可以限制了,5 分钟内,只能尝试 3 次,超出这个次数就会被 DROP。
但这样还是存在一个问题,就是每隔5分钟之后还是可以爆破,但我们又不能将时间设置得太长,不然我们自己管理都被 DROP 了请求,所以这里可以用 update
标签来代替 rcheck
标签。两者作用其实大致相同,只是处理流程不一样, rcheck
是从接受到数据包就开始计算时间,但是 update
是从最近的 DROP 数据包开始计算时间的,等于在一定时间内允许你发起 X 次连接,但一旦超出了,就开始 DROP 你的请求一定的时间。这样的过滤更加严格。
iptables -A INPUT -p tcp --dport 22 -m recent --name SSH_Brute --update --seconds 3600 --hitcount 3 -j DROP iptables -A INPUT -p tcp --dport 22 -m recent --name SSH_Brute --set -j ACCPET
与上面其实就是换成了
update
,作用是一旦发起了超过 3 次连接就禁止一个小时。
未完待续
原文地址:https://bobylive.com/static/1937069
CentOS设置程序开机自启动的方法 Linux
在CentOS系统下,主要有两种方法设置自己安装的程序开机启动。
1、把启动程序的命令添加到/etc/rc.d/rc.local文件中,比如下面的是设置开机启动httpd。
#!/bin/sh # # This script will be executed *after* all the other init scripts. # You can put your own initialization stuff in here if you don't # want to do the full Sys V style init stuff. touch /var/lock/subsys/local /usr/local/apache/bin/apachectl start
2、把写好的启动脚本添加到目录/etc/rc.d/init.d/,然后使用命令chkconfig设置开机启动。
例如:我们把httpd的脚本写好后放进/etc/rc.d/init.d/目录,使用
chkconfig --add httpd chkconfig httpd on
命令即设置好了开机启动。