火墙(二)【iptables】

来源:互联网 发布:windows服务管理工具 编辑:程序博客网 时间:2024/06/10 00:17

1、iptables的基础概念

  • 规则(rules)其实就是网络管理员预定义的条件,规则一般的定义为“如果数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。配置防火墙的主要工作就是添加、修改和删除这些规则。
  • 链(chains)是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一条或数条规则。当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定义的默认策略来处理数据包。

内置链有:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING。

  • 表(tables)提供特定的功能,iptables内置了4个表,即filter表、nat表、mangle表和raw表,分别用于实现包过滤,网络地址转换、包重构(修改)和数据跟踪处理。

每个表的对应链如下:

filter:INPUT、FORWARD、OUTPUT

nat:PREROUTING,INPUT、OUTPUT、POSTROUTING

mangle:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING

raw:PREOUTING、

2、iptables传输数据包的过程

a、当一个数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去。

b、如果数据包就是进入本机的,它就会沿着图向下移动,到达INPUT链。数据包到了INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包会经过OUTPUT链,然后到达POSTROUTING链输出。

c、如果数据包是要转发出去的,且内核允许转发,数据包就会如图所示向右移动,经过FORWARD链,然后到达POSTROUTING链输出。

简单的报文流向:

流入本机:PREROUTING–>INPUT

由本机流出:OUTPUT–>POSTROUTING

转发:PREROUTING–>FORWARD–>POSTROUTING

3.命令

查看

iptables -nL-t filter/nat/.....

默认是filter表,ACCEPT模式

清除

iptables -F

但是重启火墙的时候,策略又会出现,是因为策略在/etc/sysconfig/iptables文件下保存着,要想彻底清除,执行下面这条命令:
service iptables save

修改默认值(ACCEPT):

iptables -P INPUT REJECT

但并不建议这样做。
可以这样:

iptables -P INPUT DROPiptables -P OUTPUT DROPiptables -P FORWARD ACCEPT

火墙的规则都是从上向下看的,匹配了前面的一条规则后就不再往后看了。

规则:
-A 添加(默认在最后一条添加)

##允许loopback!(不然会导致DNS无法正常关闭等问题)iptables -A INPUT -i lo -p all -j ACCEPT (如果是INPUT DROP)iptables -A OUTPUT -o lo -p all -j ACCEPT(如果是OUTPUT DROP)下面写OUTPUT链,OUTPUT链默认规则是ACCEPT,所以我们就写需要DROP(放弃)的链.

减少不安全的端口连接:

 iptables -A OUTPUT -p tcp --sport 31337 -j DROP iptables -A OUTPUT -p tcp --dport 31337 -j DROP

有些些特洛伊木马会扫描端口31337到31340(即黑客语言中的 elite
端口)上的服务。既然合法服务都不使用这些非标准端口来通信,阻塞这些端口能够有效地减少你的网络上可能被感染的机器和它们的远程主服务器进行独立通信的机会
还有其他端口也一样,像:31335、27444、27665、20034NetBus、9704、137-139(smb),2049(NFS)端口也应被禁止,我在这写的也不全,有兴趣的朋友应该去查一下相关资料.

FORWARD链

默认规则是DROP,所以我们就写需要ACCETP(通过)的链,对正在转发链的监控.开启转发功能,(在做NAT时,FORWARD默认规则是DROP时,必须做)
 iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPTiptables -A FORWARD -i eth1 -o eh0 -j ACCEPT//丢弃坏的TCP包 iptables -A FORWARD -p TCP ! --syn -m state --state NEW -j DROP//处理IP碎片数量,防止攻击,允许每秒100个iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT//设置ICMP包过滤,允许每秒1个包,限制触发条件是10个包.iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT//我在前面只所以允许ICMP包通过,就是因为我在这里有限制.

-I 插入

iptables -I  INPUT 2 -s 172.25.254.38 -p tcp --dport 22 -j ACCEPTiptables -I INPUT 3 -p tcp --dport 80 -j ACCEPT上面两行允许的是sshd和httpd服务

-D删除

iptables -D INPUT 3iptables -D INPUT -p tcp --dport 80 -j ACCEPT

-R修改

iptables -R INPUT 3 -s 172.25.254.133 -p tcp --dport 80 -j REJECT

链表
iptables -N WESTOS 添加
iptables -E WESTOS RHEL 修改
iptables -X RHEL 删除

state模块的连接状态

首先,假设173.16.0.200机器上启动SSH服务,并且正常服务在TCP 22号端口的位置,接着在11.0.0.200上启动SSH客户端,假设客户端使用的是TCP 12345号端口,然后,11.0.0.200使用TCP 12345向173.16.0.200的TCP 22号端口发出服务请求,这个请求包一定可以成功送到173.16.0.200这台机上,因为11.0.0.200的OUTPUT没有限制,只是此时当173.16.0.200收到这个请求包时就会以TCP 22回应11.0.0.200在TCP 12345上的请求,那么,11.0.0.200的INPUT策略允许这个包通过TCP 12345进来吗?如果INPUT没有开放这个端口那么这个请求就无法在11.0.0.200上响应。ping的情况也是如此。如下图所示。
这里写图片描述
  也许有人会认为直接在INPUT中把TCP 12345开启不就可以了!但实际情况是:客户端的应用程序所使用的端口多为动态端口,所以不可能事先预知客户端的应用程序会使用哪一个端口,也就不可能预先把客户端的端口开好等客户端使用。

  在以前的Ipchains防火墙时代,要解决这种问题的做法是将1024以上的端口都打开,只要确定客户端应用程序使用的端口大于1024就行。这种解决办法当然也适用现在的netfilter/iptables防火墙,但这样做就无法确保安全。在netfilter/iptables时代,可以通过启用state(状态)模决来解决这样的问题,它主要由xt_state.ko模块提供。

  需要注意的是在标准和tcp/ip规范中,连接状态分为12种,详情可以参考RFC文档(http://www.ietf.org/rfc/rfc793.txt)。而iptables中的连接状态只有4种,分别是ESTABLISHED、NEW、RELATED、INVALID。不能将TCP/IP规范中的连接状态和这个混在一起,因为这个两个完全不同的定义。例如,在TCP/IP规范描述下,UDP和ICMP封包是没有连接状态的,但在state模块的描述下,任何包都是有连接状态的。

  • INVALID意味着这个包没有已知的流或连接与之关联,也可能是它包含的数据或包头有问题。
  • ESTABLISHED意思是包是完全有效的,而且属于一个已建立的连接,这个连接的两端都已经有数据发送。NEW表示包将要或已经开始建立一个新的连接,或者是这个包和一个还没有在两端都有数据发送的连接有关。
  • RELATED说明包正在建立一个新的连接,这个连接是和一个已建立的连接相关的。比如,FTP data transfer,ICMP
    error 和一个TCP或UDP连接相关。
  • 注意NEW状态并不在试图建立新连接的TCP包里寻找SYN标记,因此它不应该不加修改地用在只有一个防火墙或在不同的防火墙之间没有启用负载平衡的地方。

     
    iptables -A INPUT -m state –state RELATED,ESTABLISHED -j ACCEPT
    iptables -A INPUT -m state –state NEW -i lo -j ACCEPT
    iptables -A INPUT -m state –state NEW -p tcp –dport 22 -j ACCEPT
    iptables -A INPUT -m state –state NEW -p tcp –dport 80 -j ACCEPT

NAT表

添加规则

添加规则,我们只添加DROP链.因为默认链全是ACCEPT.
防止外网用内网IP欺骗

iptables -t nat -A PREROUTING -i eth0 -s 10.0.0.0/8 -j DROPiptables -t nat -A PREROUTING -i eth0 -s 172.16.0.0/12 -j DROPiptables -t nat -A PREROUTING -i eth0 -s 192.168.0.0/16 -j DROP

如果我们想,比如阻止MSN,QQ,BT等的话,需要找到它们所用的端口或者IP,(个人认为没有太大必要)
例:
禁止与211.101.46.253的所有连接

iptables -t nat -A PREROUTING  -d 211.101.46.253 -j DROP

禁用FTP(21)端口

iptables -t nat -A PREROUTING -p tcp --dport 21 -j DROP

这样写范围太大了,我们可以更精确的定义.

iptables -t nat -A PREROUTING  -p tcp --dport 21 -d 211.101.46.253 -j DROP

这样只禁用211.101.46.253地址的FTP连接,其他连接还可以.如web(80端口)连接.
按照我写的,你只要找到QQ,MSN等其他软件的IP地址,和端口,以及基于什么协议,只要照着写就行了.

最后:
drop非法连接

iptables -A INPUT   -m state --state INVALID -j DROPiptables -A OUTPUT  -m state --state INVALID -j DROPiptables -A FORWARD -m state --state INVALID -j DROP

允许所有已经建立的和相关的连接

iptables-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPTiptables-A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

service iptables save

这样就可以写到/etc/sysconfig/iptables文件里了.写入后记得把防火墙重起一下,才能起作用.

service iptables restart

内核路由

client:172.25.38.200
server: eth0 172.25.254.138
   eth1 172.25.38.100
SNAT:
server
iptables -t nat -A POSTROUTING -o eth0 -j SNAT –to-source 172.25.254.138
查看允许通过的模式:
[root@server network-scripts]# sysctl -a | grep forward
[root@server network-scripts]# vim /etc/sysctl.conf

net.ipv4.ip_forward = 1##开启net转换

client
ping 172.25.254.138 可以通的

ssh root@172.25.254.38 和 172.25.254.138是同一网段的都可
连上去之后,在38处看到的是172.25.254.138这个主机连的38

DNAT
server:
iptables -t nat -A PREROUTING -i eth0 -j DNAT –to-dest 172.25.0.200

用172.25.254.38 ssh172.25.254.138,连接上后ifconfig看到的是200的IP

原创粉丝点击