标签:
1、第四部分第四课:分析网络,隔离防火
2、第四部分第五课:源码编译,安装便利
俗语说得好:爱国爱家爱师妹! 防火防盗防师兄!
虽然说,Linux本身很安全,至少比Windows安全多了。你看Linux发行版哪有安装杀毒软件的,同样基于修改的Unix系统的苹果的Mac OS系统也几乎不需要装杀毒软件。
如果Windows不装个杀毒软件,简直不好意思出门跟别人打招呼(日常黑Windows任务完成 :P)。开个玩笑啦,Windows是很好的系统,小编也使用Windows系统的。
不过,在网络上穿行,还是小心为妙。毕竟网上有不怀好意的黑客(或普通人),想方设法获取我们的隐私,或者控制我们的电脑。
这一课很重要,我们来学习几个厉害的命令,能帮助我们分析网络,再来学习如何使用轻量级的防火墙。
我们一起学习经由电脑的网络通信是怎么回事。事实上,当你的电脑连接到互联网(Internet)时,总会有那么一些电脑里的软件会连上网,然后下载或上传信息,很多时候还是偷偷地在后台进行。
如何监控此等“大逆不道”的行径呢?如何知道哪个软件正在与网络通信,在哪个端口上进行呢?就是本课要探究的。
还有,懂得配置防火墙是很必要的,不管是在你的家用电脑上还是在你租用的服务器上。因为这能有效保护电脑,免得一些软件未经你同意就和互联网交换信息。使用防火墙是一个重要的安全防护措施,特别是每个系统管理员(System Administrator)更是不能逃避,总要学习。
好了,废话了这么多,开篇入正题吧。
希望你们没有嫌我啰嗦,真的不要... 如果你嫌我啰嗦,你要说出来,你不说出来,我怎么知道你嫌我啰嗦呢?如果你说出来了,但是不够大声,那也是不行的,不大声我听不清楚啊...
(好了,好了,不要再扔鸡蛋了... 你,说的就是你啦,还拿了一个番茄准备扔诶,要不要辣么夸张)要跨年(2015-2016)了,就原谅小编顽皮一次吧。
大家2016加油啊!要做T型人才噢~
host和whois命令:告诉我你是谁
我们已经知道,每台连上网的电脑都会被一个IP地址所标识,这个IP地址是全球唯一的。
目前,大多数的IP地址是这样的形式:
96.172.150.23
这样的形式被称为IPv4格式(以小数点分隔)。IP就是Internet Protocol(网际协议),v是version(版本)的首字母,4表示这是版本四。
不过,因为IPv4的地址不够用的关系,现在已经有不少IP地址的格式是IPv6的格式了,已有的IPv4地址也被慢慢替换成IPv6。IPv6的IP地址类似这样:
fa80::109:62fa:cb80:29d2
上面的是简写形式(两个冒号::用于合并连续的几组0),完整的形式是:
fa80:0000:0000:0000:0109:62fa:cb80:29d2
以冒号分隔的8组4位的16进制(也就是8组16位二进制,因为2的4次方是16),所以 8 * 16 = 128
IPv6把 IP 地址由IPv4的32 位(4个2的8次方,4 * 8 = 32)增加到 128 位。
2的32次方是42亿多一点。随着互联网的快速成长,IPv4的42亿个地址的分配最终于2011年2月3日用尽。而IPv6的128位可以提供的IP地址数量可达3.402823669 × 10^38个,届时每个人家居中的每件电器,每件对象,甚至地球上每一粒沙子都可以拥有好几个IP地址。根本用不完,IP多就是这么任性。
我们可以为每一个IP地址绑定一个主机名,主机名的英语是host name。
注意:
这里的主机名其实应该被称为完整主机名: Fully Qualified Domain Name (FQDN),是由主机名(host name)和域名(domain name)一起构成。我们一般会用主机名或域名来代称FQDN,其实不是那么准确。
(domain name和host name是不同概念,有点小复杂,可以去看看《鸟哥的Linux私房菜》的对应课程,讲得非常通俗易懂:http://linux.vbird.org/linux_server/0350dns.php)
例如,程序员联盟的服务器的完整主机名是www.coderunity.com,这里的www是主机名,coderunity.com是域名。对应的IP地址是58.96.181.197
下面我们会用主机名或域名代指FQDN了。
相比于记忆一串数字(IPv4)或数字+字母(IPv6)的IP地址,人脑更擅长记住主机名。如下图,IP地址和主机名对应:
IP地址和主机名的互相转换
使用host(host是英语“主机”的意思)这个命令我们可以实现IP地址和主机名的互相转换,例如:
host coderunity.com (或 host www.coderunity.com)会得到IP地址:
58.96.181.197
而host 58.96.181.197则会得到主机名
host命令的其他参数选项,可以用man host来查考。
自定义解析
IP地址和主机名的解析是由DNS(Domain Name System,域名解析系统)服务器完成的。我们不深入了解DNS的具体工作原理了,半天解释不完,可以看上面给出的鸟哥的链接里的内容。
因此,当你在浏览器的地址栏里输入coderunity.com 时,你就能收到由网络上的DNS服务器帮你解析出来的IP地址,你就可以访问程序员联盟的官网了。
你当然不能修改DNS服务器上的主机名和IP地址的对应关系列表(因为有风险,会影响到很多人)。但是你可以自定义你电脑上主机名和IP地址的对应关系。
以root身份打开/etc/hosts 文件:
sudo nano /etc/hosts
可以看到一些IP地址和主机名的对应关系,例如:
127.0.0.1 对应了localhost
127.0.1.1 对应了oscar-laptop,就是小编电脑的主机名
下面还有一些IPv6格式的IP地址。
你可以往里面添加自己的解析对。写在一行里,在IP地址和主机名之间至少要留一个空格。
那么自定义IP地址和主机名之间的解析关系,有什么用呢?
当然有用,有的时候,网络上负责解析域名的DNS服务器可能暂时出现故障(很少见),那这时你在地址栏直接输入IP地址可以访问对应网站,但是输入主机名(域名)则不能访问了,因为没有DNS服务器解析,域名是不能被识别的。
这时,你自定义在本地Linux系统的/etc/hosts文件中的解析规则就可以发挥作用了。你还是可以访问网站。
例如你可以加一条程序员联盟网站的解析对:
58.96.181.197 coderunity.com
但是这样的方法也有缺陷:假如你的主机的IP地址换了,那你输入域名就不能上那个网站了。所以,一般来说,我们还是靠经常更新解析对的网络上的DNS服务器更好(一般一天更新一次)。
对于局域网,这个host文件也是很有用的。
例如在自己家里建立的局域网里面,有你的电脑,还有你老爸的电脑。那你不想记住老爸的电脑的IP地址,怎么办呢?可以添加一条解析对,例如:
192.168.0.7 father-laptop
这样,老爸的电脑的IP地址对应的主机名在你这里就成为father-laptop了,你就可以更方便地访问老爸的电脑。
例如,如果在老爸的电脑里你有一个账户叫oscar,那么用之前学的SSH来登录老爸电脑上的oscar账户,就是:
ssh oscar@father-laptop
就不用输入:
ssh oscar@192.168.0.7
whois:了解有关域名的信息
whois这个命令很好记,由who和is两部分组成,who是英语“谁”的意思,is是英语“是”的第三人称单数形式。所以连起来表示:是谁
每一个域名在登记注册时都须要填写:姓,名,联系地址,联系方式,等等。这是规定。
whois命令就可以帮助我们轻松获得域名背后的这些信息
。
可以选一个主机名来试试,例如:
whois coderunity.com
你就有小编的邮寄地址啦,要送我新年礼物就赶紧哦。哈哈,开玩笑的~
ifconfig和netstat命令:控制和分析网络流量
我们接着学习两个非常强大的命令:ifconfig和netstat。
ifconfig:列出网络接口
ifconfig是linux中用于显示或配置网络设备(网络接口卡)的命令,英文全称是(Network) Interface Configuration。if是Interface的缩写,表示“接口”;configuration是“配置”的意思。
一般来说,你的电脑拥有好几个网络接口,也就是说有多种连接网络的方式。
运行ifconfig命令,显示如下:
在小编的电脑上显示有三个网络接口,分别是:
eth0,lo,wlan0
在你的电脑上可能网络接口多于三个,也可能少于三个,本不足为奇,取决于你电脑的设备。幸好小编的电脑的三个网络接口都是最常见的三个,详述如下:
eth0:对应有线连接(对应你的有线网卡),就是用网线来连接的上网(一般是RJ45网线,见下图),如果你的电脑目前使用网线来上网,那就是在使用这个接口。有些电脑可能同时有好几条网线连着(有好几个有线接口),例如服务器,那么除了eth0(第一块有线网卡),你还会看到例如eth1,eth2,等等。
lo:本地回环(Local Loopback,对应一个虚拟网卡)。可以看到它的IP地址是127.0.0.1,似曾相识是吗?对啊,之前我们在/etc/hosts文件中看到对应localhost的就是这个IP。每台电脑都应该有这个接口,因为它对应着连向... 自己的链接。这也是我们称之为本地回环的原因:所有经由这个接口发送的东西都会回到你自己的电脑。看起来好像并没有什么用,但是有时为了某些缘故(可以百度继续探究),我们需要连接自己。例如用来测试一个网络程序,但又不想让局域网或外网的用户能够查看,只能在此台主机上运行和查看所用的网络接口。比如把
HTTPD服务器指定到回坏地址,在浏览器输入 127.0.0.1 就能看到你所架设的Web网站了。但只有你自己能看得到,局域网的其它主机或用户无从知道。
wlan0:对应Wi-Fi无线连接(对应你的无线网卡)。假如你有好几块无线网卡,那么会看到wlan1,wlan2,等等。
仔细观察上面ifconfig输出的信息,你猜到小编此时用的是哪种方式连网的吗?
聪明如你应该猜到了(可不要害怕阅读一堆英语哦)。是的,小编此时用的是有线连接的方式上网。证明就在eth0的信息中:
RX packets : 4853
TX packets : 4821
分别是接收包和发送包的数目。RX是receive(表示“接收”)的缩写,TX是transmit(表示“发送”)的缩写。
而wlan0的信息中,这两行是0。
当然,本地回环的这两行也有148呢。所以说,给自己发送东西也是会发生的。
ifconfig命令还可以用来配置网络接口。但这有些超出本课程的范围了,毕竟需要懂一些网络方面的知识才能配置啊,不然配错了就糟了。
但是,有一个简单的配置方式我们可以学习:
接口的激活/关闭
使用格式如下:
ifconfig interface state
替换 :
interface:由你想要修改的网络接口名称代替(eth0,wlan0等等)。
state:由up或down代替,分别表示激活和关闭对应接口。
例如:
ifconfig eth0 down
关闭eth0这个有线接口,之后就没有任何网络传输会在eth0上进行了。
ifconfig eth0 up
激活eth0这个有线接口。
配置IP地址
用ifconfig命令可以配置网络接口的IP地址和其他数据
例如:
ifconfig eth0 192.168.120.56 netmask 255.255.255.0 broadcast 192.168.120.255
上面的命令用于给eth0网卡配置IP地址:192.168.120.56,加上子网掩码:255.255.255.0,加上个广播地址: 192.168.120.255
还有更多命令选项就用man ifconfig来查看吧。
netstat : 网络统计
netstat命令很好记,它由两部分组成:net和stat。
net是network的缩写,表示“网络”;stat是statistics的缩写,表示“统计”。所以顾名思义就是对网络信息进行统计啦。(再论学英语对编程的重要性)
假如你没有一些网络方面的知识,那么netstat命令的输出可能难以理解,但是也没那么难。假如你要了解你的电脑正在网络上做什么,那么netstat是不二选择。
netstat可以显示很多信息,但是我们可以用参数来控制显示信息的种类和样式。下面介绍几个常用的参数吧:
netstat -i : 网络接口的统计信息
首先,试试i参数吧:
netstat -i
会显示一张统计列表,列出你电脑的所有网络接口的一些统计信息,例如小编的电脑就列出了eth0,lo,wlan0这三个接口的使用信息。
netstat -uta : 列出所有开启的连接
运行
netstat -uta
参数uta分别表示:
-u : 显示UDP连接(u是udp的首字母)
-t : 显示TCP连接(t是tcp的首字母)
-a : 不论连接的状态如何,都显示(a是all的首字母)
TCP和UDP是两种不同的协议,用于在网络上传输数据。
UDP(User Datagram Protocol,用户数据报协议)一般用于网络游戏,音频通讯(例如Skype)。除此之外,一般来说TCP(Transmission Control Protocol,传输控制协议)是最常用的。一般在互联网上都是用TCP/IP协议。可以去看看小编的《TCP/IP探索之旅》。
我们也可以只显示TCP连接的信息:
netstat -ta
或者只显示UDP连接的信息(不常用):
netstat -ua
再来看看上面图片中state(状态)那一列的信息,有好几种不同状态:
ESTABLISHED:与远程电脑的连接已建立
TIME_WAIT : 连接正在等待网络上封包的处理,一旦处理完毕就开始关闭连接
CLOSE_WAIT:远程服务器中止了连接(也许你太久没什么动作,处在不活跃状态)
CLOSED:连接没有被使用
CLOSING:连接正在关闭,但有些数据还没有发送完毕
LISTEN:监听着可能进入的连接。此时连接还没有被使用。
当然,状态还不止这几种,其他的可以在netstat的命令手册中找到(用man netstat)。
我们再来看看端口的信息,就是上面图片中冒号(:)之后的数据。
事实上,我们连接其他电脑,可以透过不同的端口(port),有点类似门户。比如我去朋友家,可能进他们的厨房门,书房门,地下室门,等等。不同的端口用处不同。进厨房门可能看看做菜如何,进书房门可能一窥书香,进地下室门可能去品品葡萄酒。反正卧室门是不可以随便进的~
摘自百度百科:
==============
"端口"是英文port的意译,可以认为是设备与外界通讯交流的出口。端口可分为虚拟端口和物理端口,其中虚拟端口指计算机内部或交换机路由器内的端口,不可见。例如计算机中的80端口、21端口、23端口等。物理端口又称为接口,是可见端口,计算机背板的RJ45网口,交换机路由器集线器等RJ45端口。电话使用RJ11插口也属于物理端口的范畴。
==============
如下图所示:
你可以加上-n参数,假如你想让端口信息以数字的形式显示,而不是像上图中那样有点看不懂的状态,比如https,nfs,mysql等等。
80端口是为HTTP(HyperText Transport Protocol)即超文本传输协议开放的,此为上网冲浪使用次数最多的协议,主要用于WWW(World Wide Web)即万维网传输信息的协议。可以通过HTTP地址(即常说的“网址”)加“:80”来访问网站,因为浏览网页服务默认的端口号都是80,因此只需输入网址即可,不用输入“:80”了。
110端口是为POP3(邮件协议3)服务开放的,用于收发电子邮件。
21端口用于FTP(File Transfer Protocol,文件传输协议)服务,FTP服务主要是为了在两台计算机之间实现文件的上传与下载。
netstat -lt : 列出状态是LISTEN的统计信息
netstat -s : 列出总结性的统计信息
还有更多命令选项就用man ifconfig来查看吧。
iptables:参考系防火墙
现在既然我们已经知道如何分析网络传输,我们就趁热打铁,学习如何用防火墙来过滤网络传输。
Linux下著名的防火墙是iptables。它有点年纪了,已经服役十几年。iptables命令可以制定一些规则,规定其他电脑可以使用哪些端口来连接你的电脑(入),以及你的电脑可以连接哪些端口(出)。也可以通过IP地址来过滤。类似下图所示:
例如,我想要拦截所有FTP的连接,那么我可以用iptables封锁21端口。
安装iptables防火墙
如果没有安装iptables需要先安装,
CentOS执行:
sudo yum install iptables
Debian/Ubuntu执行:
sudo apt-get install iptables
为了使用iptables,你需要切换到root身份:
sudo su
iptables -L : 显示所有规则
可以看到三个区域:
Chain INPUT : 对应控制《进入》的网络传输的规则
Chain FORWARD : 对应控制《转发》的网络传输的规则
Chain OUTPUT : 对应控制《出去》的网络传输的规则
暂时我们还没有制定任何规则。我们慢慢来学习。
1、清除已有iptables规则(慎用)
iptables -F iptables -X iptables -Z
2、开放指定的端口
#允许本地回环接口(即运行本机访问本机) iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT # 允许已建立的或相关连的通行 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #允许所有本机向外的访问 iptables -A OUTPUT -j ACCEPT # 允许访问22端口 iptables -A INPUT -p tcp --dport 22 -j ACCEPT #允许访问80端口 iptables -A INPUT -p tcp --dport 80 -j ACCEPT #允许FTP服务的21和20端口 iptables -A INPUT -p tcp --dport 21 -j ACCEPT iptables -A INPUT -p tcp --dport 20 -j ACCEPT
#如果有其他端口的话,规则也类似,稍微修改上述语句就行。
#禁止其他未允许的规则访问(注意:如果22端口未加入允许规则,SSH链接会直接断开。)
1).用DROP方法
iptables -A INPUT -p tcp -j DROP
2).用REJECT方法
iptables -A INPUT -j REJECT iptables -A FORWARD -j REJECT
3、屏蔽IP
#如果只是想屏蔽IP的话“3、开放指定的端口”可以直接跳过 #屏蔽单个IP的命令是 iptables -I INPUT -s 123.45.6.7 -j DROP #封整个段即从123.0.0.1到123.255.255.254的命令 iptables -I INPUT -s 123.0.0.0/8 -j DROP #封IP段即从123.45.0.1到123.45.255.254的命令 iptables -I INPUT -s 124.45.0.0/16 -j DROP #封IP段即从123.45.6.1到123.45.6.254的命令是 iptables -I INPUT -s 123.45.6.0/24 -j DRO
4、查看已添加的iptables规则
iptables -L -n
v:显示详细信息,包括每条规则的匹配包数量和匹配字节数
x:在 v 的基础上,禁止自动单位换算(K、M) vps侦探
n:只显示IP地址和端口号,不将ip解析为域名
5、删除已添加的iptables规则
将所有iptables以序号标记显示,执行:
iptables -L -n --line-numbers
比如要删除INPUT里序号为8的规则,执行:
iptables -D INPUT 8
6、iptables的开机启动及规则保存
CentOS上可能会存在安装好iptables后,iptables并不开机自启动,可以执行一下:
chkconfig --level 345 iptables on
将其加入开机启动。
CentOS上可以执行:service iptables save 保存规则。
Debian/Ubuntu上iptables是不会保存规则的。
需要按如下步骤进行,让网卡关闭是保存iptables规则,启动时加载iptables规则。
如果当前用户不是root,即使使用了sudo,也会提示你没有权限,无法保存,所以执行本命令,你必须使用root用户。
可以使用sudo -i 快速转到root,使用完成,请及时使用su username切换到普通帐户。
为了重启服务器后,规则自动加载,我们创建如下文件:
sudo vim /etc/network/if-pre-up.d/iptables#!/bin/bash iptables-save > /etc/iptables.rules
添加执行权限。
chmod +x /etc/network/if-pre-up.d/iptables
附上基础规则:
*filter :INPUT ACCEPT [106:85568] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [188:168166] :RH-Firewall-1-INPUT - [0:0] #允许本地回环接口(即运行本机访问本机) -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT #允许已建立的或相关连的通行 -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #允许所有本机向外的访问 -A OUTPUT -j ACCEPT #允许PPTP拨号到外网 -A INPUT -p tcp -m tcp --dport 1723 -j ACCEPT #仅特定主机访问Rsync数据同步服务 -A INPUT -s 8.8.8.8/32 -p tcp -m tcp --dport 873 -j ACCEPT #仅特定主机访问WDCP管理系统 -A INPUT -s 6.6.6.6/32 -p tcp -m tcp --dport 8080 -j ACCEPT #允许访问SSH -A INPUT -p tcp -m tcp --dport 1622 -j ACCEPT #允许访问FTP -A INPUT -p tcp -m tcp --dport 21 -j ACCEPT -A INPUT -p tcp -m tcp --dport 20 -j ACCEPT #允许访问网站服务 -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT #禁止所有未经允许的连接 -A INPUT -p tcp -j DROP #注意:如果22端口未加入允许规则,SSH链接会直接断开 #-A INPUT -j REJECT #-A FORWARD -j REJECT COMMIT
可以使用一下方法直接载入:
1、复制上面的规则粘贴到这里,保存本文件
sudo vim /etc/iptables.test.rules
2、把本规则加载,使之生效,注意,iptables不需要重启,加载一次规则就成了
sudo iptables-restore < /etc/iptables.test.rules
3、查看最新的配置,应该所有的设置都生效了.
sudo iptables -L -n
4、保存生效的配置,让系统重启的时候自动加载有效配置(iptables提供了保存当前运行的规则功能)
iptables-save > /etc/iptables.rules
看着很复杂,因为还没学习脚本语言和Vim编辑器的关系。刚好,我们第五部分就会学习Vim编辑器和脚本。
如果你想提前试试,也可以看Ubuntu官方的关于保存和配置开机加载iptables规则的文章:https://help.ubuntu.com/community/IptablesHowTo#Saving_iptables
我们也见识到了,iptables的配置相当繁复,普通用户简直望而却步。幸好,有一些软件可以帮助我们减轻痛苦:
UFW - Uncomplicated Firewall
UFW是Uncomplicated Firewall的缩写,顾名思义这个软件是“不复杂的防火墙”,比iptables简单很多。但ufw并不是在每个Linux发行版中都有的,幸好,Ubuntu中有。
Ubuntu官方UFW文档:https://help.ubuntu.com/community/UFW
中文Ubuntu官方UFW文档:http://wiki.ubuntu.org.cn/Ufw%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97
当然了,还有更好的图形界面的UFW:gufw
Ubuntu官方GUFW文档:https://help.ubuntu.com/community/Gufw
注意:
新的防火墙子系统/包过滤引擎nftables在 Linux 3.13 中替代有十多年历史的iptables。iptables/netfilter是在2001年加入到2.4内核中。
诞生于2008年的nftables设计替代iptables,它提供了一个更简单的Kernel ABI,减少重复代码,改进错误报告,更有效支持过滤规则。
除了iptables,nftables还将替代ip6tables、arptables和ebtables。Linux内核的第一代包过滤机制是ipfwadm(1.2.1内核,1995年),之后是ipchains(1999年),iptables。nftables是第四代。
nftables引入了一个新的命令行工具nft。nft是iptables及其衍生指令(ip6tables,arptables)的超集。
同时,nft拥有完全不同的语法。如果你习惯于iptables,这是个不好的消息。但是有一个兼容层允许你使用iptables,而过滤是由内核中的nftables完成的。
但是基本的原理是类似的,nftables比iptables更方便,使用更有效率,可以把一些命令合并。
例如:
你想用iptables记录并丢弃一个包,你必须写两条规则,一条记录,一条丢弃:
iptables -A FORWARD -p tcp --dport 22 -j LOG iptables -A FORWARD -p tcp --dport 22 -j DROP
使用nft,你可以把两个目标合并到一起:
nft add rule filter forward tcp dport 22 log drop
所以,假如你的Linux内核版本是3.13之前的,那就继续使用iptables;如果是3.13版本之后,那就用nftables吧(其实nftables要从3.15版本才开始比较成熟)。
还有更多命令选项就用man iptables和man nftables来查看吧。
总结
在Internet(互联网)上,每台电脑都由IP地址来标识。例如:89.210.135.74
我们可以把一个主机名绑定到一个IP地址上,主机名相对IP地址更容易被记住。例如:coderunity.com 在很多场合,用主机名就可以代替IP地址了。
host命令可以从IP地址解析出对应主机名,或者从主机名解析出IP地址。
ifconfig命令列出你电脑上的网络接口(对应虚拟网卡或实体网卡),可以配置和操作这些接口。
netstat列出你电脑上打开的连接,说明当下哪些端口正打开着,一个端口就好比引导出入你电脑的门户。
可以用iptables来拦截进入某些端口的连接,它是一个很不错的防火墙。但是配置比较复杂。iptables配置很繁琐,可以用ufw软件来减轻压力。从Linux 3.13开始,nftables替代了iptables。
今天的课就到这里,一起加油吧!
下一课我们学习:源码编译,安装便利
标签:
原文地址:http://blog.csdn.net/frogoscar/article/details/50446586