忧郁_小刚 / iptables / Linux包过滤防火墙

分享

   

Linux包过滤防火墙

2011-10-27  忧郁_小刚

Linux包过滤防火墙

1,什么是包过滤防火墙

2,包过滤的工作层

     工作在网络层

3,工作原理

    数据包过滤通过对数据包的IP头和TCP或UDP头的检查来实现的主要有:

    IP源地址

    IP目标地址

    协议(tcp包,udp包,和icmp包)

    tcp或udp的源端口

    imcp消息类型

    tcp包头中的ack位

    数据包到达的端口

    数据包出去的端口

 

 

包过滤技术的优缺点

   

    使用iptables实现包过滤

    相关的TCP/IP支持

   

    假如A要和B通信

    1,(SYN) B要和A通信时,B首先向A发一个SYN标记的包,告诉 A请求建立连接

    2,(SYN/ACK) A收到后回发送一对SYN包的确认包(SYN/ACK)回去,表示对第一个SYN包的确认,并继续握手操作

    3,(ACK) B收到SYN/ACK包后,B发一个确认包ACK,通知 A连接已建立。三次握手完成,一个TCP连接完成

    TCP连接的每个包都会设置ACK位,这就是连接跟踪的重要意义,放火墙将无法判断收到的ACK属于一个已经建立的连接

    结束TCP连接

   

iptables语法

一条iptables规则基本上因该包含5个要素

指定表 table     分别是 filter,nat和mangle

指定操作命令 command  包括添加,删除,更新

指定链 chains        对于包过滤防火墙可操作filter表中的INPUT链,OUTPUT链和             FORWARD链

指定规则匹配器 mather  可以指定各种规则匹配,如IP地址,端口,包类型

指定目标动作 target    当规则匹配一个包时,真正要执行的任务用目标标识。最常目标                 为ACCEPT,DROP,REJECT表示拒绝,丢弃包的同时给发送没有接                受的通知,LOG表示包的有关信息被记录日志,TOS表示改写包的TOS值

 

语法:

iptables [-t table] CMD [chain] [rule-matcher] [-j target]

table为表名,CMD为操作命令,chain为链名,rule-matcher为规则匹配器,target为目标动作

 

iptables的常用操作命令

    -A 或 --append   在所有的链的结尾加入一条或多条规则

    -D 或 --delete   在所有的链删除

    -R 或 --replace  替换一条匹配的规则

    -I 或 --insert   以给出的规则号在所选链中插入一条或多条规则。如果规则号是1,插入的规则的链的头部 

    -L 或 --list    列出指定链的所有规则,如果没有指定链,将列出所有链中的所有规则

 

    -F 或 --flush      清除指定链和表中的所有规则,假如不指定,将全部删除

    -N 或 --new-chain   以给定的名字创建一条新的用户自定义链。不能与已有的链同名

    -X 或 --delete-chain 删除指定的用户定义链

    -P 或 --policy(n政策,方针) 为永久链指定默认规则。用户定义链没有默认规则。缺剩                      规则也是规则链中的最后一条规则用-L命令显示时它在第一                   行显示

    -C 或 --check             检测给定的包是否与指定链的规则相匹配

    -X 或 --zero               将指定链中所有规则的包字节(byte)计数器清零

    -h         显示帮助信息

 

