Tag Archive: linux

十一月 29th, 2017
yw >outfile 2>&1
$ cat outfile 
cat: oyyw: 没有那个文件或目录

$ cat oyyw 2>&1 >outfile
cat: oyyw: 没有那个文件或目录

解惑

搜集了一部分资料以后,解答如下:

顺序是很重要的!命令的执行是自左向右的,因此:  * 对于第一个命令,shell首先读到>outfile(等同于1>outfile),此时标准输出重定向到了文件outfile,然后shell再读到2>&1,此时标准错误输出重定向到了标准输出,也就是重定向到了文件outfile,所以得到的结果是 标准输出标准错误输出都重定向到了文件outfile

  • 对于第二个命令,shell首先读到2>&1,此时标准错误输出重定向到了标准输出(可能是控制台),然后shell再读到>outfile(等同于1>outfile),此时标准输出重定向到了文件outfile,得到的结果是 标准错误输出输出到了控制台,标准输出输出到文件outfile

以下这个例子,应该可以很好解答上面的疑问了:

$ cat learn_redirect.sh 
#!/bin/bash

foo() {
    echo "This is stdout";        # 输出是标准输出
    echo "This is stderr" 1>&2;   # 输出是标准错误输出
}

foo >errlog 2>&1 >outfile
[pms@jq-hadoop ~/workspace/ouyangyewei/learn_linux] eth0 = xxx
$ sh learn_redirect.sh 
[pms@jq-hadoop ~/workspace/ouyangyewei/learn_linux] eth0 = xxx
$ cat outfile 
This is stdout
[pms@jq-hadoop ~/workspace/ouyangyewei/learn_linux] eth0 = xxx
$ cat errlog 
This is stderr

解释如下

foo >errlog 2>&1 >outfile 这一句命令,shell执行顺序是从左向右。首先shell读到>errlog,此时标准输出重定向到了文件errlog,然后shell读到2>&1,此时标准错误输出重定向到了标准输出(等同于标准错误输出重定向到了文件errlog),然后shell读到>outfile,此时标准输出重定向到文件outfile,因此,得到的结果是 标准错误输出输出到文件errlog中,标准输出输出到了文件outfile

十一月 29th, 2017
Linux系统让我们懂得了共享、开放、自由可以让人类生活的更加美好,开源精神是一种让每个从事Linux行业的技术人员从骨子里自豪的情怀,开源产品的兴盛受益于开源社区的强壮根基。Linux真的给了我很多,不仅仅是科技之美,更是生命之美。接下来我希望更加切实的谈一谈Linux,让我为你揭开Linux系统这贵妇的面纱,一探究竟,希望能够与你们产生共鸣! Linux操作系统最初是在1991年10月份由芬兰赫尔辛基大学的在校生Linus Torvalds 所发布的。是他,是他,就是他,我们的Linux之父Linus Torvalds!我看过很多的Linux书籍,在感谢语的部分,必须都得先感谢linus Torvalds,毕竟娶了女儿还得要感谢岳父不是吗?最初发布的Linux0.02版因其高质量与开放的源代码,迅速引起了一大批黑客的“围观”,而今虽然有数百计的Linux发行版,但依然都统一的使用Linus Torvalds开发/维护的系统内核,时代虽然变化,但留下了真正珍贵的东西—Linux的内核。 让我们看看Linux的优秀之处,我相信你们在学习或使用过程中会有深切的感受,无不感叹道:"Linux简直太好用了",你可以在这里下载并学习到Linux系统http://www.linuxprobe.com/,Linux相对于windows具有以下的优点。 l 稳定且有效率 l 免费或少许费用 l 漏洞少且快速修补 l 多任务、多用户 l 更加安全的用户及文件权限策略 l 适合小内核程序的嵌入式系统 l 相对不耗资源 看到了吧,这些都是Linux的优秀特性,可以说是“靓丽活泼”美少女,“高贵冷艳”美贵妇! 知道了优点,那么就来看看Linux初学者应该注意哪些事项吧,下面的内容仅仅希望能够给Linux初学者一点点帮助。这些都是Linux初学者需要注意的地方,我们学习的过程往往是一件苦差事,所以在学习的过程中能够找到和你志同道和的人或事物是一件非常幸福的事情,那么我推荐你去《Linux就该这么学》看看,不仅仅因为这本书的内容,更是因为这本书所提供的交流环境,有太多的Linux爱好者在这里学习、在这里成长,在这里找到了志同道合的朋友。 敲命令多使用tab键补全、写脚本时尽量复制 当使用了一段时间的Linux后, 我相信您会越来越熟练各种命令,这个时候人就很容易轻信自己,很容易导致错误的发生,如果我们在快敲完时,下意识的使用tab键,那么我们就可以很轻松的避免错误的发生。而在shell脚本中,我们的命令应尽量的从测试的命令行中复制,这样就可以避免因命令冗长而导致输错的危险。 用普通用户完成操作,尽量少使用root root这个超级账户,拥有着皇帝一样的权利。 权利越大,危险和需要注意的地方就越多,这不仅仅需要使用者具备良好的Linux技能,还需要一定的经验,所以对于初学者而言,还是尽量少使用root用户吧。当我们的某些操作需要root权限的时候,我们可以修改sudoers文件,让普通用户以root的权限去执行操作,这样我们既可以完成操作,也可以保证操作的安全,简直一个大写的PERFECT! 修改配置文件时记得备份 Linux配置文件往往对应着服务或系统的配置,所以我们一定要确保配置文件的正确性。所以我们在做任何操作之前,一定要考虑这样做是否是可逆的(操作之后,是否还可以恢复到操作之前的样子)。所以在修改之前先备份,就让操作拥有了可逆的属性,即使把配置文件删了,还有备份文件为我们做保障。 注意最最小原则 安装包的最小化:仅仅安装系统的基础包,不要一味的求全求大而安装上很多无用的包,这个时候我们的系统负担也会变大,消耗更多硬件资源。如果后续有需要其他的包或服务,我们完全可以通过yum等工具进行安装。 权限的最小化:任何用户都尽量给予普通用户权限,保证这个用户的最低权限需求,在有需要的时候再进行扩展,系统文件及目录的权限也需要控制,要注意不同的文件对于用户的不同权限,这样能够使文件更加的安全。
TAGS:
十一月 29th, 2017

