Linux学习总结

news2024/11/26 4:33:38

Linux学习目标:

Linux操作系统介绍与安装。

Linux常用命令。

Linux常用软件安装。

Linux网络。

防火墙。

Shell编程等。

*******************************LinuxOS介绍与安装************************************

Linux OS介绍与安装

Linux是什么? Linux是一套作业系统,不是应用程序。

Linux的基本思想有两点:第一,一切都是文件;第二,每个软件都有确定的用途。

Linux版本:

主、次版本为奇数:发展中版本(development)、主、次版本为偶数:稳定版本(stable) EXP:3.10.0-123.el7.x86_64 主版本.次版本.释出版本-修改版本

不过,这种奇数、偶数的编号格式在 3.0 推出之后就失效了。从 3.0 版开始,核心主要依据主线版本 (MainLine) 來开发,开发完后会往下一個主线版本进行。

可以使用『 uname -r 』來查阅核心版本,然后对照下列链接來了解其对应值喔!

https://www.kernel.org/releases.html

Android其实就是Linux核心的一支,只是专门用来针对手机/平板这类的 ARM 机器所设计的。

GNU:GNU's Not Unix 自由软件工程项目

Shell:命令行解释器,遵循一定的语法将输入的命令加以解释并传给系统。默认bash

Linux中,每个硬件设备都被当成一个文件!EXP:IDE硬盘文件名称/dev/da[a-d];硬盘分区名称/dev/hda1,/dev/hda2...数字表示硬盘内的某个分区。

IDE硬盘 /dec/hd[a-d] SCSI硬盘与串口硬盘、U盘 /dev/sd[a-p] 光驱/dev/cdrom 软驱/dev/fd[0-1] 打印机 /dev/lp[0-2] 鼠标/dev/mouse 磁带机/dev/ht0(IDE) /dev/st0(SCSI)

硬盘分区的特点:

最多可以有4个primary分区!

只能有一个extended分区!

extended存在的目的是为了创建logical!

创建logical的目的是能有多于4个分区,logical最多可以有64个!

primary(主分区)+extended(扩展分区)最多有四个。

Logical(逻辑分区)的数字代号必从5开始 Primary=P;Extended=E;Logical=L P+E+L+L:/dev/hda1,/dev/hda2,/dev/hda5,/dev/hda6

Linux的硬盘分区需求:

Linux可以安装在硬盘分区里面任意一个或对各可以写数据的硬盘分区。最少有两个分区

/:根分区,linux操作系统的文件夹,相当于windows系统的windows目录

/boot:启动分区,里面装在linux内核及开机引导程序grub,用于开机引导,100~200M

/usr:相当于windows的应用程序目录programe files

/home:linux各个用户的家目录:用户登录后进入的目录,自己的目录

/var:可变目录,放日志等经常会发生变化的文件

Swap:交换分区,相当于windows的虚拟内存文件,内存大小的2倍

bash 是一个为GNU计划编写的Unix shell。

Vmware 是一种虚拟机,可以用来安装windows,也可以安装linux ,ubuntu是Linux的发行版之一,另外的Linux发行版有红帽,Linux mint 等等,linux秉承开源性,在嵌入式领域和服务器领域有很多使用实例,包括目前流行的安卓,也使用到了Linux.

如果是初学Linux,可以安装虚拟机VM。然后再VM上安装Ubuntu或者自己要学的Linux的版本。Linux安装 记得分配硬盘内存

************************************Linux基本命令******************************************

Linux基本命令:

Linux控制台版本不同数量可能不一样 Ctrl+Alt+F1~Ctrl+Alt+F8 1~6为不同的控制台,7可以从控制台切换回图形界面。如果Linux版本是无法手动切换回来的话。

针对所有系统用户的命令和设置:/etc/bashrc

$字符 shell在等待用户输入

rich@user-desktop:~$ rich(shell用户名) user-desktop(虚拟控制台编号) ~主目录的缩略资源

man命令用来访问存储在Linux系统上的手册页面:$ man bash ->看完用q退出

Linux将文件存储在单个目录结构中,这个目录我们称之为虚拟目录。

Linux会在根驱动器上创建一些特别的目录,我们称之为挂载点。文件和目录在挂载点中,但实际存储在其他位置。

Linux目录名称

/虚拟目录的根目录,不放文件。 /bin位进制目录,存放许多GNU用户级的工具

/boot启动目录,存放启动文件 /dev设备目录,Linux在这里创建节点

/etc 系统配置文件目录 /home主目录,Linux在这里创建用户目录

/lib 库目录,存放系统和应用程序的库文件

/media /mnt挂载目录 /opt 可选目录 /root 根主目录 /var 可变目录 /sbin 系统二进制目录 /tmp临时目录 /usr 用户安装软件目录

Linux常用命令

要想从命令行界面下在Linux的虚拟目录之间切换,需要使用cd命令。

ls 显示系统上有哪些文件 $ls 显示当前目录下的文件和目录

$ ls -F 区分文件 $ ls -a 显示隐藏文件

touch命令创建文件: touch 文件名

cp命令复制文件: cp 源对象 目标对象

mv 重命名 :mv 源 目的

硬链接:创建新文件 软链接:创建符号链接

rm 删除文件: rm -i 文件 删除前提示 rm -f 文件 强制删除 不提示