iptables常用的规则匹配器

    -p,[!]protocol      指出要匹配的协议,可以是tcp,udp,icmp,all.协议名前缀"!",                       为逻辑非

    -s[!]address[/mask]    根据源地址或地址范围确定是否允许或拒绝数据包通过过滤器

    --sport[!]port[:port]  指定匹配规则的源端口或端口范围。可以用端口号

    -d[!]address[/mask]    根据目的地址或地址范围确定是否允许或拒绝数据包通过过滤器

    -dport[!]port[:port]   指定匹配规则的目的端口或端口范围,可以用端口号,也可以                                          用/etc/services文件中的名字

    --icmp-type[!]typename 指定匹配规则的ICMP信息类(可以使用iptables -p icmp -h                               查看有效的icmp类型名)

    -i[!]interface name[+] 匹配单独的接口或某种类型的接口设置过滤规则。此参数忽略                                      时,默认符合所有接口。接口可以使用否定符"!"来匹配不是指                                       定接口来包.参数interfacename是接口名,如eth0,eth1,ppp0                                         等。指定一个目前不存在的接口是完全合法的。规则直到接口时                                       才起作用,这种指定对于PPP及该选项只有对INPUT,FROWARD和                                           PREROUTING链是合法的

   

    -o[!]interface name[+] 仅仅匹配设置了SYN位,清除了ACK,FIN位的TCP包.这些包表示请求初始化的TCP连接。阻止从接口来的这样的包将会组织外来的TCP连接请求。但输出的TCP连接请求将不受影响。这个参数仅仅当协议类型设置为TCP时才能用 

 

    -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体系中的特色,它使得iptables成为一个可扩展的安全体系结构。你可以从这里了解更多关于iptables扩展模块的知识:http://www.iptables.org/document ... tensions-HOWTO.html

                   

    [!]-syn         仅仅匹配设置了SYN位,清除

 

    --state state,state...   状态匹配

 

    这里,state是一个用逗号分割的列表,表示要匹配的连接状态。有效的状态选项包括:INVAILD,表示分组对应的连接是未知的;ESTABLISHED,表示分组对应的连接已经进行了双向的分组传输,也就是说连接已经建立;NEW,表示这个分组需要发起一个连接,或者说,分组对应的连接在两个方向上都没有进行过分组传输;RELATED,表示分组要发起一个新的连接,但是这个连接和一个现有的连接有关,例如:FTP的数据传输连接和控制连接之间就是RELATED关系。

 

    对于本地产生分组,在PREROUTING或者OUTPUT链中都可以对连接的状态进行跟踪。在进行状态检测之前,需要重组分组的分片。这就是为什么在iptables中不再使用ipchains的ip_always_defrag开关。UDP和TCP连接的状态表由/proc/net/ip_conntrack进行维护。稍后我们再介绍它的内容。状态表能够保存的最大连接数保存在/proc/sys/net/ipv4/ip_conntrack_max中。它取决于硬件的物理内存。

 

分组是否匹配状态表中的一个已经实现(ESTABLISHED)的连接。

它是否是和状态表中某个UDP/TCP连接相关(RELATED)的一个ICMP分组。

这个分组是否要发起一个新(NEW)的连接。

如果分组和任何连接无关,就被认为是无效(INVALID)的。

 

iptables -A INPUT -i eth0 -m state --state NEW -j DROP  

//禁止从eth0进来的NEW状态,也就是禁止来自eth0的新的访问请求

 

指定永久性规则

    /sbin/iptables-save > /usr/local/iptables_bat    导出

    /sbin/iptables-restore < /usr/local/iptables_bat 导入

service iptables save

 

iptalbe命令使用举例

    1,链的基本操作

    要清除所有的配置

    iptables -F

    iptables -X   清除

    iptables -Z   将指定链中所有规则的包字节计数器清零

    (2)设置链的默认策略.一般地  有两种方法

      

    首先允许所有的包,然后在禁止有危险的包通过防火墙。即没有被决绝的都允许,这种方法对用户而言比较灵活方便, 但对系统而言,容易引起严重的安全问题

      iptables -P INPUT ACCEPT

      iptables -P OUTPUT ACCEPT

      iptables -P FORWARD ACCEPT

   

      首先禁止所有的包

      iptalbes -P INPUT DROP

      iptables -P OUTPUT ACCEPT

      iptables -P FORWARD DROP

   

       列出表/链中的所有规则    包过滤防火墙只使用filter表,它是默认表 因此会显示filter表中所有规则

       iptables -L

       iptables -L -n 参数用于显示数字化的地址和端口

 

       向链中添加规则。下面的语句用于开放网络接口.

       iptables -A INPUT -i lo -j ACCEPT

       iptables -A OUTPUT -o lo -j ACCEPT

       iptables -A INPUT -i eth1 -j ACCEPT

       iptables -A OUTPUT -o eht1 -j ACCEPT

          iptables -A FORWARD -o eth1 -j ACCEPT

   

    本地进程不会经过FORWARD链,因此lo只有INPUT和OUTPUT两个链上作用

   

    用户自定义链

       iptables -N custom(n习俗,风俗v定值)         //新建coustom定义链

       iptables -A coutom -s 0/0 -p icmp -j DROP   //丢弃全部ICMP包

       iptables -A INPUT -s 0/0 -d 0/0 -j custom   //INPUT链中加入一条规则,使所有的包都由custom子定义链处理.结果全部的ICMP包都被丢弃

   