1.Linux系统用来记录用户名、密码最重要的两个文件就是  /etc/password 和 /etc/shadow(默认只有root用户才有读取这个文件的权限,其他人完全没有读这个文件的可能)

2.UID  是用来区分不同用户的数字。

GID  是用于区分不同用户组的ID。

在Linux下每个用户都至少属于一个组。

要确认自己的UID,可以使用id命令来查看。

要确认自己所属的用户组,可以用 groups命令来确认。

3.新增用户: useradd

比如要加一个叫john的用户。

useradd john

对于系统来说,完成这个命令需要在后台执行很多对用户来说毫无感知的行为。

首先,系统需要将用户信息记录在 /etc/password中,一般会在  /etc/password 和 /etc/shadow 末尾追加一条记录,同时会分配给该用户一个UID。

接着,要为该用户自动创建家目录。家目录以创建的用户名为目录名,创建的路径在 /home 目录中。比如,在上述案例中,创建的目录将是  /home/john。

然后,复制 /etc/skel 下所有的文件至 /home/john。说明一下,如果你使用 ls -l /etc/skel命令查看,可以发现这个目录下什么都没有,但事实上,该目录下面有很多隐藏文件,使用 ls -la /etc/skel就可以看到其中还是有好几个文件的。

最后,新建一个与该用户名一样的用户组。

用法:

•使用 -u参数为用户指定UID

useradd -u 555 user1

•指定新用户的GID

useradd -g user1 group1

•指定新用户的 家目录

useradd -d /home/mydir3 user3

修改用户密码

password

TAGS:
十月 30th, 2017

在某地,用git clone 下载 github上的仓库的时候,速度很慢,才几十k每秒,稍微大点的仓库,要等到猴年马月。一直用git clone从github上下载源码学习,但是有时候git clone速度好慢,只有几Kb的速度,按这个速度下载有些源码的话估计要下一年。

然后我再网上找各种教程,试过通过vps下载github的源码,速度还是很慢,不知道是不是我用的vps刚好屏蔽了github。有人说git clone用的是另一个域名来下载的:global-ssl.fastly.Net,难怪我在hosts里面加了github.com的dns还是没解决问题。

github加速的方法如下:

1.用记事本打开hosts文件

Windows上的hosts文件路径在

C:\Windows\System32\drivers\etc\hosts

Linux的hosts文件路径在:

sudo vim /etc/hosts

2. 在hosts文件末尾添加两行

  • 151.101.72.249 http://global-ssl.fastly.net
  • 192.30.253.112 http://github.com

3.重启电脑,让hosts文件生效。

你会发现git clone的速度快很多。

TAGS:
十月 29th, 2017

ctrl+c,ctrl+d,ctrl+z在linux中意义和区别

ctrl+c和ctrl+z都是中断命令,但是他们的作用却不一样.

 

ctrl+c是强制中断程序的执行。

 

ctrl+z的是将任务中断,但是此任务并没有结束,他仍然在进程中他只是维持挂起的状态,用户可以使用fg/bg操作继续前台或后台的任务,fg命令重新启动前台被中断的任务,bg命令把被中断的任务放在后台执行.

 

例如:当你vi一个文件是,如果需要用shell执行别的操作,但是你又不打算关闭vi,因为你得存盘推出,你可以简单的按下ctrl+z,shell会将vi进程挂起~,当你结束了那个shell操作之后,你可以用fg命令继续vi你的文件。

 

ctrl-d 不是发送信号,而是表示一个特殊的二进制值,表示 EOF。

TAGS:
十月 13th, 2017

一、Linux源码包安装过程

用于linux源码安装软件,一般下载源码包得到文件:file.tar.gz和file.tar.bz2格式
(1)解压缩