mkdir ***创建目录 rmdir(只能删除空目录) *** rm dir1 rm -rf dir2 暴力删除

stat *** 查看某文件所有状态 file ***查看文件类型

ps 显示在运行进程 -e 所有进程 -f 详细信息 -ef组合 -H显示层级关系

top 实时监测进程 i 是否切换到空闲进程 u显示某个用户的进程 W把当前设置写到配置文件 q退出

kill num结束进程 killall http*

mount 输出挂载程序信息 umount 移除一个可移动设备

df 显示磁盘剩余空间 du特定目录的磁盘使用情况

sort *** 排序

****************************************Linux软件安装**********************************

一、 解析Linux应用软件安装包:

通常Linux应用软件的安装包有三种:

1) tar包,如software-1.2.3-1.tar.gz。它是使用UNIX系统的打包工具tar打包的。

2) rpm包,如software-1.2.3-1.i386.rpm。它是Redhat Linux提供的一种包封装格式。

3) dpkg包,如software-1.2.3-1.deb。它是Debain Linux提供的一种包封装格式。

而且,大多数Linux应用软件包的命名也有一定的规律,它遵循:名称-版本-修正版-类型

二、 了解包里的内容:

一个Linux应用程序的软件包中可以包含两种不同的内容:

1) 一种就是可执行文件,也就是解开包后就可以直接运行的。在Windows中所 有的软件包都是这种类型。安装完这个程序后,你就可以使用,但你看不到源程序。而且下载时要注意这个软件是否是你所使用的平台,否则将无法正常安装。

2) 另一种则是源程序,也就解开包后,你还需要使用编译器将其编译成为可执行文件。这在Windows系统中是几乎没有的,因为Windows的思想是不开放源程序的。

通常,用tar打包的,都是源程序;而用rpm、dpkg打包的则常是可执行程序。一般来说,自己动手编译源程序能够更具灵活性,但也容易遇到各 种问题和困难。而相对来说,下载那些可执行程序包,反而是更容易完成软件的安装,当然那样灵活性就差多了。所以一般一个软件总会提供多种打包格式的安装程 序的。你可以根据自己的情况来选择。

三、 搞定使用tar打包的应用软件

1. 安装:

整个安装过程可以分为以下几步:

1) 取得应用软件:通过下载、购买光盘的方法获得;

2)解压缩文件:一般tar包,都会再做一次压缩,如gzip、bz2等,所以你需要先解压。如果是最常见的gz格式,则可以执行:“tar –xvzf 软件包名”,就可以一步完成解 压与解包工作。如果不是,则先用解压软件,再执行“tar –xvf 解压后的tar包”进行解包;

3) 阅读附带的INSTALL文件、README文件;

4) 执行“./configure”命令为编译做好准备;

5) 执行“make”命令进行软件编译;

6) 执行“make install”完成安装;

7) 执行“make clean”删除安装时产生的临时文件。

好了,到此大功告成。我们就可以运行应用程序了。但这时,有的读者就会问,我怎么执行呢?这也是一个Linux特色的问题。其实,一般来说, Linux的应用软件 的可执行文件会存放在/usr/local/bin目录下!不过这并不是“放四海皆准”的真理,最可靠的还是看这个软件的 INSTALL和README文件,一般都会有说明。

2. 卸载:

通常软件的开发者很少考虑到如何卸载自己的软件,而tar又仅是完成打包的工作,所以并没有提供良好的卸载方法。

那么是不是说就不能够卸载呢!其实也不是,有两个软件能够解决这个问题,那就是Kinstall和Kife,它们是tar包安装、卸载的黄金搭档。

四、 搞定使用rpm打包的应用软件

rpm可谓是Redhat公司的一大贡献,它使Linux的软件安装工作变得更加简单容易。

1. 安装:

我只需简单的一句话,就可以说完。执行:rpm –ivh rpm软件包名

更高级的,请见下表:

rpm参数 参数说明

-i 安装软件

-t 测试安装,不是真的安装

-p 显示安装进度

-f 忽略任何错误

-U 升级安装

-v 检测套件是否正确安装

这些参数可以同时采用。更多的内容可以参考RPM的命令帮助。

2. 卸载:

我同样只需简单的一句话,就可以说完。执行:

rpm –e 软件名

不过要注意的是,后面使用的是软件名,而不是软件包名。例如,要安装software-1.2.3-1.i386.rpm这个包时,应执行:

rpm –ivh software-1.2.3-1.i386.rpm

而当卸载时,则应执行: rpm –e software。

另外,在Linux中还提供了象GnoRPM、kpackage等图形化的RPM工具,使得整个过程会更加简单。这些软件的具体应用,笔者会另行文介绍。

五、 搞定使用deb打包的应用程序

这是Debian Linux提供的一个包管理器,它与RPM十分类似。但由于RPM出现得更早,所以在各种版本的Linux都常见到。而debian的包管理器dpkg则 只出现在Debina Linux中,其它Linux版本一般都没有。我们在此就简单地说明一下:

1. 安装

dpkg –i deb软件包名

如:dpkg –i software-1.2.3-1.deb

2. 卸载

dpkg –e 软件名

如:dpkg –e software

六、软件的安装