包的处理方式:  DROP,ACCEPT,REIECT(弹回),LOG

    iptables -A INPUT -p icmp -j DORP

    iptables -A INPUT -p tcp -d 219.237.206.200 --dport 22 -j ACCEPT

    iptables -A OUTPUT -p tcp -s 10.0.0.254 --sport 22 -j ACCEPT

    iptables -p INPUT DROP 改变防火墙默认策略

    iptables -p ACCEPT DROP

    iptables -p OUTPUT DROP

    iptables -A INPUT -p tcp -d 10.0.0.254 --dport 80 -j ACCEPT

    iptables -A OUTPUT -p tcp -s 10.0.0.254 --sport 22 -j ACCEPT

    iptables -A OUTPUT -p udp --dport 53 -j ACCEPT   //允许DNS通过

    iptables -A INPUT -p udp --sport 53 -j ACCEPT

    iptables -A INPUT -p udp 10.0.0.254 --dport 53 -j ACCEPT  //DNS字节访问字节也要打开

    iptables -A OUTPUT -p udp --sport 53 -j ACCEPT

    iptables -D INPUT 5  //删除INPUT 5个编号

如果自己是某种客户机和服务器的话,需要在连上加两个条件

    还需要开通本机的服务器

    iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT

    iptables -A OUTPUT -d 127.0.0.1 -s 127.0.0.1 -j ACCEPT

 

可以设置本机的包,不能从本机的22端口自动的出去,因为没有验证过

下面表示跟本机建立过连接的包,才能从22端口出去,防止本机自从动从22端口出去

    iptables -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

现在就可以删除原来的包了

    iptables -D OUTPUT 1

下面是不允许本地产生包主动从80端口发送给别人!

    iptables -A OUTPUT -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT

删除原来的设置

    上面是作为服务器有这个问题,做为客户机也会产生这个问题

    iptables -A INPUT -p tcp --sport 22 -m state --state ESTABALIASHAED -j ACCEPT

 

LOG目标

 

    iptables-save > /etc/sysconfig/iptalbes  保存

 

2,设置基本的规则匹配

指定协议匹配

        iptables -A INPUT -p tcp        // 匹配指定的协议

        iptables -A INPUT -p !tcp         // 匹配指定协议之外的所有协议

指定地址匹配

        iptables -A INPUT -s 192.168.1.11  // 指定匹配的主机

        iptables -A INPUT -s 192.168.10.0/24

        iptables -A FORWARD -s ! 192.168.0.1

    iptables -A FORWARD -s ! 192.168.0.0/24 //指定网络之外的网络    

 

指定网络接口匹配

指定单一的网络接口匹配

       iptables -A INPUT -i eth0

        iptables -A FORWARD -o eth0

        指定同类型的网络接口匹配

        iptables -A FORWARD -o ppp+

        指定单一的端口匹配

        iptables -A INPUT -p tcp --sport www

        iptables -A INPUT -p tcp --sport 80

        iptables -A INPUT -p udp --sport 53

        iptables -A INPUT -p udp --dport 53

        匹配指定端口之外的端口

        iptables -A INPUT -p tcp --dport ! 22

        匹配指定的端口范围

        iptables -A INPUT -p tcp --sport 22:80

           匹配ICMP端口和ICMP类型

        iptables -A INPUT -p icmp --icmp-type 8

 

        指定ip碎片

        在TCP/IP通信过程中,每一个网络接口都有严格最大传输单元(MTU),这个参数定义可以通过的数据包的最大尺寸。如果一个数据包大于这个参数值时,系统会将其划分成更小的数的数个数据包(成为IP岁片)

        ....................

 

    设置扩展的规则匹配

   

       包过滤防火墙配置举例

 