解压命令为:
  tar jxvf file.tar.bz2
  tar zxvf file.tar.gz

(2)配置文件

cd …/file

./configure    ……

(3)编译文件

  make

(4)安装文

 

make install
(5)删除一些临时文件
  make clean
make clean:清除编译产生的可执行文件及目标文件(object file,*.o)
make distclean:除了清除可执行文件和目标文件外,把configure所产生的Makefile也清除掉

make dist:将程序和相关的档案包装成一个压缩文件以供发布。执行完在目录下会产生一个以PACKAGE-VERSION.tar.gz为名称的文件。 PACKAGE和VERSION这两个变数是根据configure.in文件中AM_INIT_AUTOMAKE(PACKAGE,VERSION)的定义。在此范例中会产生test-1.0.tar.gz的档案。

make distcheck:和make dist类似,但是加入检查包装后的压缩文件是否正常。这个目标除了把程序和相关文件包装成tar.gz文件外,还会自动把这个压缩文件解开,执行 configure,并且进行make all 的动作,确认编译无误后,会显示这个tar.gz文件可供发布了。这个检查非常有用,检查过关的包,基本上可以给任何一个具备GNU开发环境-的人去重新编译


(5)卸载文件
make uninstall

二、编译和运行一个简单的main.c文件

编译和运行一个简单的c语言源文件main.c,需要自动生成一个makefile,

以下是步骤:

第一步:

创建一个文件main.c在一定的目录/home/hufeihu/project/main下面:

————————————————

在main.c文件中写入一下的语句

#include <stdio.h>

int main(int argc, char** argv)

{

printf(“Hello, Auto Makefile!\n”);

return 0;

}

————————————————

此时状态如下:

root@hufeihu:/home/hufeihu/project/main# pwd
/home/hufeihu/project/mainroot@hufeihu:/home/hufeihu/project/main# ls
main.c
root@hufeihu:/home/hufeihu/project/main#

第二步:

———-

运行 autoscan , 自动创建两个文件: autoscan.log configure.scan

此时状态如下:

root@hufeihu:/home/hufeihu/project/main# autoscan

root@hufeihu:/home/hufeihu/project/main# ls
autoscan.log  configure.scan  main.c

root@hufeihu:/home/hufeihu/project/main#

第三步:

———-

修改configure.scan的文件名为configure.in

查看configure.in的内容:

————————————————

# -*-Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ([2.69])
AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
AC_CONFIG_SRCDIR([main.c])
AC_CONFIG_HEADERS([config.h])

# Checks for programs.
AC_PROG_CC

# Checks for libraries.

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.

AC_OUTPUT

 

————————————————

解读以上的文件:

————————————————

#                                               -*- Autoconf -*-

# Process this file with autoconf to produce a configure script.

# AC_PREREQ:

# 确保使用的是足够新的Autoconf版本。如果用于创建configure的Autoconf的版

# 本比version 要早,就在标准错误输出打印一条错误消息并不会创建configure。

AC_PREREQ(2.69)

#

# 初始化,定义软件的基本信息,包括设置包的全称,版本号以及报告BUG时需要用的邮箱地址

#

AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)

#

# 用来侦测所指定的源码文件是否存在,来确定源码目录的有效性

#

AC_CONFIG_SRCDIR([main.c])

#

# 用于生成config.h文件,以便autoheader使用

#

AC_CONFIG_HEADER([config.h])

# Checks for programs.

AC_PROG_CC

# Checks for libraries.

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.

#

# 创建输出文件。在`configure.in’的末尾调用本宏一次。

#

AC_OUTPUT

————————————————

修改动作:

1.修改AC_INIT里面的参数: AC_INIT(main,1.0, hufeihu@163.com)

2.添加宏AM_INIT_AUTOMAKE, 它是automake所必备的宏,也同前面一样,PACKAGE是所要产生软件套件的名称,VERSION是版本编号。

3.在AC_OUTPUT后添加输出文件Makefile

修改后的结果:

————————————————

#                                               -*- Autoconf -*-

# Process this file with autoconf to produce a configure script.

AC_PREREQ(2.61)

AC_INIT(main, 1.0, hufeihu@163.com)

AC_CONFIG_SRCDIR([main.c])

AC_CONFIG_HEADER([config.h])

AM_INIT_AUTOMAKE(main,1.0)

# Checks for programs.

AC_PROG_CC

# Checks for libraries.

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.

AC_OUTPUT([Makefile])

————————————————

第四步:

运行 aclocal, 生成一个“aclocal.m4”文件和一个缓冲文件夹autom4te.cache,该文件主要处理本地的宏定义。

此时的状态是:

root@hufeihu:/home/hufeihu/project/main# aclocal
aclocal: warning: autoconf input should be named 'configure.ac', not 'configure.in'
root@hufeihu:/home/hufeihu/project/main# ls
aclocal.m4  autom4te.cache  autoscan.log  configure.in  main.c
root@hufeihu:/home/hufeihu/project/main# 