---- Linux下软件的安装主要有两种不同的形式。第一种安装文件名为filename.tar.gz。另一种安装文件名为 filename.i386.rpm。以第一种方式发行的软件多为以源码形式发送的。第二种方式则是直接以二进制形式发行的。i386即表示该软件是按 Inter 386指令集编译生成的。

---- 对于第一种,安装方法如下:

---- 首先,将安装文件拷贝至你的目录中。例如,如果你是以root身份登录上的,就将软件拷贝至/root中。

---- #cp filename.tar.gz /root

---- 由于该文件是被压缩并打包的,所以,应对其解压缩。命令为:

---- #tar xvzf filename.tar.gz

---- 执行该命令后,安装文件按路径,解压缩在当前目录下。用ls命令可以看到解压缩后的文件。通常在解压缩后产生的文件中,有名为"INSTALL"的文件。该文件为纯文本文件,详细讲述了该软件包的安装方法。

---- 对于多数需要编译的软件,其安装的方法大体相同。执行解压缩后产生的一个名为configure的可执行脚本程序。它是用于检查系统是否有编译时所需的库,以及库的版本是否满足编译的需要等安装所需要的系统信息。为随后的编译工作做准备。命令为:

---- #./configure

---- 如果检查过程中,发现有错误,configure将给予提示,并停止检查。你可以跟据提示对系统进行配置。再重新执行该程序。检查通过后,将生成用于编译 的MakeFile文件。此时,可以开始进行编译了。编译的过程视软件的规模和计算机的性能的不同,所耗费的时间也不同。命令为:

---- #make

---- 成功编译后,键入如下的命令开始安装:

---- #make install

---- 安装完毕,应清除编译过程中产生的临时文件和配置过程中产生的文件。键入如下命令:

#make clean

#make distclean

至此,软件的安装结束。

---- 对于第二种,其安装方法要简单的多。

---- 同第一种方式一样,将安装文件拷贝至你的目录中。然后使用rpm来安装该文件。命令如下:

---- #rpm -i filename.i386.rpm

---- rpm将自动将安装文件解包,并将软件安装到缺省的目录下。并将软件的安装信息注册到rpm的数据库中。参数i的作用是使rpm进入安装模式。

---- 另外,还有一些Linux平台下的商业软件。在其安装文件中,有Setup安装程序,其安装方法同Windows平台下的一样。如:Corel WordPerfect。

软件的卸载

---- 软件的卸载主要是使用rpm来进行的。卸载软件首先要知道软件包在系统中注册的名称。键入命令:

---- #rpm -q -a

---- 即可查询到当前系统中安装的所有的软件包。参数q的作用是使rpm进入查询命令模式。参数a是查询模式的子参数,意为全部(ALL)。查询到的信息较多,可使用less人屏显示。

---- 确定了要卸载的软件的名称,就可以开始实际卸载该软件了。键入命令:

---- #rpm -e [package name]

---- 即可卸载软件。参数e的作用是使rpm进入卸载模式。对名为[package name]的软件包进行卸载。由于系统中各个软件包之间相互有依赖关系。如果因存在依赖关系而不能卸载,rpm将给予提示并停止卸载。你可以使用如下的命 令来忽略依赖关系,直接开始卸载:

---- #rpm -e [package name] -nodeps

---- 忽略依赖关系的卸载可能会导致系统中其它的一此软件无法使用。你可以使用

---- #rpm -e [package name] -test

---- 使rpm进行一次卸载预演,而不是真正卸载。这样可以使你检查一下软件是否存在有依赖关系。卸载过程中是否有错误。

**************************************Linux网络*****************************************

Linux网络

ping

使用这个命令判断网络的连通性以及网速,偶尔还顺带当做域名解析使用(查看域名的IP):

ping google.com

默认使用该命令会一直发送ICMP包直到用户手动中止,可以使用-c命令指定发送数据包的个数,使用-W指定最长等待时间,如果有多张网卡,还可以通过-I指定发送包的网卡。

小技巧: 在ping过程中按下ctrl+|会打印出当前的summary信息,统计当前发送包数量、接收数量、丢包率等。

其他比如-b发送广播,另外注意ping只能使用ipv4,如果需要使用ipv6,可以使用ping6命令。

netstat

这个命令用来查看当前建立的网络连接(深刻理解netstat每一项代表的含义)。最经典的案例就是查看本地系统打开了哪些端口:

fgp@controller:~$ sudo netstat -lnpt

netstat能够查看所有的网络连接,包括unix socket连接,其功能非常强大。

另外使用netstat还可以查看本地路由表:

fgp@controller:~$ sudo netstat -nr

以上Genmask为0.0.0.0的表示默认路由,即连接外网的路由。网络中0.0.0.0的IP地址表示整个网络,即网络中的所有主机。它的作用是帮助路由器发送路由表中无法查询的包。如果设置了全零网络的路由,路由表中无法查询的包都将送到全零网络的路由中去。

lsof

lsof命令用来查看打开的文件(list open files),由于在Linux中一切皆文件,那socket、pipe等也是文件,因此能够查看网络连接以及网络设备,其中和网络最相关的是-i选项,它输出符合条件的进程(4、6、协议、:端口、 @ip等),它的格式为[46][protocol][@hostname|hostaddr][:service|port],比如查看22端口有没有打开,哪个进程打开的:

fgp@controller:~$ sudo lsof -i :22

可见22端口是sshd这个命令,其进程号pid为1290打开的。

可以指定多个条件,但默认是OR关系的,如果需要AND关系,必须传入-a参数,比如查看22端口并且使用Ipv6连接的进程:

fgp@controller:~$ sudo lsof -c sshd -i 6 -a -i :22

列出所有与192.168.56.1(我的宿主机IP地址)的ipv4连接:

fgp@controller:~$ sudo lsof -i 4@192.168.56.1

iftop

用过top以及iotop的,自然能够大致猜到iftop的功能,它是用于查看网络流量的工具(display bandwidth usage on an interface by host):

sudo iftop

nc

nc(netcat)被称为网络工具的瑞士军刀,其非常轻巧但功能强大!常常作为网络应用的Debug分析器,可以根据需要创建各种不同类型的网络连接。官方描述的功能包括:

总之非常强大,能够实现简单的聊天工具、模拟ssh登录远程主机、远程传输文件等。一个经典的用法是端口扫描。比如我要扫描192.168.56.2主机1~100端口,探测哪些端口开放的(黑客攻击必备):

从结果中发现,该主机打开了22和80端口。

tcpdump

tcpdump(dump traffic on a network)是一个强大的命令行抓包工具,千万不要被它的名称误导以为只能抓取tcp包,它能抓任何协议的包。它能够实现Wireshark一样的功能,并且更加灵活自由!比如需要抓取目标主机是192.168.56.1,通过端口22的传输数据包:

sudo tcpdump -n -i eth1 'dst host 192.168.56.1 && port 22'

输出为:

抓取HTTP包:

sudo tcpdump -XvvennSs 0 -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854

其中0x4745为"GET"前两个字母"GE",0x4854为"HTTP"前两个字母"HT"。

指定-A以ACII码输出数据包,使用-c指定抓取包的个数。

telnet

telnet协议客户端(user interface to the TELNET protocol),不过其功能并不仅仅限于telnet协议,有时也用来探测端口,比如查看本地端口22是否开放:

可见成功连接到localhost的22端口,说明端口已经打开,还输出了banner信息。

ifconfig

ifconfig也是熟悉的网卡配置工具(configure a network interface),我们经常使用它来查看网卡信息(比如IP地址、发送包的个数、接收包的个数、丢包个数等)以及配置网卡(开启关闭网卡、修改网络mtu、修改ip地址等)。

查看网卡ip地址:

为网卡eth0增加一个新的地址(虚拟网卡):

关闭网卡以及开启网卡:

nslookup & dig

nslookup用于交互式域名解析(query Internet name servers interactively),当然也可以直接传入域名作为Ad-Hoc命令使用,比如查看google.com的ip地址:

fgp@controller:~$ nslookup google.com

查看使用的DNS服务器地址:

fgp@controller:~$ nslookup

dig命令也是域名解析工具(DNS lookup utility),不过提供的信息更全面:

fgp@controller:~$ dig google.com

whois

whois用于查看域名所有者的信息(client for the whois directory service),比如注册邮箱、手机号码、域名服务商等:

我们发现coolshell.cn这个域名是陈皓在万网购买注册的,注册时间是2009年,注册邮箱是haoel@hotmail.com。

route

route命令用于查看和修改路由表:

查看路由表:

fgp@controller:~$ sudo route -n

增加/删除路由分别为add/del子命令,比如删除默认路由:

sudo route del default

增加默认路由,网关为192.168.1.1,网卡为brqcb225471-1f:

sudo route add default gw 192.168.1.1 dev brqcb225471-1f

ip

ip命令可以说是无比强大了,它完全可以替换ifconfig、netstat、route、arp等命令,

比如查看网卡eth1 IP地址:

fgp@controller:~$ sudo ip addr ls dev eth1

查看网卡eth1配置:

fgp@controller:~$ sudo ip link ls eth1

查看路由:

fgp@controller:~$ ip route

查看arp信息:

查看网络命名空间:

进入某个网络命名空间:

brctl

brctl是linux网桥管理工具,可用于查看网桥、创建网桥、把网卡加入网桥等。

查看网桥:

fgp@controller:~$ sudo brctl show

以上因为部署了openstack neutron以及docker,因此网桥比较复杂。 其他子命令如addbr用于创建网桥、delbr用户删除网桥(删除之前必须处于down状态,使用ip link set br_name down)、addif把网卡加到网桥等。

traceroute

ping命令用于探测两个主机间连通性以及响应速度,而traceroute会统计到目标主机的每一跳的网络状态(print the route packets trace to network host),这个命令常常用于判断网络故障,比如本地不通,可使用该命令探测出是哪个路由出问题了。如果网络很卡,该命令可判断哪里是瓶颈:

fgp@controller:~$ sudo traceroute -I -n int32bit.me

可以看到,从主机到int32bit.me共经过30跳,并统计了每一跳间的响应时间。

另外可以参考tracepath。

curl

curl是强大的URL传输工具,支持FILE, FTP, HTTP, HTTPS, IMAP, LDAP, POP3,RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET以及TFTP等协议。我们使用这个命令最常用的功能就是通过命令行发送HTTP请求以及下载文件,它几乎能够模拟所有浏览器的行为请求,比如模拟refer(从哪个页面跳转过来的)、cookie、agent(使用什么浏览器)等等,同时还能够模拟表单数据。

