📄 0210port_limit.htm
字号:
<!-- 本文的正式部分 -->
<hr /><a NAME="ports"></a><img src="images/penguin-m.gif" alt="大标题的图示" height="34" width="25" align="middle" /><span class="text_h1">Linux 的埠口 (port)</span><br />
<div class=block1>
我们在<a href="0110network_basic.php#protocol">网路基础的通讯协定</a>那个小节曾经谈到 TCP
封包表头最重要的就是来源与目标的埠口 (port) 了,若再加上来源与目标的 IP 就可成为一组
<a href="0110network_basic.php#protocol_tcp_socket">Socket pair</a> ,这个 port
就是用在网路连线时提供连线接口的咚咚棉,在开始这一节之前,请您先前往网路基础那一章再瞧一瞧先。
除了这个之外,还有没有其他需要注意的事项呢?底下我们就来谈一谈先!<br /><br />
<hr /><a NAME="ports_whatis"></a><img src="../images/penguin-s.gif" alt="小标题的图示" height="23" width="16" align="middle" /><span class="text_h2">什么是 port</span><br />
<div class=block2>
你或许常常会在网路上听说『<span class=text_import2>我的主机开了多少的 port ,会不会被入侵呀?</span>』
或者是说『<span class=text_import2>开那个 port 会比较安全?又,我的服务应该对应什么 port
呀?</span>』呵呵!很神奇吧!怎么一部主机上面有这么多的奇怪的 port 呢?<br /><br />
其实也不怎么难啦!在<a href="0110network_basic.php">网路基础</a>里面我们曾经介绍过很多的网路概念,
所以你会知道要达成一条 server/client 的连线,需要一组
<a href="0110network_basic.php#protocol_tcp_socket">Socket pair</a> 来建立连线,
这也就是说,<span class=text_import2>网路连线是『双向』的</span>。
此外,既然我们想要连线到主机端,那么主机势必得要启动一个大家都知道的 port 在『监听』吧,
否则如何达成连线呢?您说是吧!另外, client 端是否要启用固定的 port 来连线?
当然不需要啊~那共有多少 port 呢?底下我们就先来谈一谈。<br />
<ul><li><span class=text_import1>主机端的监听 (Listen)</span>∶<br />想一想,你要如何连上 Yahoo
的网站去看新闻?首先当然是要打开浏览器,然后输入 Yahoo 的网址,之后我们的浏览器就会连接到 Yahoo
的 WWW 网站去要求资料了。既然如此的话,那么那部 Yahoo 的 WWW 主机当然就得要启动 WWW 的服务啦,
然后我们的浏览器才能够连接到该服务。这也就是说『<span class=text_import2>主机所启用的 port
其实是由某些网路服务 (program) 所启动的</span>』。而为了连接上的方便,因此很多服务所开启的 port
是固定的,例如 WWW 开启在 port 80 ,mail 开启在 port 25 等等;<br /><br /></li>
<li><span class=text_import1>用户端的 port</span>∶<br />用户端启动的 port 是随机产生的,
主要是开启在大于 1024 以上的埠口,这个 port 也是由某些软体所产生的,例如上面提到的例子,
我们的浏览器想要连接到 Yahoo 的 WWW 主机,那么浏览器就得要启用一个 port 来与主机进行连线,
以组成一组 Socket pair 来传输资料嘛!</li></ul>
所谓的『监听』是某个服务程式会一直常驻在记忆体当中,所以该程式启动的 port 就会一直存在。
至于 port 在传输过程中的判断,那就由 TCP/UDP 等通讯协定的表头资料来记录的啊,
我们的主机透过分析 TCP/UDP 的表头资料就能够了解到该连线所需要连接的软体是那个,
而给予正确的资料回应。所以,一部主机上面当然可以同时启动很多不同的服务啊! ^_^。<br /><br />
还有上面提到的一些重点你也得再了解一下,那就是∶<br />
<ul>
<li><span class=text_import1>共 65536 个 port</span>∶<br />
预设的情况下,我们的主机会有 65536 个 port,而这些 port 又分成两个部分,以 port 1024 作区隔∶<br /><br /></li>
<li><span class=text_import1>只有 root 才能启动的保留的 port</span>∶<br />
在小于 1023 (连同 1023) 的埠口,都是需要以 root 的身份才能启动的,
这些 port 主要是用于一些常见的通讯服务,在 Linux 系统下,常见的协定与 port 的对应是记录在
<a href="0110network_basic.php#protocol_tcp_socket">/etc/services</a> 里面的。
一般来说,这些 port 最好保留给一些预设的服务来使用,不要自己随意使用到这些 port,
因为这些 port 是目前 Internet 上面所惯用的,所以一些程式开发者在进行软体的开发时,
就能够针对这些 well know 的埠口直接来开发,大家也比较容易使用伺服器的功能啊!<br /><br /></li>
<li><span class=text_import1>大于 1024 用于 client 端的 port</span>∶<br />
在大于 1024 以上的 port 主要是作为 client 端的软体启动的 port 。这些 port 几乎都是依序随机使用的,
例如前面谈到的浏览器,就是使用大于 1024 以上的 port。那如果用到 port 65535 后,
系统会主动再由前面没有使用到的埠口 (如 1024) 再重新依序使用。<br /><br /></li>
<li><span class=text_import1>是否需要三向交握</span>∶<br />
建立可靠的连线服务需要使用到 TCP 协定,也就需要所谓的
<a href="0110network_basic.php#protocol_tcp_3_handshake">三向交握</a>了,
如果是非可靠的连线服务,例如 DNS ,那只要使用 UDP 协定即可。<br /><br />
<li><span class=text_import1>通讯协定启用在非正规的 port</span>∶<br />
我们知道浏览器预设会连接到 WWW 主机的 port 80,那么你的 WWW 是否可以启动在非 80 的其他埠口?
当然可以啊!你可以透过 WWW 软体的设定功能将该软体使用的 port 启动在非正规的埠口,
只是如此一来,您的用户端要连接到你的主机时,就得要在浏览器的地方额外指定你所启用的非正规的埠口才行。
这个启动在非正规的埠口功能,常常被用在一些所谓的地下网站啦!^_^。另外,
某些软体预设就启动在大于 1024 以上的埠口,如 MySQL 资料库软体就启动在 3306。<br /><br /></li>
<li><span class=text_import1>所谓的 port 的安全性</span>∶<br />
事实上,<span class=text_import2>没有所谓的 port 的安全性!因为『Port 的启用是由服务软体所造成的』</span>,
也就是说,真正影响网路安全的并不是 port ,而是启动 port 的那个软体 (程式)!
或许你偶而会听到∶『没有修补过漏洞的 bind 8.x 版,很容易被黑客所入侵,请尽快升级到
bind 9.x 以后版本』,所以棉,<span class=text_import2>对安全真正有危害的是『某些不安全的服务』
而不是『开了哪些 port 』</span>才是!因此,没有必要的服务就将他关闭吧!
尤其某些网路服务还会启动一些 port 哩!另外,那些已启动的软体也需要持续的保持更新喔!
</ul>
</div>
<hr /><a NAME="ports_look"></a><img src="../images/penguin-s.gif" alt="小标题的图示" height="23" width="16" align="middle" /><span class="text_h2">观察 port</span><br />
<div class=block2>
好了,我们现在知道这个 port 是什么鬼东西了,再来就是要去『看他到底在干啥?』没错!
再来就是要来了解一下,我们的主机到底是开了多少的 port 呢?如同我们前面说的,
您得要先了解一下,我们的『服务』跟『 port 』对应的档案是哪一个?再提醒一次呦!是『
<span class=text_import2>/etc/services</span> 』啦!
而常用来观察 port 的则有底下两个程式∶<br />
<ul><span class=text_import2>
<li>netstat∶在本机上面以自己的程式监测自己的 port;
<li>nmap∶透过网路的侦测软体辅助,可侦测非本机上的其他网路主机,但有违法之虞。</span></ul>
见他的大头王!怎么使用 nmap 会违法?呵呵!由于 nmap 的功能太强大了,所以很多
cracker (怪客,网路上面的闲人) 会直接以他来侦测别人的主机,这个时候就可能造成违法啦!
只要您使用 nmap 的时候不要去侦测别人的电脑主机,那么就不会有问题啦!
底下我们分别来说一说这两个宝贝吧!<br /><br />
<a name="netstat"></a><hr><li><span class=text_import1>netstat</span><br />
<div class=block2>
在做为主机的 Linux 系统中,<span class=text_import2>开启的网路服务越少越好</span>!
因为较少的服务可以较容易除错 (debug) 与了解安全漏洞,并可避免不必要的入侵管道!
所以,这个时候请了解一下您的系统当中有没有哪些服务被开启了呢?
要了解自己的系统当中的服务项目,最简便的方法就是使用
<a href="0140networkcommand.php#netstat">netstat</a> 了!这个东西不但简单
(每一部 Linux 机器当中预设都会安装的程式喔!) ,而且功能也是很不错的。
这个指令的使用方法在 <a href="0140networkcommand.php">Linux 常用网路功能</a>指令介绍当中提过了,
底下我们仅提供如何使用这个工具的方法棉!<br /><br />
<span class=text_import1>列出在监听的网路服务∶</span><br />
列出网路服务的方式简单,如下所示∶<br />
<table class="term"><tr><td class="term"><pre>
[root@linux ~]# <span class=term_command>netstat -tunl</span>
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN
tcp 0 0 :::80 :::* LISTEN
tcp 0 0 :::22 :::* LISTEN
tcp 0 0 :::25 :::* LISTEN
</pre></td></tr></table>
上面说明了我的主机有启动 port 25, 80, 22 等,而且观察各连线介面,可发现这三个 port
都有对外提供连线的能力喔!<br /><br />
<span class=text_import1>列出已连线的网路连线状态∶</span><br />
如果仅是要列出网路介面上已经连线的或者是一些连线过程挂断、连接程序的网路状态,
可以使用如下的方式来处理∶<br />
<table class="term"><tr><td class="term"><pre>
[root@linux ~]# <span class=term_command>netstat -tun</span>
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 192.168.10.100:25 192.168.10.5:3151 TIME_WAIT
tcp 0 0 192.168.10.100:22 192.168.10.150:1832 ESTABLISHED
</pre></td></tr></table>
从上面的资料来看,我的主机 (192.168.10.100) 目前仅有一条已建立的连线,
那就是与 192.168.10.150 那部主机连接的连线,并且连线方线是由对方连接到我主机的 port 22
来取用我主机的服务呐!至于那个 TIME_WAIT 则是在等待该连线挂断啦!<br /><br />
<span class=text_import1>删除已建立或在监听当中的连线∶</span><br />
如果想要将已经建立,或者是正在监听当中的网路服务关闭的话,最简单的方法当然就是找出该连线的 PID,
然后将他 kill 掉即可啊!例如下面的范例∶<br />
<table class="term"><tr><td class="term"><pre>
[root@linux ~]# <span class=term_command>netstat -tunp</span>
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/P name
tcp 0 68 192.168.10.100:22 192.168.10.150:1832 ESTABLISHED <span class=term_write>13247/sshd</span>
</pre></td></tr></table>
如上面的范例,我们可以找出来该连线是由 sshd 这个程式来启用的,并且他的 PID 是 13247,
希望你不要心急的用 <a href="../linux_basic/0440processcontrol.php#killall">killall</a>
这个指令,否则容易删错人 (因为你的主机里面可能会有多个 sshd 存在),
应该要使用 <a href="../linux_basic/0440processcontrol.php#kill">kill</a> 这个指令才对喔!<br />
<table class="term"><tr><td class="term"><pre>
[root@linux ~]# <span class=term_command>kill -9 13247</span>
</pre></td></tr></table>
</div>
<a name="nmap"></a><hr><li><span class=text_import1>nmap</span><br />
<div class=block2>
如果你要侦测的设备并没有自己的作业系统,举例来说,你想要了解一下公司的网路印表机是否有开放某些协定时,
那该如何处理啊?现在你知道 <a href="#netstat">netstat</a> 可以用来查阅本机上面的许多监听中的通讯协定,
那例如网路印表机这样的非本机的设备,要如何查询啊?呵呵!用 nmap 就对了!<br /><br />
nmap 的套件说明之名称为∶『Network exploration tool and security scanner』,顾名思义,
这个东西是被系统管理员用来管理系统安全性查核的工具!他的具体描述当中也提到了,
nmap 可以经由程式内部自行定义的几个 port 对应的指纹资料,来查出该 port
的服务为何,所以我们也可以藉此了解我们主机的 port 到底是干嘛用的!如果您是安装 Linux 是 Red Hat
系统的话,那么这个 nmap 套件应该已经安装妥当了,万一没有这个套件的话,也可以来到底下的网站下载∶<br />
<ul><li><a href="http://insecure.org/nmap/"
target="_blank">http://insecure.org/nmap/</a></ul>
<table class="term"><tr><td class="term"><pre>
[root@linux ~]# <span class=term_command>nmap [扫瞄类型] [扫瞄参数] [hosts 位址与范围]</span>
<span class=term_say>参数∶
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -