1.什么是iptables
iptable其实是Linux下的数据包过滤软件,也是目前最新Linux发行版中默认的防火墙。要想深入了解iptables机制,了解防火墙的规则是必不可少的。由于iptables利用的数据包过滤的机制,所以它会分析数据包的报头数据。根据报头数据与定义的规则来决定该数据包是进入主机还是丢弃。 也就是说,根据数据包的分析资料”对比”预先定义的规则内容,若数据包数据与规则内容相同则进行动作,否则就继续下一条规则的比对。重点在比对与分析顺序。
2.iptables的简单工作原理
举个简单的例子,当我们的iptables定义了十条防火墙规则,那么当Internet来了一个数据包想要进入主机前,会先经过iptables的规则。检查通过则接受(ACCEPT)进入本机取得资源,如果检查不通过,则可能予以丢弃(DROP).一定要注意一点,iptables定义的规则是有顺序,但某个数据包符合Rule1,则会执行Rule1对应的Action1而并不会理会后面所有的Rule。当所有Rule都不匹配,会执行默认操作。
iptables的规则是非常重要的,比如当我们有一台提供WWW的服务的主机,自然我们就要针对port 80端口来启动通过的数据包规则,但我们发现IP为192.169.155.155总是存在恶意操作,所以我们要禁止该IP来访问该服务,最后所有非WWW的数据包全部丢弃,我们来看完成这三个功能的规则顺序。
- Rule1先阻挡192.168.155.155
- Rule2再让请求WWW服务的数据包通过
- Rule3将所有的数据包丢弃
现在我们想一下,如果这三条规则的顺序变了之后,我们还能完成刚刚的需求么?
3.iptables的策略
防火墙策略一般分为两种,一种叫“通”策略,一种叫“堵”策略,通策略,默认门是关着的,必须要定义谁能进。堵策略则是,大门是洞开的,但是你必须有身份认证,否则不能进。所以我们要定义,让进来的进来,让出去的出去,所以通,是要全通,而堵,则是要选择。当我们定义的策略的时候,要分别定义多条功能,其中:定义数据包中允许或者不允许的策略,filter过滤的功能,而定义地址转换的功能的则是nat选项。为了让这些功能交替工作,我们制定出了“表”这个定义,来定义、区分各种不同的工作功能和处理方式。
刚刚我们所说的规则仅仅是iptables表格中的一个链而已。iptables里面有多个表格(table),每个表格都定义出自己的默认策略与规则,且每个表格的用途都不相同。
我们现在用的比较多有如下3个:
- 1.filter(过滤器,默认的table) 定义允许或者不允许的
- 2.nat(地址转换) 定义地址转换的
- 3.mangle(破坏者)功能:修改报文原数据,加特殊标记。
4.上述表中常见的链
与数据包是否进入Linux本机有关的表:Filter
- INPUT:主要与想要进入Linux主机的数据包有关
- OUTPUT : 主要与Linux本机所要送出的数据包有关
- FORWARD : 与Linux本机没有关系,它可以传递数据包到后端的计算机中,与表NAT有关
用来进行来源与目的地的IP或port的转换(主要于Linux主机后的局域网内的主机有关):NAT
- PREROUTING:在进行路由判断之前所要进行的规则(DNAT/REDIRECT) 。
- POSTROUTING :在进行路由判断之后所有进行的规则(SNAT/MASQUERADE)。
- OUTPUT: 与发送出去的数据包有关
与特殊的数据包的路由标志有关:Mangle 上述5个了链都可以做
由于Filter是默认的table,并且如果iptables只是用来保护Linux主机本身的话,只用关注Filter表格内的INPUT和OUTPUT这两条链即可。其余的两个table也不常用,因此我们重点学习Filter。
5.iptables中规则的查看
如果在安装Linux的时候没有选择防火墙,那么iptables在一开始应该是没有规则的。如果在安装的时候选择自动建立防火墙机制,那么就有默认的防火墙规则。我们来看查看iptables规则的命令。
<code class="hljs mel has-numbering" style="display: block; padding: 0px; color: inherit; Box-sizing: border-Box; font-family: 'Source Code Pro',monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">iptables [-t table ] [-L] [-nv]
选项与参数:
-t:后面接table。例如 <span class="hljs-keyword" style="color: rgb(0,136); Box-sizing: border-Box;">filter</span>或者nat。如果不写默认是<span class="hljs-keyword" style="color: rgb(0,136); Box-sizing: border-Box;">filter</span>
-L:列出目前的table规则
-n:不进行IP与HOSTNAME的反查,使用此参数查询结果会很快
-v:列出更多信息,包括通过该规则的数据包总位数,相关的网络接口等。
<span class="hljs-comment" style="color: rgb(136,0); Box-sizing: border-Box;">//我们执行上述命令</span>
hadoop wang # iptables -L -n
<span class="hljs-comment" style="color: rgb(136,0); Box-sizing: border-Box;">//针对INPUT链,且默认策略为可接受</span>
Chain INPUT (policy ACCEPT)
<span class="hljs-comment" style="color: rgb(136,0); Box-sizing: border-Box;">//说明栏</span>
target prot opt <span class="hljs-keyword" style="color: rgb(0,136); Box-sizing: border-Box;">source</span> destination
<span class="hljs-comment" style="color: rgb(136,0); Box-sizing: border-Box;">//针对FORWARD链,且默认策略为可接受</span>
Chain FORWARD (policy ACCEPT)
target prot opt <span class="hljs-keyword" style="color: rgb(0,0); Box-sizing: border-Box;">//针对OUTPUT链,且默认策略为可接受</span>
Chain OUTPUT (policy ACCEPT)
target prot opt <span class="hljs-keyword" style="color: rgb(0,136); Box-sizing: border-Box;">source</span> destination </code><ul class="pre-numbering" style="Box-sizing: border-Box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221,221,221); list-style: none; text-align: right; background-color: rgb(238,238,238);"><li style="Box-sizing: border-Box; padding: 0px 5px;">1</li><li style="Box-sizing: border-Box; padding: 0px 5px;">2</li><li style="Box-sizing: border-Box; padding: 0px 5px;">3</li><li style="Box-sizing: border-Box; padding: 0px 5px;">4</li><li style="Box-sizing: border-Box; padding: 0px 5px;">5</li><li style="Box-sizing: border-Box; padding: 0px 5px;">6</li><li style="Box-sizing: border-Box; padding: 0px 5px;">7</li><li style="Box-sizing: border-Box; padding: 0px 5px;">8</li><li style="Box-sizing: border-Box; padding: 0px 5px;">9</li><li style="Box-sizing: border-Box; padding: 0px 5px;">10</li><li style="Box-sizing: border-Box; padding: 0px 5px;">11</li><li style="Box-sizing: border-Box; padding: 0px 5px;">12</li><li style="Box-sizing: border-Box; padding: 0px 5px;">13</li><li style="Box-sizing: border-Box; padding: 0px 5px;">14</li><li style="Box-sizing: border-Box; padding: 0px 5px;">15</li><li style="Box-sizing: border-Box; padding: 0px 5px;">16</li><li style="Box-sizing: border-Box; padding: 0px 5px;">17</li><li style="Box-sizing: border-Box; padding: 0px 5px;">18</li><li style="Box-sizing: border-Box; padding: 0px 5px;">19</li></ul>
上述每一个chain就是前面提到的每个链。Chain那一行括号里面policy就是默认的策略。下面分析说明栏的五列分别代表的意思:
- target:代表进行的操作,ACCEPT是放行,而REJECT则是拒绝,此外,尚有DROP(丢弃)的项目.
- 代表使用的数据包协议,主要有TCP,UDP及ICMP数据包格式。
- opt:额外的选项说明。
- source :代表次规则是针对哪个来源IP进行限制
- destination: 代表次规则是针对哪个目标IP进行限制
5.iptables中规则的清除
<code class="hljs haml has-numbering" style="display: block; padding: 0px; color: inherit; Box-sizing: border-Box; font-family: 'Source Code Pro',monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">iptables [ -t tables ] [ -FXZ ]
-<span class="ruby" style="Box-sizing: border-Box;"><span class="hljs-constant" style="Box-sizing: border-Box;">F</span><span class="hljs-symbol" style="color: rgb(0,102,102); Box-sizing: border-Box;">:</span>清楚所有的已定制的规则
</span>-<span class="ruby" style="Box-sizing: border-Box;"><span class="hljs-constant" style="Box-sizing: border-Box;">X</span><span class="hljs-symbol" style="color: rgb(0,102); Box-sizing: border-Box;">:</span>清楚所有用户<span class="hljs-string" style="color: rgb(0,136,0); Box-sizing: border-Box;">"自定义"</span>的chain或者tables
</span>-<span class="ruby" style="Box-sizing: border-Box;"><span class="hljs-constant" style="Box-sizing: border-Box;">Z</span><span class="hljs-symbol" style="color: rgb(0,102); Box-sizing: border-Box;">:</span>将所有的chain的计数与流量统计都归零
</span>
清楚防火墙的所有规则:
iptables -F
iptables -X
iptables -Z</code><ul class="pre-numbering" style="Box-sizing: border-Box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221,238);"><li style="Box-sizing: border-Box; padding: 0px 5px;">1</li><li style="Box-sizing: border-Box; padding: 0px 5px;">2</li><li style="Box-sizing: border-Box; padding: 0px 5px;">3</li><li style="Box-sizing: border-Box; padding: 0px 5px;">4</li><li style="Box-sizing: border-Box; padding: 0px 5px;">5</li><li style="Box-sizing: border-Box; padding: 0px 5px;">6</li><li style="Box-sizing: border-Box; padding: 0px 5px;">7</li><li style="Box-sizing: border-Box; padding: 0px 5px;">8</li><li style="Box-sizing: border-Box; padding: 0px 5px;">9</li></ul>
上述三个命令会将防火墙的规则都清除,但不会改变默认策略(policy)。一般来说,我们重新定义防火墙的时候都会先把规则清除掉。
6.iptables中定义默认策略(policy)
前面提到,当数据包不在我们设置的规则之内时,则该数据包的通过与否,是以Policy的设置为准。在安全性比较高的主机中,Filter内的INPUT链定义的比较严格,INPUT的Policy定义为DROP
iptables定义规则:
格式:iptables [-t table] -P [INPUT,OUTPUT,FORWARD] [ACCEPT,DROP ]
-p : 定义策略(Policy)。注意:P为大写
ACCEPT:数据包可接受
DROP:数据包被丢弃,client不知道为何被丢弃。
<code class="hljs sql has-numbering" style="display: block; padding: 0px; color: inherit; Box-sizing: border-Box; font-family: 'Source Code Pro',monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">iptables -P INPUT <span class="hljs-operator" style="Box-sizing: border-Box;"><span class="hljs-keyword" style="color: rgb(0,136); Box-sizing: border-Box;">DROP</span> //<span class="hljs-keyword" style="color: rgb(0,136); Box-sizing: border-Box;">INPUT</span>默认设置为<span class="hljs-keyword" style="color: rgb(0,136); Box-sizing: border-Box;">DROP</span>
iptables -P <span class="hljs-keyword" style="color: rgb(0,136); Box-sizing: border-Box;">OUTPUT</span> <span class="hljs-keyword" style="color: rgb(0,136); Box-sizing: border-Box;">OUTPUT</span>默认设置为ACCEPT
iptables -P FORWARD <span class="hljs-keyword" style="color: rgb(0,136); Box-sizing: border-Box;">DROP</span> // FORWARD默认设置为ACCEPT
</span></code><ul class="pre-numbering" style="Box-sizing: border-Box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221,238);"><li style="Box-sizing: border-Box; padding: 0px 5px;">1</li><li style="Box-sizing: border-Box; padding: 0px 5px;">2</li><li style="Box-sizing: border-Box; padding: 0px 5px;">3</li><li style="Box-sizing: border-Box; padding: 0px 5px;">4</li></ul>
此时我们执行 iptables-save(不同与iptables -L -n -v的是它会列出完整的防火墙规则)会看到如下信息:
Box-sizing: border-Box; position: relative; overflow-y: hidden; overflow-x: auto; margin-top: 0px; margin-bottom: 1.1em; font-family: 'Source Code Pro',monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">*filter
:INPUT <span class="hljs-operator" style="Box-sizing: border-Box;"><span class="hljs-keyword" style="color: rgb(0,136); Box-sizing: border-Box;">DROP</span> [<span class="hljs-number" style="color: rgb(0,102); Box-sizing: border-Box;">0</span>:<span class="hljs-number" style="color: rgb(0,102); Box-sizing: border-Box;">0</span>]
:FORWARD ACCEPT [<span class="hljs-number" style="color: rgb(0,102); Box-sizing: border-Box;">0</span>]
:<span class="hljs-keyword" style="color: rgb(0,136); Box-sizing: border-Box;">OUTPUT</span> ACCEPT [<span class="hljs-number" style="color: rgb(0,102); Box-sizing: border-Box;">0</span>]
<span class="hljs-keyword" style="color: rgb(0,136); Box-sizing: border-Box;">COMMIT</span>
//由于<span class="hljs-keyword" style="color: rgb(0,136); Box-sizing: border-Box;">INPUT</span>设置为<span class="hljs-keyword" style="color: rgb(0,136); Box-sizing: border-Box;">DROP</span>而又尚未有任何规则,所有显示如上结果。此时所有数据包均都无法进入</span></code><ul class="pre-numbering" style="Box-sizing: border-Box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221,238);"><li style="Box-sizing: border-Box; padding: 0px 5px;">1</li><li style="Box-sizing: border-Box; padding: 0px 5px;">2</li><li style="Box-sizing: border-Box; padding: 0px 5px;">3</li><li style="Box-sizing: border-Box; padding: 0px 5px;">4</li><li style="Box-sizing: border-Box; padding: 0px 5px;">5</li><li style="Box-sizing: border-Box; padding: 0px 5px;">6</li></ul>
现在我们可以设置默认策略后,现在来看看关于各规则的数据包基础比对设置。
7.数据包的基础对比:IP,网络及接口设备
现在我们来添加防火墙规则的数据包对比设置。从最基础的IP,网络及端口开始(即是OSI的第三层谈起)再来谈谈设备(网络卡)的限制等。
iptables定义规则的格式:
iptables [-AI 链名] [-io 网络接口 ] [ -p 协议 ] [ -s 来源IP/网络 ] [ -d 目标IP/网络 ] -j [ACCEPT | DROP|REJECT|LOG]
参数说明:
-A:新增一条规则,该规则在原规则的最后面。
-I:插入一条规则,默认该规则在原第一条规则的前面。即该新规则变为第一条规则。
-io 网络接口:设置数据包进出的接口规范。
-i:表示输入。即数据包进入的网络接口。与INPUT链配合
-o : 表示输出。数据包传出的网络接口。与OUTPUT链配合
-p 协定: 此规则适应于哪种数据包。如tcp,udp,icmp及all.
-s 来源 IP/网络:设置次规则之前数据包的来源地,可指定单纯的IP或网络,例如:
IP : 192.168.0.100
网络 : 192.168.0.0/24或者192.168.0.0/255.255.255.0
如果规则为不允许,则在IP/网络前加 “!” 即可。
-s ! x.x.x.x
-d 目标 IP/网络。与-s类似,只是是目标IP或者网络而已。
-j:后面接操作。如ACCEPT,DROP ,REJECT或者LOG(记录)
比如:开放lo这个本机的接口以及某个IP来源
<code class="hljs lasso has-numbering" style="display: block; padding: 0px; color: inherit; Box-sizing: border-Box; font-family: 'Source Code Pro',monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136,0); Box-sizing: border-Box;">//设置io成为受信任的设备,亦即进出lo的数据包都接受</span>
iptables <span class="hljs-attribute" style="Box-sizing: border-Box;">-t</span> filter <span class="hljs-attribute" style="Box-sizing: border-Box;">-A</span> INPUT <span class="hljs-attribute" style="Box-sizing: border-Box;">-i</span> lo <span class="hljs-attribute" style="Box-sizing: border-Box;">-j</span> REJECT</code><ul class="pre-numbering" style="Box-sizing: border-Box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221,238);"><li style="Box-sizing: border-Box; padding: 0px 5px;">1</li><li style="Box-sizing: border-Box; padding: 0px 5px;">2</li></ul>
我们可能会有疑惑,为什么没有-s -d等规则,表示不论数据包来自何处或去到哪里,只要是来自lo这个接口全部接受。
设置来自192.168.100.10的就接受,192.168.100.11的就丢弃。
Box-sizing: border-Box; position: relative; overflow-y: hidden; overflow-x: auto; margin-top: 0px; margin-bottom: 1.1em; font-family: 'Source Code Pro',monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">iptables <span class="hljs-attribute" style="Box-sizing: border-Box;">-A</span> INPUT <span class="hljs-attribute" style="Box-sizing: border-Box;">-i</span> eth0 <span class="hljs-attribute" style="Box-sizing: border-Box;">-s</span> <span class="hljs-number" style="color: rgb(0,102); Box-sizing: border-Box;">192.168</span><span class="hljs-number" style="color: rgb(0,102); Box-sizing: border-Box;">.100</span><span class="hljs-number" style="color: rgb(0,102); Box-sizing: border-Box;">.10</span> <span class="hljs-attribute" style="Box-sizing: border-Box;">-j</span> ACCEPT
iptables <span class="hljs-attribute" style="Box-sizing: border-Box;">-A</span> INPUT <span class="hljs-attribute" style="Box-sizing: border-Box;">-i</span> eth0 <span class="hljs-attribute" style="Box-sizing: border-Box;">-s</span> <span class="hljs-number" style="color: rgb(0,102); Box-sizing: border-Box;">.11</span> <span class="hljs-attribute" style="Box-sizing: border-Box;">-j</span> DROP
iptables <span class="hljs-attribute" style="Box-sizing: border-Box;">-I</span> INPUT <span class="hljs-attribute" style="Box-sizing: border-Box;">-i</span> eth0 <span class="hljs-attribute" style="Box-sizing: border-Box;">-s</span> <span class="hljs-number" style="color: rgb(0,102); Box-sizing: border-Box;">.0</span>/<span class="hljs-number" style="color: rgb(0,102); Box-sizing: border-Box;">24</span> <span class="hljs-attribute" style="Box-sizing: border-Box;">-j</span> ACCEPT</code><ul class="pre-numbering" style="Box-sizing: border-Box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221,238);"><li style="Box-sizing: border-Box; padding: 0px 5px;">1</li><li style="Box-sizing: border-Box; padding: 0px 5px;">2</li><li style="Box-sizing: border-Box; padding: 0px 5px;">3</li></ul>
此时我们执行iptables-save
Box-sizing: border-Box; position: relative; overflow-y: hidden; overflow-x: auto; margin-top: 0px; margin-bottom: 1.1em; font-family: 'Source Code Pro',monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">*filter
:INPUT ACCEPT [12:976]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [9:2186]
-<span class="ruby" style="Box-sizing: border-Box;"><span class="hljs-constant" style="Box-sizing: border-Box;">A</span> <span class="hljs-constant" style="Box-sizing: border-Box;">INPUT</span> -s <span class="hljs-number" style="color: rgb(0,102); Box-sizing: border-Box;">192.168</span>.<span class="hljs-number" style="color: rgb(0,102); Box-sizing: border-Box;">100.0</span>/<span class="hljs-number" style="color: rgb(0,102); Box-sizing: border-Box;">24</span> -i eth<span class="hljs-number" style="color: rgb(0,102); Box-sizing: border-Box;">0</span> -j <span class="hljs-constant" style="Box-sizing: border-Box;">ACCEPT</span>
</span>-<span class="ruby" style="Box-sizing: border-Box;"><span class="hljs-constant" style="Box-sizing: border-Box;">A</span> <span class="hljs-constant" style="Box-sizing: border-Box;">INPUT</span> -s <span class="hljs-number" style="color: rgb(0,102); Box-sizing: border-Box;">100.10</span>/<span class="hljs-number" style="color: rgb(0,102); Box-sizing: border-Box;">32</span> -i eth<span class="hljs-number" style="color: rgb(0,102); Box-sizing: border-Box;">100.11</span>/<span class="hljs-number" style="color: rgb(0,102); Box-sizing: border-Box;">0</span> -j <span class="hljs-constant" style="Box-sizing: border-Box;">DROP</span>
</span>COMMIT</code><ul class="pre-numbering" style="Box-sizing: border-Box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221,238);"><li style="Box-sizing: border-Box; padding: 0px 5px;">1</li><li style="Box-sizing: border-Box; padding: 0px 5px;">2</li><li style="Box-sizing: border-Box; padding: 0px 5px;">3</li><li style="Box-sizing: border-Box; padding: 0px 5px;">4</li><li style="Box-sizing: border-Box; padding: 0px 5px;">5</li><li style="Box-sizing: border-Box; padding: 0px 5px;">6</li><li style="Box-sizing: border-Box; padding: 0px 5px;">7</li><li style="Box-sizing: border-Box; padding: 0px 5px;">8</li></ul>
此时我们会有一个疑问,既然我们已经放行了192.168.100.0/24。所以丢弃192.168.100.11的规定根本不会被用到了。那么我们应该怎么办在不改变顺序的情况下让这两个规则都生效。指定-j 为LOG。
输出结果最左边为LOG,只要数据包来自192.168.2.200这个IP时,那么该数据包的相关信息就会被写入内核日志文件,即/var/log/messages这个文件当中。然后于下一个规则相比较。
8.TCP,UDP协议的规则对比:针对端口设置
- 在 -s 参数后面可以增加一个参数 -sport 端口范围(限制来源端口),如:1024:65535
- 在-d 参数后面可以增加一个参数 -dport 端口范围(限制目标端口)
需要特别注意,这两个参数重点在port上面,并且仅有TCP和UDP数据包具有端口,因此要想使用–dport,–sport时需要加上-p tcp或者 -p udp才会成功。
下面做几个小测试:
Box-sizing: border-Box; position: relative; overflow-y: hidden; overflow-x: auto; margin-top: 0px; margin-bottom: 1.1em; font-family: 'Source Code Pro',0); Box-sizing: border-Box;">//丢弃所有想要链接本机21端口的数据包</span>
iptables <span class="hljs-attribute" style="Box-sizing: border-Box;">-A</span> INPUT <span class="hljs-attribute" style="Box-sizing: border-Box;">-i</span> eth0 <span class="hljs-attribute" style="Box-sizing: border-Box;">-p</span> tcp <span class="hljs-subst" style="color: rgb(0,0); Box-sizing: border-Box;">--</span>dport <span class="hljs-number" style="color: rgb(0,102); Box-sizing: border-Box;">21</span> <span class="hljs-attribute" style="Box-sizing: border-Box;">-j</span> DROP
<span class="hljs-comment" style="color: rgb(136,0); Box-sizing: border-Box;">//想要链接到本机的网上邻居(UDP port 137,138 tcp 139,445)就放行</span>
iptables <span class="hljs-attribute" style="Box-sizing: border-Box;">-A</span> INPUT <span class="hljs-attribute" style="Box-sizing: border-Box;">-i</span> eth0 <span class="hljs-attribute" style="Box-sizing: border-Box;">-p</span> udp <span class="hljs-subst" style="color: rgb(0,102); Box-sizing: border-Box;">137</span>:<span class="hljs-number" style="color: rgb(0,102); Box-sizing: border-Box;">138</span> <span class="hljs-attribute" style="Box-sizing: border-Box;">-j</span> ACCEPT
iptables <span class="hljs-attribute" style="Box-sizing: border-Box;">-A</span> INPUT <span class="hljs-attribute" style="Box-sizing: border-Box;">-i</span> eth0 <span class="hljs-attribute" style="Box-sizing: border-Box;">-p</span> tcp <span class="hljs-subst" style="color: rgb(0,102); Box-sizing: border-Box;">139</span> <span class="hljs-attribute" style="Box-sizing: border-Box;">-j</span> ACCEPT
iptables <span class="hljs-attribute" style="Box-sizing: border-Box;">-A</span> INPUT <span class="hljs-attribute" style="Box-sizing: border-Box;">-i</span> eth0 <span class="hljs-attribute" style="Box-sizing: border-Box;">-p</span> tcp <span class="hljs-subst" style="color: rgb(0,102); Box-sizing: border-Box;">445</span> <span class="hljs-attribute" style="Box-sizing: border-Box;">-j</span> ACCEPT
<span class="hljs-comment" style="color: rgb(136,0); Box-sizing: border-Box;">//只要来自192.168.1.0/24的1024:65535端口的数据包,且想要连接的本机的ssh port就阻挡</span>
iptables <span class="hljs-attribute" style="Box-sizing: border-Box;">-A</span> INPUT <span class="hljs-attribute" style="Box-sizing: border-Box;">-i</span> eth0 <span class="hljs-attribute" style="Box-sizing: border-Box;">-p</span> tcp <span class="hljs-attribute" style="Box-sizing: border-Box;">-s</span> <span class="hljs-number" style="color: rgb(0,102); Box-sizing: border-Box;">.1</span><span class="hljs-number" style="color: rgb(0,102); Box-sizing: border-Box;">24</span> <span class="hljs-subst" style="color: rgb(0,0); Box-sizing: border-Box;">--</span>sport <span class="hljs-number" style="color: rgb(0,102); Box-sizing: border-Box;">1024</span>:<span class="hljs-number" style="color: rgb(0,102); Box-sizing: border-Box;">65535</span> <span class="hljs-subst" style="color: rgb(0,0); Box-sizing: border-Box;">--</span>dport ssh <span class="hljs-attribute" style="Box-sizing: border-Box;">-j</span> DROP
iptables <span class="hljs-attribute" style="Box-sizing: border-Box;">-A</span> INPUT <span class="hljs-attribute" style="Box-sizing: border-Box;">-i</span> eth0 <span class="hljs-attribute" style="Box-sizing: border-Box;">-p</span> tcp <span class="hljs-subst" style="color: rgb(0,102); Box-sizing: border-Box;">21</span> <span class="hljs-attribute" style="Box-sizing: border-Box;">-j</span> DROP</code><ul class="pre-numbering" style="Box-sizing: border-Box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221,238);"><li style="Box-sizing: border-Box; padding: 0px 5px;">1</li><li style="Box-sizing: border-Box; padding: 0px 5px;">2</li><li style="Box-sizing: border-Box; padding: 0px 5px;">3</li><li style="Box-sizing: border-Box; padding: 0px 5px;">4</li><li style="Box-sizing: border-Box; padding: 0px 5px;">5</li><li style="Box-sizing: border-Box; padding: 0px 5px;">6</li><li style="Box-sizing: border-Box; padding: 0px 5px;">7</li><li style="Box-sizing: border-Box; padding: 0px 5px;">8</li><li style="Box-sizing: border-Box; padding: 0px 5px;">9</li><li style="Box-sizing: border-Box; padding: 0px 5px;">10</li></ul>
除了制订端口号之外,TCP数据包还有特殊的标识,比如主动链接的SYN标志。iptables支持使用–syn来处理。
Box-sizing: border-Box; position: relative; overflow-y: hidden; overflow-x: auto; margin-top: 0px; margin-bottom: 1.1em; font-family: 'Source Code Pro',monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">iptables <span class="hljs-attribute" style="Box-sizing: border-Box;">-A</span> INPUT <span class="hljs-attribute" style="Box-sizing: border-Box;">-i</span> eth0 <span class="hljs-attribute" style="Box-sizing: border-Box;">-p</span> tcp <span class="hljs-subst" style="color: rgb(0,102); Box-sizing: border-Box;">1</span>:<span class="hljs-number" style="color: rgb(0,102); Box-sizing: border-Box;">1023</span> <span class="hljs-attribute" style="Box-sizing: border-Box;">-dport</span> <span class="hljs-number" style="color: rgb(0,102); Box-sizing: border-Box;">1023</span> <span class="hljs-subst" style="color: rgb(0,0); Box-sizing: border-Box;">--</span>syn <span class="hljs-attribute" style="Box-sizing: border-Box;">-j</span> DROP</code><ul class="pre-numbering" style="Box-sizing: border-Box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221,238);"><li style="Box-sizing: border-Box; padding: 0px 5px;">1</li></ul>
9.iptables的开启与关闭
查看运行状态:
<code class="hljs vala has-numbering" style="display: block; padding: 0px; color: inherit; Box-sizing: border-Box; font-family: 'Source Code Pro',monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-preprocessor" style="color: rgb(68,68,68); Box-sizing: border-Box;">#/etc/init.d/iptables status</span></code><ul class="pre-numbering" style="Box-sizing: border-Box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221,238);"><li style="Box-sizing: border-Box; padding: 0px 5px;">1</li></ul>
关闭防火墙服务:
<code class="hljs cs has-numbering" style="display: block; padding: 0px; color: inherit; Box-sizing: border-Box; font-family: 'Source Code Pro',monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">/etc/init.d/iptables stop
<span class="hljs-comment" style="color: rgb(136,0); Box-sizing: border-Box;">//此方法在主机下次重新启动还是会开启</span></code><ul class="pre-numbering" style="Box-sizing: border-Box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221,85); font-family:'microsoft yahei'; font-size:14px; line-height:35px"> 直接禁用防火墙:
<code class="hljs cmake has-numbering" style="display: block; padding: 0px; color: inherit; Box-sizing: border-Box; font-family: 'Source Code Pro',monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">chkconfig --level <span class="hljs-number" style="color: rgb(0,102); Box-sizing: border-Box;">35</span> iptables <span class="hljs-keyword" style="color: rgb(0,136); Box-sizing: border-Box;">off</span>
chkconfig --list iptables
iptables <span class="hljs-number" style="color: rgb(0,102); Box-sizing: border-Box;">0</span>:<span class="hljs-keyword" style="color: rgb(0,136); Box-sizing: border-Box;">off</span> <span class="hljs-number" style="color: rgb(0,102); Box-sizing: border-Box;">1</span>:<span class="hljs-keyword" style="color: rgb(0,102); Box-sizing: border-Box;">2</span>:<span class="hljs-keyword" style="color: rgb(0,102); Box-sizing: border-Box;">3</span>:<span class="hljs-keyword" style="color: rgb(0,102); Box-sizing: border-Box;">4</span>:<span class="hljs-keyword" style="color: rgb(0,102); Box-sizing: border-Box;">5</span>:<span class="hljs-keyword" style="color: rgb(0,102); Box-sizing: border-Box;">6</span>:<span class="hljs-keyword" style="color: rgb(0,136); Box-sizing: border-Box;">off</span>
//对应启动的<span class="hljs-number" style="color: rgb(0,102); Box-sizing: border-Box;">7</span>种状态 </code>