curl -X POST -d "DDDDD=2013140333&upass=1q2w3e4r&save_me=1&R1=0" 10.3.8.211

以上方法利用curl往认证服务器发送POST请求,发送数据为用户名以及密码(模拟表单输入)。

具体用法参考buptLogin。

Openstack的命令行工具,比如nova,传入--debug参数就会显示curl往nova-api的curl REST请求。

curl命令非常强大,掌握了它能够发挥巨大的作用,其他有用参数列举如下:

-i 显示头部信息

-I 只显示头部信息,不显示正文

-X 指定请求方法,比如GET、POST等

-d 发送数据

--form模拟表单,利用这个参数可以上传文件、模拟点击按钮等

-A 指定用户代理,比如Mozilla/4.0,有些坑爹网址必须使用IE访问怎么办

-b 设置cookie

-c 指定cookie文件

-e 指定referer,有些网址必须从某个页面跳转过去

--header 设置请求的头部信息

--user 有些页面需要HTTP认证, 传递name:password认证

wget

wget是一个强大的非交互网络下载工具(The non-interactive network downloader),虽然curl也支持文件下载,不过wget更强大,比如支持断点下载等。

最简单的用法直接加上文件URL即可:

wget http://xxx/xxx/video.mp4

使用-r参数为递归的下载网页,默认递归深度为5,相当于爬虫,用户可以通过-l指定递归深度。

注意wget默认没有开启断点下载功能,需要手动传入-c参数。

如果需要批量下载,可以把所有的URL写入文件download.txt,然后通过-i指定下载文件列表:

wget -i download.txt

如果用户不指定保存文件名,wget默认会以最后一个符合/的后面的字符作为保存文件名,有时不是我们所期望的,此时需要-O指定保存的文件名。

通过--limit-rate可以限制下载的最大速度。

使用-b可以实现后台下载。

另外wget甚至可以镜像整个网站:

wget --mirror -p --convert-links -P int32bit http://int32bit.me

wget还支持指定下载文件的格式,比如只下载jpg图片:

wget -A.jpg -r -l 2 http://int32bit.me/

axel

axel是一个多线程下载工具(A light download accelerator for Linux),通过建立多连接,能够大幅度提高下载速度,所以我经常使用这个命令开挂下载大文件,比wget快多了,并且默认就支持断点下载:

开启20个线程下载文件:

axel -n 20 URL

这个强大的下载工具极力推荐,非常好用!

iptables

iptables是强大的包过滤工具,Docker、Neutron都网络配置都离不开iptables。iptables通过一系列规则来实现数据包过滤、处理,能够实现防火墙、NAT等功能。当一个网络数据包进入到主机之前,先经过Netfilter检查,即iptables规则,检查通过则接受(Accept)进入本机资源,否则丢弃该包(Drop)。规则是有顺序的,如果匹配第一个规则,则执行该规则的Action,不会执行后续的规则。iptables的规则有多个表构成,每个表又由链(chain)构成,每个表的功能不一样,本文只涉及两个简单的表,即Filter表和NAT表,望文生义即可了解,Filter表用于包过滤,而NAT表用来进行源地址和目的地址的IP或者端口转换。

1.Filter表

Filter表主要和进入Linux本地的数据包有关,也是默认的表。该表主要由三条链构成:

INPUT:对进入主机的数据包过滤

OUTPUT:对本地发送的数据包过滤

FORWARD:传递数据包到后端计算机,与NAT有点类似。

查看本地的Filter表:

其中-n表示不进行域名解析,-t指定使用的表,--list表示列出所有规则。我们发现目前没有定义任何规则。注意链后面的policy为ACCEPT,表示若通过所有的规则都不匹配,则为默认action accept。

接下来将通过几个demo实例演示怎么使用Filter表。

注意:

本文实验使用的是本机虚拟机,其中宿主机地址为192.168.56.1,虚拟机地址为192.168.56.2,在实验中会涉及丢弃192.168.56.1的数据包,如果您连接的是远程云主机,将导致和远程主机断开连接。

以下每个步骤,除非特别说明,下一个步骤执行前,务必清空上一个步骤的规则:

sudo iptables -F

首先看一个简单的例子,把192.168.56.1加入黑名单禁止其访问:

sudo iptables -A INPUT -i eth1 -s 192.168.56.1 -j DROP

例子中-A表示追加规则,INPUT是链名,-i指定网卡,-s指定源IP地址,-j指定action,这里为DROP,即丢弃包。

此时192.168.56.1这个ip不能和主机通信了,ssh会立即掉线,只能通过vnc连接了!

-s不仅能够指定IP地址,还可以指定网络地址,使用-p指定协议类型,比如我们需要丢掉所有来自192.168.56.0/24这个网络地址的ICMP包,即不允许ping:

sudo iptables -A INPUT -s 192.168.56.0/24 -i eth1 -p icmp -j DROP

输出结果:

我们发现能够通过nc连接主机,但ping不通。

我们还可以通过--dport指定目标端口,比如不允许192.168.56.1这个主机ssh连接(不允许访问22端口):

sudo iptables -A INPUT -s 192.168.56.1 -p tcp --dport 22 -i eth1 -j DROP