第五步:

运行 autoconf, 目的是生成 configure

此时的状态是:

root@hufeihu:/home/hufeihu/project/main# autoconf
root@hufeihu:/home/hufeihu/project/main# ls
aclocal.m4  autom4te.cache  autoscan.log  configure  configure.in  main.c
root@hufeihu:/home/hufeihu/project/main# 

第六步:

运行 autoheader,它负责生成config.h.in文件。该工具通常会从“acconfig.h”文件中复制用户附加的符号定义,因此此处没有附加符号定义,所以不需要创建“acconfig.h”文件。

此时的状态是:

root@hufeihu:/home/hufeihu/project/main#  autoheader
root@hufeihu:/home/hufeihu/project/main# ls
aclocal.m4      autoscan.log  configure     main.c
autom4te.cache  config.h.in   configure.in
root@hufeihu:/home/hufeihu/project/main# 

第七步:

下面即将运行 automake, 但在此之前应该做一下准备工作!

首先

创建一个 Makefile.am.这一步是创建Makefile很重要的一步,automake要用的脚本配置文件是Makefile.am,用户需要自己创建相应的文件。之后,automake工具转换成Makefile.in。

这个Makefile.am的内容如下:

————————————————

AUTOMAKE_OPTIONS=foreign

bin_PROGRAMS=main

main_SOURCES=main.c

————————————————

下面对该脚本文件的对应项进行解释。

其中的AUTOMAKE_OPTIONS为设置automake的选项。由于GNU(在第1章中已经有所介绍)对自己发布的软件有严格的规范,比如必须附 带许可证声明文件COPYING等,否则automake执行时会报错。automake提供了三种软件等级:foreign、gnu和gnits,让用 户选择采用,默认等级为gnu。在本例使用foreign等级,它只检测必须的文件。

bin_PROGRAMS定义要产生的执行文件名。如果要产生多个执行文件,每个文件名用空格隔开。

main_SOURCES定义“main”这个执行程序所需要的原始文件。如果”main”这个程序是由多个原始文件所产生的,则必须把它所用到的所有原 始文件都列出来,并用空格隔开。例如:若目标体“main”需要“main.c”、“sunq.c”、“main.h”三个依赖文件,则定义 main_SOURCES=main.c sunq.c main.h。要注意的是,如果要定义多个执行文件,则对每个执行程序都要定义相应的file_SOURCES。

其次

使用automake对其生成“configure.in”文件,在这里使用选项“—adding-missing”可以让automake自动添加有一些必需的脚本文件。

运行后的状态是:

————————————————

root@hufeihu:/home/hufeihu/project/main# automake –add-missing

configure.in:8: installing `./missing’

configure.in:8: installing `./install-sh’