包过滤防火墙配置举例

    touch /etc/rc.d/filter-firewall

    chmod u+x /etc/rc.d/filter-firewall

    echo "/etc/rc.d/filter-firewall" >> /etc/rc.d/rc.local

    vi /etc/rc.d/filter-firewall

   

    #!/bin/sh

    echo "String iptables rules..."

    echo "1" /proc/sys/net/ipv4/ip_forward

    ipt=/sbin/iptables

    www-server=192.168.0.100

    ftp-server=192.168.0.200

    email-server=192.168.0.210

    ip_range="198.168.80.0/24"

 

##########################################################################

 

刷新所有的链的规则

iptables -F

首先禁止转发任何包,然后再一步步设置允许通过的包

所有首先设置防火墙FORWARD链的策略为DROP

iptables -P FORWARD DROP

下面设置关于服务器的包过滤规则

由于服务器/客户机交互是双向的,所有不仅仅要设置数据包

   

       NAT与代理服务器

 

echo "1" > /proc/sys/net/ipv4/ip_forware

 

NAT表也有三个缺省的链

    prerouting: 可以在这里面定义进行目的nat的规则,因为路由器进行路由时检查数据包的目的ip地址,所以为了使数据包得以正确路由,我们必须在路由之前就进行目的nat

    postrouteing 可以在这里定义进行源nat的规则,系统在决定了数据包的路由以后在执行该链中的规则。

    output: 定义对本地产生的数据包的目的的nat规则

 

Netfilter的Nat表

prerouting 和 postrouting表

 

SNAT原地址转换        destination: 11.22.3.1   source 192.168.0.1

DNAT目标地址转换

   

iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j SNAT --to-source 192.168.0.254

把源的10.0.0.0/24翻译成一个192.168.0.254的一个服务器地址

 

内网翻译成外网地址 net nat

 

                                 FORWARD

  PREROUTING ----+--------------#########------+----------- POSTROUTING

                   |(routing)                         |

 

                 INPUT                         OUTPUT

 

两个特殊的转发点

源地址转换(SNAT) 在POSTROUTING点不能发生在PREROUTING

 

和目标地址转换(DNAT)只能在PREROUTING

 

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source 219.237.206.200

把源地址翻译成外网地址

 

如果需要伪装或不知道要影射成什么地址,可以伪装,他支持动态地址

 

初始化工作

 

iptables -F

iptables -X

iptables -t nat -F

iptables -t nat -X

 

添加规则

 

iptables -A INPUT -i ! ppp0 -j ACCEPT  //棘手接受所有的,来源不是网络接口ppp0的数据

 

nat配置

 

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to 219.237.206.200

//伪装局域网机器的ip地址进入互联网

 

//把目的ip 219.237.206.200端口为21影射到内网192.168.0.1的机器上

iptables -t nat -A PREROUTING -d 219.237.206.200 -p tcp --dport 80 -j DNAT --to 192.168.0.1:80

iptables -t nat -A POSTROUTING -p tcp -s 192.168.0.1 --sport 80 -j SNAT --to-source 219.237.206.200:80

 

iptables -t nat -A PREROUTING -d 219.237.206.200 -p tcp --dport 80 -j DNAT --to 192.168.0.1:80

//把目的 219.237.206.200端口为80(web服务)影射到内网192.168.0.1上

 

iptables -t nat -A POSTROUTING -p tcp --dst 219.237.206.200 --dport 80 -j SNAT --to-source 192.168.0.1

iptables -t nat -A PREROUTING --dst 192.168.0.1 -p tcp --dport 80 -j DNAT  --to-destination 219.237.206.200

 

配置举例