注意:使用--dport或者--sport必须同时使用-p指定协议类型,否则无效!

以上把192.168.56.1打入了ssh黑名单,此时能够ping通主机,但无法通过ssh连接主机。

Filter表的介绍就到此为止,接下来看NAT表的实例。

2.NAT表

NAT表默认由以下三条链构成:

PREROUTING:在进行路由判断前所要进行的规则(DNAT/Redirect)

POSTROUTING: 在进行路由判断之后要进行的规则(SNAT/MASQUERADE)

OUTPUT: 与发送的数据包有关

根据需要修改的是源IP地址还是目标IP地址,NAT可以分为两种:

DNAT:需要修改目标地址(IP或者端口),使用场景为从外网来的数据包需要映射到内部的一个私有IP,比如46.64.22.33->192.168.56.1。显然作用在PREROUTING。

SNAT:需要修改源地址(IP或者端口),使用场景和DNAT相反,内部私有IP需要发数据包出去,必须首先映射成公有IP,比如192.168.56.1->46.64.22.33。显然作用在POSTROUTING。

首先实现介绍一个简单的demo,端口转发,我们把所有来自2222的tcp请求转发到本机的22端口,显然需要修改目标地址,因此属于DNAT:

sudo iptables -t nat -A PREROUTING -p tcp --dport 2222 -j REDIRECT --to-ports 22

此时在192.168.56.1上使用ssh连接,指定端口为2222:

ssh fgp@192.168.56.2 -p 2222

我们能够顺利登录,说明端口转发成功。

另一个例子是使用双网卡linux系统作为路由器,我们有一台服务器controller有两个网卡:

eth0: 192.168.1.102 # 可以通外网

eth1: 192.168.56.2 # 不可以通外网,用作网关接口。

另外一台服务器node1只有一个网卡eth1,IP地址为192.168.56.3,不能通外网。我们设置默认路由为controller机器的eth1:

sudo route add default gw 192.168.56.2 dev eth1

此时路由表信息为:

fgp@node1:~$ sudo route -n

由路由表可知,node1上的数据包会发送到网关192.168.56.2,即controller节点.

接下来我们要在服务器controller上配置NAT,我们需要实现192.168.56.0/24的IP都转发到eth0,显然是SNAT,修改的源地址为eth0 IP地址192.168.1.102:

sudo iptables -t nat -A POSTROUTING -s 192.168.56.0/24 -o eth0 -j SNAT --to-source 192.168.1.102

其中-t指定nat表,-A 指定链为POSTROUTING,-s 为源ip地址段,-o指定转发网卡,注意-j参数指定action为SNAT,并指定eth0 IP地址(注意eth0可能配置多个ip地址,因此必须指定--to-source)。

此时在node1机器上检测网络连通性:

fgp@node1:~$ ping baidu.com -c 2

PING baidu.com (180.149.132.47) 56(84) bytes of data.

64 bytes from 180.149.132.47: icmp_seq=1 ttl=48 time=7.94 ms

64 bytes from 180.149.132.47: icmp_seq=2 ttl=48 time=6.32 ms

--- baidu.com ping statistics ---

2 packets transmitted, 2 received, 0% packet loss, time 1002ms

rtt min/avg/max/mdev = 6.328/7.137/7.946/0.809 ms

node1能够正常上网。

以上通过使用controller的网卡eth0作为路由实现了node1的上网,但同时有一个问题存在,我们在指定SNAT时必须手动指定IP,如果eth0 IP地址变化了,必须修改iptables规则。显然这样很难维护,我们可以通过MASQUERADE实现动态SNAT,不需要指定IP地址:

sudo iptables -t nat -A POSTROUTING -s 192.168.56.0/24 -o eth0 -j MASQUERADE

其他

使用iptables-save能够导出规则,使用iptables-restore能够从文件中导入规则。

ipset

以上我们通过iptables封IP,如果IP地址非常多,我们就需要加入很多的规则,这些规则需要一一判断,性能会下降(线性的)。ipset能够把多个主机放入一个集合,iptables能够针对这个集合设置规则,既方便操作,又提高了执行效率。注意ipset并不是只能把ip放入集合,还能把网络地址、mac地址、端口等也放入到集合中。

首先我们创建一个ipset:

sudo ipset create blacklist hash:ip

以上创建了一个blacklist集合,集合名称后面为存储类型,除了hash表,还支持bitmap、link等,后面是存储类型,我们指定的是ip,表示我们的集合元素为ip地址。

我们为这个blacklist集合增加一条规则,禁止访问:

sudo iptables -I INPUT -m set --match-set blacklist src -j DROP

此时只要在blacklist的ip地址就会自动加入黑名单。

我们把192.168.56.1和192.168.56.3加入黑名单中:

sudo ipset add blacklist 192.168.56.3

sudo ipset add blacklist 192.168.56.1

此时ssh连接中断,使用vnc连接查看:

fgp@controller:~/github/int32bit.github.io$ sudo ipset list blacklist

Name: blacklist

Type: hash:ip

Revision: 2

Header: family inet hashsize 1024 maxelem 65536

Size in memory: 176

References: 1

Members:

192.168.56.1

192.168.56.3

把192.168.56.1移除黑名单:

sudo ipset del blacklist 192.168.56.1