Makefile.am: installing `./depcomp’

root@hufeihu:/home/hufeihu/project/main# ls

aclocal.m4      config.h.in   configure.in~ main.c        Makefile.in

autom4te.cache configure     depcomp        Makefile.am missing

autoscan.log    configure.in install-sh     Makefile.am~

root@hufeihu:/home/hufeihu/project/main#

————————————————

第八步

运行configure,在这一步中,通过运行自动配置设置文件configure,把Makefile.in变成了最终的Makefile。

运行的结果如下:

————————————————

root@hufeihu:/home/hufeihu/project/main# ./configure
checking for a BSD-compatible install… /usr/bin/install -c
checking whether build environment is sane… yes
checking for a thread-safe mkdir -p… /bin/mkdir -p
checking for gawk… gawk
checking whether make sets $(MAKE)… yes
checking whether make supports nested variables… yes
checking for gcc… gcc
checking whether the C compiler works… yes
checking for C compiler default output file name… a.out
checking for suffix of executables…
checking whether we are cross compiling… no
checking for suffix of object files… o
checking whether we are using the GNU C compiler… yes
checking whether gcc accepts -g… yes
checking for gcc option to accept ISO C89… none needed
checking whether gcc understands -c and -o together… yes
checking for style of include used by make… GNU
checking dependency style of gcc… gcc3
checking that generated files are newer than configure… done
configure: creating ./config.status
config.status: creating Makefile
config.status: creating config.h
config.status: executing depfiles commands
root@hufeihu:/home/hufeihu/project/main#

root@hufeihu:/home/hufeihu/project/main# ls

aclocal.m4      config.h.in    configure.in   main.c        Makefile.in

autom4te.cache config.log     configure.in~ Makefile     missing

autoscan.log    config.status depcomp        Makefile.am  stamp-h1

config.h        configure      install-sh     Makefile.am~

root@hufeihu:/home/hufeihu/project/main#

————————————————

第九步

运行 make,对配置文件Makefile进行测试一下

此时的状态如下:

————————————————

root@hufeihu:/home/hufeihu/project/main# make
make  all-am
make[1]: Entering directory '/home/hufeihu/project/main'
gcc -DHAVE_CONFIG_H -I.     -g -O2 -MT main.o -MD -MP -MF .deps/main.Tpo -c -o main.o main.c
mv -f .deps/main.Tpo .deps/main.Po
gcc  -g -O2   -o main main.o  
make[1]: Leaving directory '/home/hufeihu/project/main'
root@hufeihu:/home/hufeihu/project/main# 

root@hufeihu:/home/hufeihu/project/main#  ls

aclocal.m4      autoscan.log config.h.in config.status configure.in   depcomp    main    main.o    Makefile.am   Makefile.in stamp-h1

autom4te.cache config.h      config.log   configure      configure.in~ install-sh main.c Makefile Makefile.am~ missing

[root@localhost main]#

————————————————

第十步

运行生成的文件 main:

————————————————

root@hufeihu:/home/hufeihu/project/main#  ./main

Hello, Auto Makefile!

总结一下,使用automake自动生成makefile的过程主要有

1、建立好源文件以后到源文件所在目录

2、autoscan命令 将configure.scan文件修改为configure.in
          修改configure.in文件中的内容:
               AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)修改为AC_INIT(main, 1.0,hufeihu@163.com)
        在AC_CONFIG_HEADER([config.h])后面添加AM_INIT_AUTOMAKE(main,1.0)
          在最后添加AC_OUTPUT([Makefile])
3、运行aclocal
4、运行autoconf
5、运行autoheader
6、创建Makefile.am文件,内容为
     AUTOMAKE_OPTIONS=foreign

bin_PROGRAMS=main 如果有多个用空格分开

     main_SOURCES=main.c 定义main所需源文件,多个可执行文件分别定义
7、运行automake –add-missing
8、运行./configure
9、运行make

在第六步中需要自己写Makefile.am文件,特别是其中的main_SOURCES需要把生成main所以来的文件都包含进来。并且那些间接依赖的文件也需要包含进来。比如说我有三个文件:main.cpp Add.cpp Add.h  Num.h Num.cpp其中在main.cpp中包含了Add.h  在Add.cpp中包含了Num.h这样在完成main的依赖文件时就需要包含以上所有的问个文件main.cpp Add.cpp Add.h  Num.h Num.cpp才可以。

TAGS:
九月 28th, 2017

IPTables 包括一组内置和由用户定义规则的「链」,管理员可以在「链」上附加各种数据包处理规则。

  • FILTER 默认过滤表,内建的链有:
    • INPUT:处理流入本地的数据包
    • FORWARD:处理通过系统路由的数据包
    • OUTPUT:处理本地流出的数据包
  • NAT 实现网络地址转换的表,内建的链有:
    • PREROUTING:处理即将接收的数据包
    • OUTPUT:处理本地产生的数据包
    • POSTROUTING:处理即将传出的数据包
  • MANGLE 此表用于改变数据包,共 5 条链:
    • PREROUTING:处理传入连接
    • OUTPUT:处理本地生成的数据包
    • INPUT:处理报文
    • POSTROUTING:处理即将传出数据包
    • FORWARD:处理通过本机转发的数据包

接下来我们将由简入难介绍 25 条 Linux 管理员最常会用到的 IPTables 规则。

1、启动、停止和重启IPTables

虽然 IPTables 并不是一项服务,但在 Linux 中还是可以像服务一样对其状态进行管理。

基于SystemD的系统

systemctl start iptables
systemctl stop iptables
systemctl restart iptables

基于SysVinit的系统

 /etc/init.d/iptables start
/etc/init.d/iptables stop
/etc/init.d/iptables restart
2、查看IPtables防火墙策略

你可以使用如下命令来查看 IPtables 防火墙策略:

 iptables -L -n -v

以上命令应该返回数据下图的输出:

20条IPTables防火墙规则用法!20条IPTables防火墙规则用法!

以上命令是查看默认的 FILTER 表,如果你只希望查看特定的表,可以在 -t 参数后跟上要单独查看的表名。例如只查看 NAT 表中的规则,可以使用如下命令:

 iptables -t nat -L -v –n
3、屏蔽某个IP地址

如果你发布有某个 IP 向服务器导入攻击或非正常流量,可以使用如下规则屏蔽其 IP 地址:

 iptables -A INPUT -s xxx.xxx.xxx.xxx -j DROP

注意需要将上述的 XXX 改成要屏蔽的实际 IP 地址,其中的 -A 参数表示在 INPUT 链的最后追加本条规则。(IPTables 中的规则是从上到下匹配的,一旦匹配成功就不再继续往下匹配)

如果你只想屏蔽 TCP 流量,可以使用 -p 参数的指定协议,例如:

iptables -A INPUT -p tcp -s xxx.xxx.xxx.xxx -j DROP
4、解封某个IP地址

要解封对 IP 地址的屏蔽,可以使用如下命令进行删除:

 iptables -D INPUT -s xxx.xxx.xxx.xxx -j DROP

其中 -D 参数表示从链中删除一条或多条规则。

5、使用IPtables关闭特定端口

很多时候,我们需要阻止某个特定端口的网络连接,可以使用 IPtables 关闭特定端口。

阻止特定的传出连接:

 iptables -A OUTPUT -p tcp --dport xxx -j DROP

阻止特定的传入连接:

iptables -A INPUT -p tcp --dport xxx -j ACCEPT
6、使用Multiport控制多端口

使用 multiport 我们可以一次性在单条规则中写入多个端口,例如:

iptables -A INPUT  -p tcp -m multiport --dports 22,80,443 -j ACCEPT
iptables -A OUTPUT -p tcp -m multiport --sports 22,80,443 -j ACCEPT
7、在规则中使用 IP 地址范围

在 IPtables 中 IP 地址范围是可以直接使用 CIDR 进行表示的,例如:

iptables -A OUTPUT -p tcp -d 192.168.100.0/24 --dport 22 -j ACCEPT
8、配置端口转发

有时我们需要将 Linux 服务器的某个服务流量转发到另一端口,此时可以使用如下命令:

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 25 -j REDIRECT --to-port 2525

上述命令会将所有到达 eth0 网卡 25 端口的流量重定向转发到 2525 端口。

9、屏蔽HTTP服务Flood攻击

有时会有用户在某个服务,例如 HTTP 80 上发起大量连接请求,此时我们可以启用如下规则:

iptables -A INPUT -p tcp --dport 80 -m limit --limit 100/minute --limit-burst 200 -j ACCEPT

上述命令会将连接限制到每分钟 100 个,上限设定为 200。

10、禁止PING

对 Linux 禁 PING 可以使用如下规则屏蔽 ICMP 传入连接:

iptables -A INPUT -p icmp -i eth0 -j DROP
11、允许访问回环网卡

环回访问(127.0.0.1)是比较重要的,建议大家都开放:

iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
12、屏蔽指定MAC地址

使用如下规则可以屏蔽指定的 MAC 地址:

iptables -A INPUT -m mac --mac-source 00:00:00:00:00:00 -j DROP
13、限制并发连接数

如果你不希望来自特定端口的过多并发连接,可以使用如下规则:

iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 3 -j REJECT

以上规则限制每客户端不超过 3 个连接。

14、清空IPtables规则

要清空 IPtables 链可以使用如下命令:

iptables -F

要清空特定的表可以使用 -t 参数进行指定,例如:

iptables -t nat –F
15、保存IPtables规则

默认情况下,管理员对 IPtables 规则的操作会立即生效。但由于规则都是保存在内存当中的,所以重启系统会造成配置丢失,要永久保存 IPtables 规则可以使用 iptables-save 命令:

iptables-save > ~/iptables.rules

保存的名称大家可以自己改。

16、还原IPtables规则

有保存自然就对应有还原,大家可以使用 iptables-restore 命令还原已保存的规则:

iptables-restore < ~/iptables.rules
17、允许建立相关连接

随着网络流量的进出分离,要允许建立传入相关连接,可以使用如下规则:

iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

允许建立传出相关连接的规则:

iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT
18、丢弃无效数据包

很多网络攻击都会尝试用黑客自定义的非法数据包进行尝试,我们可以使用如下命令来丢弃无效数据包:

iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
19、IPtables屏蔽邮件发送规则

如果你的系统不会用于邮件发送,我们可以在规则中屏蔽 SMTP 传出端口:

iptables -A OUTPUT -p tcp --dports 25,465,587 -j REJECT
20、阻止连接到某块网卡

如果你的系统有多块网卡,我们可以限制 IP 范围访问某块网卡:

iptables -A INPUT -i eth0 -s xxx.xxx.xxx.xxx -j DROP

源地址可以是 IP 或 CIDR。

原文来自:https://www.sysgeek.cn/iptables-firewall-rules-examples/

本文地址:http://www.linuxprobe.com/20iptables.html

九月 28th, 2017
当你查看你的 SSH 服务日志,可能你会发现充斥着一些不怀好意的尝试性登录。这里有 5 条常规建议(和一些个别特殊策略)可以让你的 OpenSSH 会话更加安全。
强化密码登录

密码登录很方便,因为你可以从任何地方的任何机器上登录。但是它们在暴力攻击面前也是脆弱的。尝试以下策略来强化你的密码登录。

  • 使用一个密码生成工具,例如 pwgen。pwgen 有几个选项,最有用的就是密码长度的选项(例如,pwgen 12产生一个12位字符的密码)
  • 不要重复使用密码。忽略所有那些不要写下你的密码的建议,然后将你的所有登录信息都记在一个本子上。如果你不相信我的建议,那总可以相信安全权威 Bruce Schneier 吧。如果你足够细心,没有人能够发现你的笔记本,那么这样能够不受到网络上的那些攻击。
  • 你可以为你的登录记事本增加一些额外的保护措施,例如用字符替换或者增加新的字符来掩盖笔记本上的登录密码。使用一个简单而且好记的规则,比如说给你的密码增加两个额外的随机字符,或者使用单个简单的字符替换,例如 “#” 替换成 “*”。
  • 为你的 SSH 服务开启一个非默认的监听端口。是的,这是很老套的建议,但是它确实很有效。检查你的登录;很有可能 22 端口是被普遍攻击的端口,其他端口则很少被攻击。
  • 使用 Fail2ban 来动态保护你的服务器,是服务器免于被暴力攻击。
  • 使用不常用的用户名。绝不能让 root 可以远程登录,并避免用户名为“admin”。
解决 Too Many Authentication Failures 报错

当我的 ssh 登录失败,并显示“Too many authentication failures for carla”的报错信息时,我很难过。我知道我应该不介意,但是这报错确实很碍眼。而且,正如我聪慧的奶奶曾经说过,伤痛之感并不能解决问题。解决办法就是在你的(客户端的)

~/.ssh/config

文件设置强制密码登录。如果这个文件不存在,首先创个

~/.ssh/

目录。

$ mkdir ~/.ssh
$ chmod 700 ~/.ssh

然后在一个文本编辑器创建

~/.ssh/confg

文件,输入以下行,使用你自己的远程域名替换 HostName。

HostName remote.site.com
PubkeyAuthentication=no

(LCTT 译注:这种错误发生在你使用一台 Linux 机器使用 ssh 登录另外一台服务器时,你的 .ssh 目录中存储了过多的私钥文件,而 ssh 客户端在你没有指定 -i 选项时,会默认逐一尝试使用这些私钥来登录远程服务器后才会提示密码登录,如果这些私钥并不能匹配远程主机,显然会触发这样的报错,甚至拒绝连接。因此本条是通过禁用本地私钥的方式来强制使用密码登录——显然这并不可取,如果你确实要避免用私钥登录,那你应该用 -o PubkeyAuthentication=no 选项登录。显然这条和下两条是互相矛盾的,所以请无视本条即可。)

使用公钥认证

公钥认证比密码登录安全多了,因为它不受暴力密码攻击的影响,但是并不方便因为它依赖于 RSA 密钥对。首先,你要创建一个公钥/私钥对。下一步,私钥放于你的客户端电脑,并且复制公钥到你想登录的远程服务器。你只能从拥有私钥的电脑登录才能登录到远程服务器。你的私钥就和你的家门钥匙一样敏感;任何人获取到了私钥就可以获取你的账号。你可以给你的私钥加上密码来增加一些强化保护规则。

使用 RSA 密钥对管理多个用户是一种好的方法。当一个用户离开了,只要从服务器删了他的公钥就能取消他的登录。

以下例子创建一个新的 3072 位长度的密钥对,它比默认的 2048 位更安全,而且为它起一个独一无二的名字,这样你就可以知道它属于哪个服务器。

$ ssh-keygen -t rsa -b 3072 -f id_mailserver

以下创建两个新的密钥,

id_mailserver

id_mailserver.pub
id_mailserver

是你的私钥–不要传播它!现在用

ssh-copy-id

命令安全地复制你的公钥到你的远程服务器。你必须确保在远程服务器上有可用的 SSH 登录方式。

$ ssh-copy-id -i  id_rsa.pub user@remoteserver

/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
user@remoteserver's password:

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'user@remoteserver'"
and check to make sure that only the key(s) you wanted were added.

ssh-copy-id 会确保你不会无意间复制了你的私钥。从上述输出中复制登录命令,记得带上其中的单引号,以测试你的新的密钥登录。

$ ssh 'user@remoteserver'

它将用你的新密钥登录,如果你为你的私钥设置了密码,它会提示你输入。

取消密码登录

一旦你已经测试并且验证了你的公钥可以登录,就可以取消密码登录,这样你的远程服务器就不会被暴力密码攻击。如下设置你的远程服务器

/etc/sshd_config

文件。

PasswordAuthentication no

然后重启服务器上的 SSH 守护进程。

设置别名 — 这很快捷而且很酷

你可以为你的远程登录设置常用的别名,来替代登录时输入的命令,例如

ssh -u username -p 2222 remote.site.with.long-name

你可以使用

ssh remote1

你的客户端机器上的 ~/.ssh/config文件可以参照如下设置

Host remote1
HostName remote.site.with.long-name
Port 2222
User username
PubkeyAuthentication no

如果你正在使用公钥登录,可以参照这个:

Host remote1
HostName remote.site.with.long-name
Port 2222
User username
IdentityFile  ~/.ssh/id_remoteserver

OpenSSH 文档 很长而且详细,但是当你掌握了基础的 SSH 使用规则之后,你会发现它非常的有用,而且包含很多可以通过 OpenSSH 来实现的炫酷效果。

原文来自:https://linux.cn:443/article-7683-1.html

本文地址:http://www.linuxprobe.com/five-safety-advice.html

TAGS: ,
九月 28th, 2017

命令解释


  • Linux系统可以通过top命令查看系统的CPU、内存、运行时间、交换分区、执行的线程等信息。通过top命令可以有效的发现系统的缺陷出在哪里。是内存不够、CPU处理能力不够、IO读写过高.

  • 使用SSHClient客户端连接到远程Linux系统。使用top命令查看系统的当前运行的情况。如图对top命令执行的结果做了简单的图解,下面针对每一项做详细的解释。

  • top命令的第一行“top – 19:56:47 up 39 min, 3 users, load average: 0.00, 0.00, 0.00”显示的内容依次为“系统当前时间 、系统到目前为止已运行的时间、当前登录系统的用户数量、系统负载(任务队列的平均长度)三个值分别为1分钟、5分钟、15分钟前到现在的平均值【这三个一般会小于1,如果持续高于5,请仔细查看那个程序影响系统的运行】”

  • top命令的第二行“Tasks: 120 total, 2 running, 118 sleeping, 0 stopped, 0 zombie”显示的内容依次“所有启动的进程数”、“正在运行的进程数”、“挂起的进程数”、“停止的进程数”、“僵尸进程数”。

  • top命令的第三行“Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st”显示的内容依次为“用户空间占用CPU百分比”、“内核空间占用CPU百分比”、“用户空间内改变过优先级的进程占用CPU百分比”、“空闲CPU百分比”、“等待输入输出CPU时间百分比”、“CPU服务于硬件中断所耗费的时间总额”、“CPU服务软中断所耗费的时间总额”、“Steal Time

  • top命令第四行“Mem: 508820k total, 480172k used, 28648k free, 41944k buffers”显示内容依次为“物理内存总量”、“已使用的物理内存”、“空闲物理内存”、“内核缓存内存量”。

  • top命令第5行“Swap: 392184k total, 0k used, 392184k free, 259152k cached”显示内容依次为“交换区总量”、“已使用交互区总量”、“空闲交换区总量”、“缓冲的交换区总量”。

  • top命令第5行“PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND ”显示内容依次为“进程ID”、“进程所有者”、“优先级”、“nice值,负值表示高优先级,正值表示低优先级”、“进程使用的虚拟内存总量”、“进程使用的、未被换出的物理内存大小”、“共享内存大小”、“进程状态”、“上次更新到现在的CPU时间占用百分比”、“进程使用的物理内存百分比”、“进程使用CPU总时间”、“命令名、命令行”。

 

 

常用操作

top   //每隔5秒显式所有进程的资源占用情况
top -d 2  //每隔2秒显式所有进程的资源占用情况
top -c  //每隔5秒显式进程的资源占用情况,并显示进程的命令行参数(默认只有进程名)
top -p 12345 -p 6789//每隔5秒显示pid是12345和pid是6789的两个进程的资源占用情况
top -d 2 -c -p 123456 //每隔2秒显示pid是12345的进程的资源使用情况,并显式该进程启动的命令行参数
TAGS: ,
九月 28th, 2017

# 总核数 = 物理CPU个数 X 每颗物理CPU的核数

# 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数

 

# 查看物理CPU个数cat /proc/cpuinfo| grep “physical id”| sort| uniq| wc -l

 

# 查看每个物理CPU中core的个数(即核数)cat /proc/cpuinfo| grep “cpu cores”| uniq

 

# 查看逻辑CPU的个数cat /proc/cpuinfo| grep “processor”| wc -l

  1. 查看CPU的主频
    #cat /proc/cpuinfo |grep MHz|uniq

 

uname -a

Linux euis1 2.6.9-55.ELsmp #1 SMP Fri Apr 20 17:03:35 EDT 2007 i686 i686 i386 GNU/Linux

(查看当前操作系统内核信息)

 

cat /etc/issue | grep Linux

Red Hat Enterprise Linux AS release 4 (Nahant Update 5)

(查看当前操作系统发行版信息)

 

cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c

8  Intel(R) Xeon(R) CPU            E5410   @ 2.33GHz

(看到有8个逻辑CPU, 也知道了CPU型号)

 

cat /proc/cpuinfo | grep physical | uniq -c

4 physical id      : 0

4 physical id      : 1

(说明实际上是两颗4核的CPU)

 

getconf LONG_BIT

32

(说明当前CPU运行在32bit模式下, 但不代表CPU不支持64bit)

 

cat /proc/cpuinfo | grep flags | grep ‘ lm ‘ | wc -l

8

(结果大于0, 说明支持64bit计算. lm指long mode, 支持lm则是64bit)

 

 

 

 

 

如何获得CPU的详细信息:

linux命令:cat /proc/cpuinfo

用命令判断几个物理CPU,几个核等:

逻辑CPU个数:
# cat /proc/cpuinfo | grep “processor” | wc -l

物理CPU个数:
# cat /proc/cpuinfo | grep “physical id” | sort | uniq | wc -l

每个物理CPU中Core的个数:
# cat /proc/cpuinfo | grep “cpu cores” | wc -l

是否为超线程?
如果有两个逻辑CPU具有相同的”core id”,那么超线程是打开的。

每个物理CPU中逻辑CPU(可能是core, threads或both)的个数:
# cat /proc/cpuinfo | grep “siblings”

 

TAGS: ,