一、iptables介绍:
iptables是复杂的,它集成到linux内核中。用户通过iptables,可以对进出你的计算机的数据包进行过滤。通过iptables命令设置你的规则,来把守你的计算机网络──哪些数据允许通过,哪些不能通过,哪些通过的数据进行记录(log)。接下来,我将告诉你如何设置自己的规则,从现在就开始吧。
===================================================================
二、iptables命令:
维护规则表的命令:
1. (-N)创建一个新规则表
2. (-X)删除一个空规则表
3. (-P)改变内建规则表的默认策略
4. (-L)列出规则表中的规则
5. (-F)清空规则表中的规则
6. (-Z)将规则表计数器清零
管理规则表中的规则:
1. (-A)添加新规则到规则表
2. (-I)插入新规则到规则表的某个位置
3. (-R)替换规则表中的规则
4. (-D)删除规则表中的某条规则
在调试iptables规则时,你也许需要反复修改你的脚本来实现某些特定的功能,这时建议在你的脚本里添加这样几行,以防止重复设置规则:
# 清除所有规则
iptables -F -t filter
iptables -X -t filter
iptables -Z -t filter
iptables -F -t nat
iptables -X -t nat
iptables -Z -t nat
# 设置内建规则表的默认策略
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
“-t”选项是“–table”的简写,它指明了你要对哪类规则表进行操作,默认的是指filter。
下面举例说明iptables的部分选项的使用:
指定规则操作的源地址 -s 或 –source 或 -src
指定规则操作的目标地址 -d 或 –destination 或 -dst
允许来自192.168.100.0/24的数据包通过
iptables -A INPUT -s 192.168.100.0/24 -d 0.0.0.0/0 -j ACCEPT
“-j”选项是“–jump”的简写,它指明了匹配该条规则的数据包的具体处理方法,可能是ACCEPT、DROP等。
取反:在参数前加“!”号
接受除了来自192.168.100.0/24外的所有的数据包
iptables -A INPUT -s ! 192.168.100.0/24 -d 0.0.0.0/0 -j ACCEPT
指定协议(TCP、UDP或ICMP)
-p 或 –protocol
禁止icmp协议
iptables -A INPUT -p icmp -j DROP
指定数据包进入的接口 -i 或 –in-interface
指定数据包送出的接口 -o 或 –out-interface
INPUT规则表中只允许指定-i接口,OUTPUT规则表中只允许指定-o接口,FORWARD表可以指定这两种接口。
允许从eth1进入的数据包
iptables -A INPUT -i eth1 -j ACCEPT
允许从eth0接口送出的数据包
iptables -A OUTPUT -o eth0 -j ACCEPT
转发从eth1进入,eth0送出的数据包
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
TCP/UDP扩展
指定源端口 –sport 或 –source-port
指定目的端口 –dport 或 –destination-port
允许从eth0进入访问到目标端口为21的tcp数据包
iptables -A INPUT -i eth0 -p tcp –dport 21 -j ACCEPT
允许从eth0进入访问到目标端口为21的udp数据包
iptables -A INPUT -i eth0 -p udp –dport 21 -j ACCEPT
状态匹配
–state state,state…
正如前面我们脚本中用到的,state是用逗号分隔的列表,表示要匹配的连接状态。有效的状态选项包括:INVAILD,表示数据包对应的连接是未知的;ESTABLISHED,表示数据包对应的连接已经进行了双向的数据包传输,也就是说连接已经建立;NEW,表示这个数据包请求发起一个连接;RELATED,表示数据包要发起一个新的连接,但是这个连接和一个现有的连接有关,例如:FTP的数据传输连接和控制连接之间就是RELATED关系。
禁止从eth0进来的NEW状态,也就是禁止来自eth0的新的访问请求
iptables -A INPUT -i eth0 -m state –state NEW -j DROP
“-m”是“–match”的简写。-m选项引出了iptables的state扩展模块,比如mac扩展模块,它实现根据主机网卡的MAC地址进行权限控制的规则:
iptables -A INPUT -p tcp -m mac –mac-source 01:02:03:04:05:06 -j ACCEPT
===================================================================
三、iptables设置:
1、查看本机iptables设置:
[root@tp ~]# iptables -L -n
看到 INPUT ACCEPT, FORWARD ACCEPT , OUTPUT ACCEPT我们可以这样理解 , iptables 由3个部分组成
INPUT, FORWARD 和 OUTPUT,我们先看 INPUT 和 OUTPUT(policy ACCEPT) 表示是完全接受 所有的数据,也就是说现在的iptables 防火墙 没有起到任何作用。
2、清除原有规则:
[root@tp ~]# iptables -F //清除预设表filter中的所有规则链的规则
[root@tp ~]# iptables -X //清除用户自定义的filter中的所有规则链的规则
3、设定预设置规则:
[root@tp ~]# iptables -p INPUT DROP
[root@tp ~]# iptables -p OUTPUT ACCEPT 或 DROP //ACCEPT允许 DROP丢弃
[root@tp ~]# iptables -p FORWARD DROP
查看服务器默认端口情况:
[root@tp ~]# netstat -ntlp
4、添加规则:
为了能采用远程SSH登陆,我们要开启22端口
[root@tp ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
[root@tp ~]# iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
(注:这个规则,如果你把OUTPUT 设置成DROP的就要写上这一部,好多人都是望了写这一部规则导致,始终无法SSH.在远程一下)
针对这2条命令进行一些讲解吧
-A 参数就看成是添加一条 INPUT 的规则
-p 指定是什么协议 我们常用的tcp 协议,当然也有udp 例如53端口的DNS到时我们要配置DNS用到53端口 大家就会发现使用udp协议的而 --dport 就是目标端口 当数据从外部进入服务器为目标端口
反之 数据从服务器出去 则为数据源端口 使用 --sport
-j 就是指定是 ACCEPT 接收 或者 DROP 不接收
其他的端口也一样,如:
----------------------------------------------------------
如果做了WEB服务器,开启80端口:
[root@tp ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
[root@tp ~]# iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT
-----------------------------------------------------------
如果做了邮件服务器,开启25,110端口
[root@tp ~]# iptables -A INPUT -p tcp --dport 110 -j ACCEPT
[root@tp ~]# iptables -A INPUT -p tcp --dport 25 -j ACCEPT
-----------------------------------------------------------
如果做了FTP服务器,开启21端口
[root@tp ~]# iptables -A INPUT -p tcp --dport 21 -j ACCEPT
[root@tp ~]# iptables -A INPUT -p tcp --dport 20 -j ACCEPT
----------------------------------------------------------
如果做了DNS服务器,开启53端口
[root@tp ~]# iptables -A INPUT -p tcp --dport 53 -j ACCEPT
如果你还做了其他的服务器,需要开启哪个端口,照写就行了
----------------------------------------------------------
允许icmp包通过,也就是允许ping
[root@tp ~]# iptables -A OUTPUT -p icmp -j ACCEPT
[root@tp ~]# iptables -A INPUT -p icmp -j ACCEPT
----------------------------------------------------------
允许loopback!(不然会导致DNS无法正常关闭等问题)
IPTABLES -A INPUT -i lo -p all -j ACCEPT (如果是INPUT DROP)
IPTABLES -A OUTPUT -o lo -p all -j ACCEPT(如果是OUTPUT DROP)
-----------------------------------------------------------
减少不安全的端口连接:
[root@tp ~]# iptables -A OUTPUT -p tcp --sport 31337 -j DROP
[root@tp ~]# iptables -A OUTPUT -p tcp --dport 31337 -j DROP
有些些特洛伊木马会扫描端口31337到31340(即黑客语言中的 elite 端口)上的服务。既然合法服务都不使用这些非标准端口来通信,阻塞这些端口能够有效地减少你的网络上可能被感染的机器和它们的远程主服务器进行独立通信的机会。
还有其他端口也一样,像:31335、27444、27665、20034 NetBus、9704、137-139(smb),2049(NFS)端口也应被禁止。
=======================================================================================================
四、下面是优化:
如:我们只允许192.168.0.3的机器进行SSH连接
[root@tp ~]# iptables -A INPUT -s 192.168.0.3 -p tcp --dport 22 -j ACCEPT
如果要允许,或限制一段IP地址可用 192.168.0.0/24 表示192.168.0.1-255端的所有IP.
24表示子网掩码数.但要记得把 /etc/sysconfig/iptables 里的这一行删了.
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT 因为它表示所有地址都可以登陆.或采用命令方式:
[root@tp ~]# iptables -D INPUT -p tcp --dport 22 -j ACCEPT
还有一种即使使用
[root@tp ~]#iptables -L-n --line或iptables -L -n --line-number排序规则
然后删除规则:
[root@tp ~]# iptables -D INPUT 1 //其中1为input里的规则号。
在下面就是FORWARD链,FORWARD链的默认规则是DROP,所以我们就写需要ACCETP(通过)的链,对正在转发链的监控.
开启转发功能,(在做NAT时,FORWARD默认规则是DROP时,必须做)
[root@tp ~]# iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
[root@tp ~]# iptables -A FORWARD -i eth1 -o eh0 -j ACCEPT
丢弃坏的TCP包
[root@tp ~]#iptables -A FORWARD -p TCP ! --syn -m state --state NEW -j DROP
处理IP碎片数量,防止攻击,允许每秒100个
[root@tp ~]#iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT
设置ICMP包过滤,允许每秒1个包,限制触发条件是10个包.
[root@tp ~]#iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT
我在前面只所以允许ICMP包通过,就是因为我在这里有限制。
iptables 提供了一个参数 是检查状态的,下面我们来配置下 22 和 80 端口,防止无效的数据包。
[root@tp ~]# iptables -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
可以看到和我们以前使用的:
[root@tp ~]# iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
多了一个状态判断。
同样80端口也一样, 现在删掉原来的2条规则,
[root@tp ~]# iptables -L -n --line-number 这个是查看规则而且带上编号。我们看到编号就可以
删除对应的规则了。
[root@tp ~]# iptables -D OUTPUT 1 这里的1表示第一条规则。
当你删除了前面的规则, 编号也会随之改变。看到了吧。好,我们删除了前面2个规则,22端口还可以正常使用,说明没问题了
iptables是复杂的,它集成到linux内核中。用户通过iptables,可以对进出你的计算机的数据包进行过滤。通过iptables命令设置你的规则,来把守你的计算机网络──哪些数据允许通过,哪些不能通过,哪些通过的数据进行记录(log)。接下来,我将告诉你如何设置自己的规则,从现在就开始吧。
===================================================================
二、iptables命令:
维护规则表的命令:
1. (-N)创建一个新规则表
2. (-X)删除一个空规则表
3. (-P)改变内建规则表的默认策略
4. (-L)列出规则表中的规则
5. (-F)清空规则表中的规则
6. (-Z)将规则表计数器清零
管理规则表中的规则:
1. (-A)添加新规则到规则表
2. (-I)插入新规则到规则表的某个位置
3. (-R)替换规则表中的规则
4. (-D)删除规则表中的某条规则
在调试iptables规则时,你也许需要反复修改你的脚本来实现某些特定的功能,这时建议在你的脚本里添加这样几行,以防止重复设置规则:
# 清除所有规则
iptables -F -t filter
iptables -X -t filter
iptables -Z -t filter
iptables -F -t nat
iptables -X -t nat
iptables -Z -t nat
# 设置内建规则表的默认策略
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
“-t”选项是“–table”的简写,它指明了你要对哪类规则表进行操作,默认的是指filter。
下面举例说明iptables的部分选项的使用:
指定规则操作的源地址 -s 或 –source 或 -src
指定规则操作的目标地址 -d 或 –destination 或 -dst
允许来自192.168.100.0/24的数据包通过
iptables -A INPUT -s 192.168.100.0/24 -d 0.0.0.0/0 -j ACCEPT
“-j”选项是“–jump”的简写,它指明了匹配该条规则的数据包的具体处理方法,可能是ACCEPT、DROP等。
取反:在参数前加“!”号
接受除了来自192.168.100.0/24外的所有的数据包
iptables -A INPUT -s ! 192.168.100.0/24 -d 0.0.0.0/0 -j ACCEPT
指定协议(TCP、UDP或ICMP)
-p 或 –protocol
禁止icmp协议
iptables -A INPUT -p icmp -j DROP
指定数据包进入的接口 -i 或 –in-interface
指定数据包送出的接口 -o 或 –out-interface
INPUT规则表中只允许指定-i接口,OUTPUT规则表中只允许指定-o接口,FORWARD表可以指定这两种接口。
允许从eth1进入的数据包
iptables -A INPUT -i eth1 -j ACCEPT
允许从eth0接口送出的数据包
iptables -A OUTPUT -o eth0 -j ACCEPT
转发从eth1进入,eth0送出的数据包
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
TCP/UDP扩展
指定源端口 –sport 或 –source-port
指定目的端口 –dport 或 –destination-port
允许从eth0进入访问到目标端口为21的tcp数据包
iptables -A INPUT -i eth0 -p tcp –dport 21 -j ACCEPT
允许从eth0进入访问到目标端口为21的udp数据包
iptables -A INPUT -i eth0 -p udp –dport 21 -j ACCEPT
状态匹配
–state state,state…
正如前面我们脚本中用到的,state是用逗号分隔的列表,表示要匹配的连接状态。有效的状态选项包括:INVAILD,表示数据包对应的连接是未知的;ESTABLISHED,表示数据包对应的连接已经进行了双向的数据包传输,也就是说连接已经建立;NEW,表示这个数据包请求发起一个连接;RELATED,表示数据包要发起一个新的连接,但是这个连接和一个现有的连接有关,例如:FTP的数据传输连接和控制连接之间就是RELATED关系。
禁止从eth0进来的NEW状态,也就是禁止来自eth0的新的访问请求
iptables -A INPUT -i eth0 -m state –state NEW -j DROP
“-m”是“–match”的简写。-m选项引出了iptables的state扩展模块,比如mac扩展模块,它实现根据主机网卡的MAC地址进行权限控制的规则:
iptables -A INPUT -p tcp -m mac –mac-source 01:02:03:04:05:06 -j ACCEPT
===================================================================
三、iptables设置:
1、查看本机iptables设置:
[root@tp ~]# iptables -L -n
看到 INPUT ACCEPT, FORWARD ACCEPT , OUTPUT ACCEPT我们可以这样理解 , iptables 由3个部分组成
INPUT, FORWARD 和 OUTPUT,我们先看 INPUT 和 OUTPUT(policy ACCEPT) 表示是完全接受 所有的数据,也就是说现在的iptables 防火墙 没有起到任何作用。
2、清除原有规则:
[root@tp ~]# iptables -F
[root@tp ~]# iptables -X
3、设定预设置规则:
[root@tp ~]# iptables -p INPUT DROP
[root@tp ~]# iptables -p OUTPUT ACCEPT
[root@tp ~]# iptables -p FORWARD DROP
查看服务器默认端口情况:
[root@tp ~]# netstat -ntlp
4、添加规则:
为了能采用远程SSH登陆,我们要开启22端口
[root@tp ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
[root@tp ~]# iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
(注:这个规则,如果你把OUTPUT 设置成DROP的就要写上这一部,好多人都是望了写这一部规则导致,始终无法SSH.在远程一下)
针对这2条命令进行一些讲解吧
-A 参数就看成是添加一条 INPUT 的规则
-p 指定是什么协议 我们常用的tcp 协议,当然也有udp 例如53端口的DNS到时我们要配置DNS用到53端口 大家就会发现使用udp协议的而 --dport 就是目标端口 当数据从外部进入服务器为目标端口
反之 数据从服务器出去 则为数据源端口 使用 --sport
-j 就是指定是 ACCEPT 接收 或者 DROP 不接收
其他的端口也一样,如:
----------------------------------------------------------
[root@tp ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
[root@tp ~]# iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT
-----------------------------------------------------------
[root@tp ~]# iptables -A INPUT -p tcp --dport 110 -j ACCEPT
[root@tp ~]# iptables -A INPUT -p tcp --dport 25 -j ACCEPT
-----------------------------------------------------------
[root@tp ~]# iptables -A INPUT -p tcp --dport 21 -j ACCEPT
[root@tp ~]# iptables -A INPUT -p tcp --dport 20 -j ACCEPT
----------------------------------------------------------
[root@tp ~]# iptables -A INPUT -p tcp --dport 53 -j ACCEPT
如果你还做了其他的服务器,需要开启哪个端口,照写就行了
----------------------------------------------------------
[root@tp ~]# iptables -A OUTPUT -p icmp -j ACCEPT
[root@tp ~]# iptables -A INPUT -p icmp -j ACCEPT
----------------------------------------------------------
IPTABLES -A INPUT -i lo -p all -j ACCEPT (如果是INPUT DROP)
IPTABLES -A OUTPUT -o lo -p all -j ACCEPT(如果是OUTPUT DROP)
-----------------------------------------------------------
[root@tp ~]# iptables -A OUTPUT -p tcp --sport 31337 -j DROP
[root@tp ~]# iptables -A OUTPUT -p tcp --dport 31337 -j DROP
有些些特洛伊木马会扫描端口31337到31340(即黑客语言中的 elite 端口)上的服务。既然合法服务都不使用这些非标准端口来通信,阻塞这些端口能够有效地减少你的网络上可能被感染的机器和它们的远程主服务器进行独立通信的机会。
还有其他端口也一样,像:31335、27444、27665、20034 NetBus、9704、137-139(smb),2049(NFS)端口也应被禁止。
=======================================================================================================
四、下面是优化:
如:我们只允许192.168.0.3的机器进行SSH连接
[root@tp ~]# iptables -A INPUT -s 192.168.0.3 -p tcp --dport 22 -j ACCEPT
如果要允许,或限制一段IP地址可用 192.168.0.0/24 表示192.168.0.1-255端的所有IP.
24表示子网掩码数.但要记得把 /etc/sysconfig/iptables 里的这一行删了.
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT 因为它表示所有地址都可以登陆.或采用命令方式:
[root@tp ~]# iptables -D INPUT -p tcp --dport 22 -j ACCEPT
还有一种即使使用
[root@tp ~]#iptables -L-n --line或iptables -L -n --line-number排序规则
然后删除规则:
[root@tp ~]# iptables -D INPUT 1
在下面就是FORWARD链,FORWARD链的默认规则是DROP,所以我们就写需要ACCETP(通过)的链,对正在转发链的监控.
开启转发功能,(在做NAT时,FORWARD默认规则是DROP时,必须做)
[root@tp ~]# iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
[root@tp ~]# iptables -A FORWARD -i eth1 -o eh0 -j ACCEPT
丢弃坏的TCP包
[root@tp ~]#iptables -A FORWARD -p TCP ! --syn -m state --state NEW -j DROP
处理IP碎片数量,防止攻击,允许每秒100个
[root@tp ~]#iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT
设置ICMP包过滤,允许每秒1个包,限制触发条件是10个包.
[root@tp ~]#iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT
我在前面只所以允许ICMP包通过,就是因为我在这里有限制。
iptables 提供了一个参数 是检查状态的,下面我们来配置下 22 和 80 端口,防止无效的数据包。
[root@tp ~]# iptables -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
可以看到和我们以前使用的:
[root@tp ~]# iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
多了一个状态判断。
同样80端口也一样, 现在删掉原来的2条规则,
[root@tp ~]# iptables -L -n --line-number
删除对应的规则了。
[root@tp ~]# iptables -D OUTPUT 1
当你删除了前面的规则, 编号也会随之改变。看到了吧。好,我们删除了前面2个规则,22端口还可以正常使用,说明没问题了
本文详细介绍了iptables的基本概念、常用命令及配置方法。iptables是Linux系统中重要的网络防火墙工具,通过设置规则来控制网络流量。文中提供了丰富的示例,帮助读者理解和应用iptables。
1375

被折叠的 条评论
为什么被折叠?