我们上面的例子指定的类型为ip,除了ip,还可以是网络段,端口号(支持指定TCP/UDP协议),mac地址,网络接口名称,或者上述各种类型的组合。比如指定 hash:ip,port就是 IP地址和端口号共同作为hash的键。指定类型为net既可以放入ip地址,也可以放入网络地址。

另外ipset还支持timeout参数,可以指定时间,单位为秒,超过这个时间,ipset会自动从集合中移除这个元素,比如封192.168.56.11分钟时间不允许访问

sudo ipset create blacklist hash:net timeout 300

sudo ipset add blacklist 192.168.56.1 timeout 60

以上首先创建了支持timeout的集合,这个集合默认超时时间为300s,接着把192.168.56.1加入到集合中并设置时间为60s。

注意:执行ipset add时指定timeout必须保证创建的集合支持timeout参数,即设置默认的timeout时间.如果不想为集合设置默认timeout时间,而又想支持timeout,可以设置timeout为0,相当于默认不会超时。

总结

本文总结了Linux中的常用的网络工具,其中包括

网络配置相关:ifconfig、ip

路由相关:route、netstat、ip

查看端口工具:netstat、lsof、ss、nc、telnet

下载工具:curl、wget、axel

防火墙:iptables、ipset

流量相关:iftop、nethogs

连通性及响应速度:ping、traceroute、mtr、tracepath

域名相关:nslookup、dig、whois

web服务器:python、nginx

抓包相关:tcpdump

网桥相关:ip、brctl、ifconfig、ovs

Linux网络配置

interface文件

# interfaces(5) file used by ifup(8) and ifdown(8)

auto lo

iface lo inet looback

#The primary network interface

auto ens33 //Ubuntu16.04以后名字可能是ens33要自己查看

iface ens33 inet static

address 202.202.72.245

netmask 255.255.255.0

gateway 202.202.72.129

dns-nameserver 8.8.8.8

netmask 255.255.255.0

今天配置了一天,学会了一些命令

sudo /etc/init.d/networking restart //重启网络

sudo gedit /etc/network/interfaces //用gedit编辑器写网络配置文件 ,vim简直是折磨。

vi是vim简称 vim 有两种编辑模式,1、普通模式:会把所有键入的东西都当做指令h左移j下移k上移l右移;2:点击i进入插入模式,Esc退出;shift+:wq保存。

vim /etc/network/interfaces vim编辑网络配置

su root 进入root模式 su:用户之间进行切换命令

sudo命令用来以其他身份来执行命令,预设的身份为root

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1005299.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C# 去除utf-8 BOM头