iptables -t nat -A PREROUTING --dst 219.237.206.200 -p tcp --dport 80 -j DNAT  --to-destination 192.168.0.1

iptables -t nat -A PREROUTING --dst 219.237.206.200 -p tcp --dport 21 -j DNAT  --to-destination 192.168.0.1

iptables -t nat -A PREROUTING --dst 219.237.206.200 -p tcp --dport 3306 -j DNAT  --to-destination 192.168.0.1

 

iptables -t nat -A POSTROUTING -p tcp --dst 192.168.0.1 --dport 80 -j SNAT  --to-source 192.168.0.168

iptables -t nat -A POSTROUTING -p tcp --dst 192.168.0.1 --dport 21 -j SNAT  --to-source 192.168.0.168

iptables -t nat -A POSTROUTING -p tcp --dst 192.168.0.1 --dport 3306 -j SNAT  --to-source 192.168.0.168

iptables -t nat -A POSTROUTING -p tcp --dst 192.168.0.1 --dport 22 -j SNAT  --to-source 192.168.0.168

 

iptables -t nat -A PREROUTING --dst 219.237.206.201 -p tcp --dport 22 -j DNAT  --to-destination 192.168.0.1

iptables -t nat -A PREROUTING --dst 219.237.206.200 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.1:80

iptables -t nat -A POSTROUTING -p tcp --dst 219.237.206.200 --dport 80 -j SNAT  --to-source 192.168.0.1

 

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASAQUERADE

iptables -t nat -A PREROUTING -i eth0 -d 219.237.206.200 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.1:80

iptables -t nat -A POSTROUTING -s 219.237.206.202/32 -j SNAT --to-source 192.168.0.1

 

iptables 配置例子带vpn

#添加模块

modporbe ipt_MASQUERADE

modporbe ip_conntrack_ftp

modporbe ip_nat_ftp

#############################################################

iptables -F

iptables -t nat -F

iptables -X

iptables -t nat -X

#############################################################

iptables -p INPUT DROP

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

iptables -A INPUT -p tcp -m multiport --dport 110,80,25 -j ACCEPT

iptables -A INPUT -p tcp -s 192.168.0.0/24 --dport 139 -j ACCEPT

#允许内网samba,smtp,pop3连接

iptables -A INPUT -i eth1 -p udp -m multiport --dports 53 -j ACCEPT

#允许dns连接

iptables -A INPUT -p tcp --dport 1723 -j ACCEPT     //vpn端口

iptables -A INPUT -p gre -j ACCEPT

#允许外网连接vpn

iptables -A INPUT -i ppp0 -p tcp --syn -m connlimit --connlimit-above 15 -j DROP

#为了防止dos太多连接近来,那么可以允许最多15个出始连接,超过则丢弃

 

iptables -t nat -A POSTROUTING -p tcp --dst $HTTP_IP --dport 80 -j SNAT \ --to-source $LAN_IP

 

iptables -I INPUT -s 192.168.0.12 -j ACCEPT

iptables -I FORWARD -s 192.168.0.12 -j ACCEPT

#192.168.0.12是我的机子,全部放行

 

iptables -A FORWARD -p icmp -s 192.168.0.0/24 -j ACCEPT

 

iptables的状态检测机制

 

 

Iptables 综合例子

 

#!/bin/sh

echo "String iptables rules..."

echo "1" /proc/sys/net/ipv4/ip_forward

Out_ip=219.237.206.200

In_ip=192.168.0.1

network_gateway=192.168.0.168

ip_range="198.168.80.0/24"

 

//先初始化工作

iptables -F

iptables -X

iptables -t nat -F

iptables -t nat -X

 

//禁止所有的包通过

iptables -P INPUT ACCEPT

iptables -P OUTPUT ACCEPT

iptables -P FORWARD ACCEPT

 

 

 

 

 

 

 

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多
    喜欢该文的人也喜欢 更多

    ×
    ×

    ¥.00

    微信或支付宝扫码支付:

    开通即同意《个图VIP服务协议》

    全部>>