static void Main(string[] args) {var a1 Encoding.UTF8.GetBytes("<");var a2 Encoding.UTF8.GetBytes("&#xfeff;<");Console.WriteLine("去除utf-8 bom之前");Console.WriteLine(Encoding.UTF8.GetString(a1));Console.WriteLine(…

黑马 小兔鲜儿 uniapp 小程序开发- 推荐模块- day03

黑马 小兔鲜儿 uniapp 小程序开发- 02首页模块_软工菜鸡的博客-CSDN博客 小兔鲜儿 - 推荐模块- day03 主要实现 Tabs 交互、多 Tabs 列表分页加载数据。 动态获取数据 参考效果 推荐模块的布局结构是相同的&#xff0c;因此我们可以复用相同的页面及交互&#xff0c;只是所…

轻松打造自己的ChatGPT应用,AI应用,源码附赠

这里写自定义目录标题 前言简介 前言 大家好&#xff0c;我是静幽水&#xff0c;目前是一名大厂全栈工程师&#xff0c;练习时长两年&#xff0c;擅长Java后端&#xff0c;Vue前端&#xff0c;小程序编程&#xff0c;Python编程&#xff0c;ChatGPT 提示词等技术。现在正在系统…

建筑模板木模好还是钢模好

在建筑施工中&#xff0c;模板是一项关键的工程&#xff0c;对于建筑结构的质量和施工效率起着重要作用。在选择模板材料时&#xff0c;木模和钢模都是常见的选择。本文将比较木模和钢模的优缺点&#xff0c;以帮助您做出明智的选择。 正文&#xff1a;一、木模&#xff1a;传统…

信创国产化解决方案

近年来&#xff0c;随着信息技术的飞速发展&#xff0c;信创产业成为国家发展的重要战略之一。2018年以来我国将信创纳入国家战略&#xff0c;提出了“28”发展体系&#xff0c;随后扩展至更多行业&#xff0c;演变为“28N”应用体系。2023年中国信创产业逐步走向应用落地阶段。…

sql函数实现模糊精确匹配

sql函数实现模糊精确匹配 例如&#xff1a; 查询的时候匹配[‘1’] 就只匹配1的 &#xff0c;而不是15的也会模糊查询进去 slq函数如下&#xff1a; CREATE OR REPLACE FUNCTION does_string_array_intersect ( target_string TEXT, input_strings TEXT [] ) RETURNS BOOLEA…

单元格法求解多边形最大内接矩形问题【思路讲解+java实现】

问题描述 给定一个多边形的点集&#xff0c;希望找出多边形内部面积最大的矩形。该问题可能出现在&#xff0c;从一个多边形废料上面切割出一个最大的矩形&#xff0c;该矩形可以重复利用&#xff0c;解决该问题可以节约原材料&#xff0c;降低企业运作成本 问题解决方案 本…

解决Selenium元素拖拽不生效Bug

前几天在使用Selenium进行元素拖拽操作时&#xff0c;发现Selenium自带的元素拖拽方法&#xff08;dragAndDrop()&#xff09;不生效&#xff0c;网上的回答也是五花八门&#xff0c;比较混乱&#xff0c;尝试了以下几种方法均无法解决。 方案1&#xff1a;通过dragAndDrop()方…

群晖NAS如何在内网部署HTTPS服务让浏览器信任证书

前言 最近在折腾内部部署Web服务。通过Vue实现一个H5的内部的管理服务。但在实际部署过程中由于种种原因&#xff0c;必须部署成Https服务。但在部署成Https服务后&#xff0c;由于没有HTTPS证书&#xff0c;每次进入页面都会被浏览器拦截。使用起来非常不便。于是开始各种Goo…

显示器显示的画面突然偏红色如何解决

显示器显示的画面突然偏红色如何解决 1. 概述2. 解决方法结束语 1. 概述 显示器显示的画面突然偏红色 &#xff0c;使用向日葵远程电脑&#xff0c;看到的画面是正常的&#xff0c;但是显示器上的画面确还是骗红的&#xff0c;这时候就需要看一下是不是开启了系统也夜间模式&a…

Linux之使用LAMP搭建私有云存储

目录 Linux之使用LAMP搭建私有云存储 恢复快照&#xff0c;关闭安全软件 搭建LAMP环境 下载安装依赖包 下载nextcloud软件 解压nextcloud 设置nextcloud安装命令权限 数据库配置 设置数据库 重启数据库 配置httpd 重启httpd服务 安装 打开浏览器后输入服务器IP地址…

LeetCode(力扣)1005. K 次取反后最大化的数组和Python

LeetCode1005. K 次取反后最大化的数组和 题目链接代码 题目链接 https://leetcode.cn/problems/maximize-sum-of-array-after-k-negations/ 代码 class Solution:def largestSumAfterKNegations(self, nums: List[int], k: int) -> int:nums.sort(keylambda x: abs(x),…

一款攻击面管理必备工具-Goby

引言 在正式介绍Goby之前,我们先简单介绍下网络功防的基本常识: 首先,对于攻击方,我们需要了解一个常见的攻击过程: 攻击者需要明确探测目标,锁定目标的地理位置、IP、域名等基本信息;对目标ip、域名进行存活性判定,对其操作系统、开放端口、服务等信息进行识别;针对…

【1462. 课程表 IV】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 你总共需要上 numCourses 门课&#xff0c;课程编号依次为 0 到 numCourses-1 。你会得到一个数组 prerequisite &#xff0c;其中 prerequisites[i] [ai, bi] 表示如果你想选 bi 课程&#xff0c;你…

你真的会报bug吗?常见10条错误

几乎每一位测试员&#xff0c;都会因为自己发现了一个bug而沾沾自喜&#xff0c;然后迫不及待地报bug。此时&#xff0c;恨不得有个喇叭&#xff0c;在整个办公室广而告之一下&#xff0c;实际上这样的行为并不可取&#xff0c;因为软件开发人员最怕的就是思路被打断&#xff0…

关于vue封装form表单单向流数据问题

vue在封装form表单业务组件问题时&#xff0c;传参的方式可能是 组件接收的形式这样很容易打破vue 的单向流数据规则&#xff0c;这样写肯定不会影响功能&#xff0c;只不过代码离屎山越来越近。 创建一个计算属性&#xff0c;get获取form 再利用 proxy 代理去代理这个对象&am…

DBC文件解析

一.candb 二.DBC文件解析 NS_ : NS_DESC_&#xff1a;用于描述网络信号的描述信息。 CM_&#xff1a;用于定义信号的描述信息。 BA_DEF_&#xff1a;定义信号的属性。 BA_&#xff1a;为信号属性定义值。 VAL_&#xff1a;为信号的枚举值定义标签。 CAT_DEF_&#xff1a;定义…

SoftwareTest2 - 软件测试相关概念

软件测试答疑篇 目标一 . 什么是需求二 . 测试用例三 . 什么是 BUG四 . 开发模型4.1 软件的生命周期需求分析计划设计编码测试运行维护 4.2 软件测试的生命周期需求分析测试计划测试设计与开发执行测试测试评估 4.3 常见模型瀑布模型螺旋模型增量模型、迭代模型敏捷模型scrum模…

GO语言篇之embed

GO语言篇之embed 文章目录 GO语言篇之embed前言目录结构文件转[]byte文件转string多文件转embed.FS目录转embed.FS文件和目录组合的方式转embed.FS 前言 embed是Go语言提供的一种机制&#xff0c;可使静态文件或文件夹嵌入Go语言程序中&#xff0c;使我们Go语言的可执行文件包…

kibana报错内存溢出问题解决

一、背景&#xff1a; kibana内存溢出&#xff0c;进程被kill掉&#xff0c;导致前端页面访问不到。 报错内容 二、报错原因&#xff1a; 发现是前端 js 报的内存 oom 异常&#xff0c;通过网上资料发现node.js 的默认内存大小为1.4G Node 中通过 JavaScript 使用内存时只能…