Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1663771
  • 博文数量: 631
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 3920
  • 用 户 组: 普通用户
  • 注册时间: 2014-08-06 21:58
个人简介

博客是我工作的好帮手,遇到困难就来博客找资料

文章分类

全部博文(631)

文章存档

2022年(2)

2021年(4)

2020年(40)

2019年(4)

2018年(78)

2017年(213)

2016年(41)

2015年(183)

2014年(66)

我的朋友

分类: 系统运维

2016-07-13 16:10:38

iptables规则功能


filter表:

filter主要和主机自身有关,主要负责防火墙功能 过滤本机流入流出的数据包是默认使用的表;

input   :负责过滤所有目标地址是本机地址的数据包,就是过滤进入主机的数据包;

forward  :负责转发流经主机但不进入本机的数据包,和NAT关系很大;

output   :负责处理源地址的数据包,就是对本机发出的数据包;

NAT表:

负责网络地址转换,即来源于目的IP地址和端口的转换,一般用于共享上网或特殊端口的转换服务

snat    :地址转换

dnat    :标地址转换

pnat    :标端口转换

mangle 表:

将报文拆开来并修改报文标志位,最后封装起来

5个检查点(内置链)

·PREROUTING

·INPUT

·FORWORD

·OUTPUT

·POSTROUTING    

多条链整合起来叫做表,比如,在input这个链,既有magle的规则也可能有fileter的规则。


因此在编写规则的时候应该先指定表,再指定链


netfilter主要工作在tcp/ip协议栈上的,主要集中在tcp报文首部和udp报文首部


规则的属性定义:


1.网络层协议

主要集中在ip协议报文上


2.传输层协议属性:

主要集中在

tcp


udp

icmp  icmp其并不是真正意义传输层的,而是工作在网络层和传输层之间的一种特殊的协议


3.ip报文的属性:

IP报文的属性为: 源地址.目标地址

4.iptables规则匹配


iptables如何查看表和链

大写字母选项:可以实现某种功能,比如添加删除清空规则链;

小写字母选项:用来匹配及其他;

-L :list 列表

    -n :数字格式显示ip和端口;

    --line-numbers:显示行号;

    -x : 显示精确值,不要做单位换算; 

-t :  指定表

     -t {fillter|nat|mangle|raw}

-v : 显示详细信息 -v -vvv -vvvv ..可以显示更详细的信息 

5.其他子命令:

管理链:

-F :清空链

清空nat表中的input链,格式如下:

#iptables-t nat -F INPUT

#清空fllter表所有链:


#iptables -F


-P : 设定默认策略,为指定链设置默认策略,格式如下:


#设置fllter表input链的默认规则为丢弃


iptables -t fllter -P INPUT DROP


-N : 新建一条自定义链(内置链不能删除,如果太多,可以自定义链)


#自定义连只能被调用才可以发挥作用


iptables -N fillter_web


-X : 删除自定义空链,如果链内有规则,则无法删除


-Z :计算器清零

iptables-Z

-E :重命名自定义链 

iptables管理规则:


-A   :append附加规则,将新增的规则添加到链的尾部

-I[n] :插入为第n条规则

-D   : 删除第n条规则

-R[n] : 替换第N条


表和链的对应关系:


fillter :INPUT  FORWORD  OUTPUT


nat :   PREROUTING  POSTROUTING  OUTPUT


使用-t指定表来查看指定表内的规则:


#iptables-t nat -L -n

raw : prerouting output

iptables-t raw -L -n

mangle: prerouting input forword output postrouting

iptables-t mangle -L -n

#查看规则

[root@test3~]# iptables -L -n


Chain INPUT (policy ACCEPT)
target     prot opt source              destination        


Chain FORWARD (policy ACCEPT)
target     prot optsource              destination        


Chain OUTPUT (policy ACCEPT)
target     prot optsource              destination  


通过以上可以观察到,每一个链都有默认策略:policy ACCEPT


通常只需要修改fllter表的默认策略即可,由此如果有报文请求来访问本机的某个服务,那么则会经过input链,因此进来的报文都是需要做过滤的,那么出去的报文则不需要过滤,在有些特定的场所下也需要做过滤


所以写规则的时候必须放将规则写在正确链上,意义非常重大


规则和默认策略都有2个计数器,通过-v选项可以观察规则的匹配情况


#iptables -t nat -L -n -v


[root@sshgw~]# iptables -L -n -v


ChainINPUT (policy ACCEPT 7 packets, 975 bytes)


pkts bytestarget     prot opt in     out    source              destination        


   0    0 ACCEPT     all  --  lo     *      0.0.0.0/0           0.0.0.0/0          


   0    0 DROP       all  -- eth2   *       101.61.0.0/10        0.0.0.0/0          


   0    0 DROP       all  -- eth2   *       127.0.0.0/8          0.0.0.0/0          


   0    0 DROP       all  -- eth2   *       162.254.0.0/16       0.0.0.0/0          


   0    0 DROP       all  -- eth2   *       192.0.0.0/24         0.0.0.0/0          


   0    0 DROP       all  -- eth2   *       192.0.2.0/24         0.0.0.0/0          


   0    0 DROP       all  -- eth2   *       197.18.0.0/15        0.0.0.0/0          


   0    0 DROP       all  --  eth2  *       197.51.100.0/24      0.0.0.0/0          


   0    0 DROP       all  -- eth2   *       203.0.111.0/24       0.0.0.0/0          


   0    0 DROP       all  -- eth2   *       224.0.0.0/4          0.0.0.0/0          


   0    0 DROP       all --  eth2   *      240.0.0.0/4         0.0.0.0/0          


776 37056 REFRESH_TEMP  all --  *      *      0.0.0.0/0           0.0.0.0/0          


编写规则语法:


iptables [-t 表] 大写选项子命令 [规则号] 链名 匹配标准 -j 目标(规则)


目标:

DROP   :   丢弃

REJECT :   拒绝

ACCEPT :   接受

RETURN :  返回主链继续匹配

REDIRECT:  端口重定向

MASQUERADE :地址伪装

DNAT :    目标地址转换

SNAT :源地址转换
MARK :打标签

LOG  

自定义链

匹配标准

iptables的匹配标准大致分为两类:

1.通用匹配

-s | --src | --source [!] IP/NETWORK

-d ------------------------

-i :指定数据报文流入接口  input prerouting forward

-o :指定数据报文流出接口  output postrouting forward

-p :明确说明只放行哪种协议的报文匹配规则


以当前主机为例:


凡是来自于某个ip段的网络访问本机


[root@test3xtables-1.4.7]# iptables -A INPUT -s 10.0.10.0/24 -d 10.0.10.0/24 -j ACCEPT


[root@test3 xtables-1.4.7]# iptables -L -n -v


ChainINPUT (policy ACCEPT 10 packets, 1029 bytes)


pkts bytestarget    prot opt  in    out      source                destination


22  1660    ACCEPT     all  --  *      *       10.0.10.0/24                10.0.10.0/24 


Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target     prot opt in    out       source                   destination 


Chain OUTPUT (policy ACCEPT 16 packets, 1536 bytes)
pkts bytes target     prot opt in    out       source                  destination    


pkts     被本机报文所匹配的个数

bytes   报文所有大小记起来之和

opt     额外的选项,--表示没有

target   处理机制

prot     放行哪种协议

source  源地址

destination  目标地址

对于严谨的规则,一般默认规则都是拒绝未知,允许已知

如下所示:

只放行信任IP地址段,其他全部禁止

iptables-P INPUT DORP

iptables-A INPUT -s   10.0.10.0/24   -d  10.0.10.0/24 -j ACCEPT


iptables-P OUTPUT DORP


iptables-A OUTPUT -d   10.0.10.0/24  -s    10.0.10.0/24-j ACCEPT


保存规则


[root@test3~]# /etc/init.d/iptables save


iptables:Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]

保存规则至其他文件

[root@test3~]# iptables-save > /tmp/iptables  

加载iptables文件规则

[root@test3~]# iptables-resotre < /tmp/iptables  


1.2.规则的替换


首先来查看规则

[root@test3 ~]# iptables -L -n --line-number

ChainINPUT (policy ACCEPT)

num  target    prot opt source              destination        


1    ACCEPT    all  --  10.0.10.0/24         10.0.10.0/24    


ChainFORWARD (policy DROP)


num  target    prot opt source              destination    


ChainOUTPUT (policy ACCEPT)


num  target    prot opt source              destination


替换规则:将规则1替换为 eth0只能够通过某个网段进来

[root@test3~]# iptables -R  INPUT 1 -s 10.0.10.0/24-d 10.0.10.62 -i eth0 -j ACCEPT

[root@test3~]# iptables -L -n --line-number

ChainINPUT (policy ACCEPT)

num  target    prot opt source              destination      


1    ACCEPT    all  --  10.0.10.0/24         10.0.10.62   

2.扩展匹配

#所有的扩展匹配表示要使用-m来指定扩展的名称来引用


而每个扩展模块一般都会有自己特有的专用选项,在这些选项中,有些是必备的:


2.1隐含扩展


如下所示:


#端口之间必须是连续的


-p tcp--sport|--dport 21-80


#取反,非21-80的端口


-p tcp--sport|--dport !21-80


#检测报文中的标志位

--tcp-flagsSYN,ACK,RST,FIN, SYN

ALL                   #表示为所有标志位

NONE                    #表示没有任何一个标志位

#--tcp-flags ALL NONE   #表示所有标志位都检测,但是其中多有都为0

#--tcp-flage ALL SYN,FIN #表示SYN,FIN都为1(即握手又断开)

#生成环境下tcp-flags 用的非常多,意义非常重要

例:放行本机对web的访问


[root@test3~]# iptables -A INPUT -d 10.0.10.62  -ptcp --dport 80 -j ACCEPT


[root@test3~]# iptables -L -n


ChainINPUT (policy DROP)


target     prot opt source               destination        


ACCEPT     all --  10.0.10.0/24         10.0.10.62          


ACCEPT     tcp --  0.0.0.0/0            10.0.10.62          tcp dpt:80


放行出去的报文,源端口为80


[root@test3~]# iptables -A OUTPUT -s 10.0.10.62 -p tcp --sport 80 -j ACCEPT

查看匹配规则

[root@test3 ~]# iptables -L -n --line-number

ChainINPUT (policy DROP)


num  target    prot opt source              destination        


1    ACCEPT    all  --  10.0.10.0/24         10.0.10.62          


2    ACCEPT    tcp  --  0.0.0.0/0            10.0.10.62          tcp dpt:80


 


ChainFORWARD (policy DROP)


num  target    prot opt source              destination        


 


ChainOUTPUT (policy DROP)


num  target    prot opt source              destination        


1    ACCEPT    all  --  10.0.10.0/24         10.0.10.0/24        


2    ACCEPT    tcp  --  10.0.10.62           0.0.0.0/0           tcp spt:80


考虑要点:

(1)规则为放行出去的响应报文

(2)考虑源IP地址为本机,目标为访问的时候拆开报文才可以获知,而写规则的时候是面向所有主机,所以这里不用写

(3)源端口:80 ,因为用户访问的时候一定会访问其80端口,无可非议的

(4)目标端口:请求到来的时候事先无法断定对方的端口是多少,所以不用写


2.2协议匹配

通常对协议做匹配则使用 -p 参数 来指定协议即可

匹配UDP:UDP只有端口的匹配,没有任何可用扩展,格式如下


-p udp--sport | --dport


匹配ICMP格式如下


-picmp --icmp-[number]


icmp常见类型:请求为8(echo-request),响应为0(echo-reply)


例:默认规则input output 都为DROP,使其本机能ping(响应的报文)的报文出去


通过此机器去ping网关10.0.10.1 , 可结果却提示not permitted,使其能通10.0.10.0/24网段中的所有主机


[root@test3~]#iptables -A OUTPUT -s 10.0.10.62 -d 10.0.10.0/24 -p icmp --icmp-type8 -j ACCEPT


可看到无法响应:0表示响应进来的报文规则,并没有放行自己作为服务端的的角色规则


[root@test3~]# iptables -A INPUT -s 10.0.10.0/24 -d 10.0.10.62 -p icmp --icmp-type0 -j ACCEPT


#ping 10.0.10.x


允许类型为0(响应报文)出去


[root@test3~]# iptables -A OUTPUT -s 10.0.10.62 -d  10.0.10.0/24 -picmp --icmp-type 0 -j ACCEPT


例2:本机DNS服务器,要为本地客户端做递归查询;iptables的input output默认为drop 本机地址是10.0.10.62


[root@test3~]# iptables -A INPUT -d 10.0.10.62 -p udp --dprot 53 -j ACCEPT


[root@test3~]# iptables -A OUTPUT -S 10.0.10.62 -p udp --sprot 53 -j ACCEPT


客户端请求可以进来,响应也可以出去,但是自己作为客户端请求别人是没有办法出去的,所以:


[root@test3~]# iptables -A OUTPUT -s 10.0.10.62 -p udp --dport 53 -j ACCEPT


[root@test3~]# iptables -A INPUT -d 10.0.10.62 -p udp --sprot 53 -j ACCEPT


如果为tcp 则将以上udp改为tcp即可

iptables中有一个扩张参数--status

此扩展可以追踪tcp udp icmp等各种状态


其能够使用某种内核数据结构保持此前曾经建立的连接状态时间的功能,称为连接追踪


内核参数文件路径为:


[root@test3~]# ls /proc/sys/net/netfilter/


[root@test3~]# cat /proc/sys/net/netfilter/nf_conntrack_udp_timeout
30


以此为例,在其30秒钟内,曾经建立过的udp连接,这些连接都可以被追踪到的,可以明确知道在这期间哪个客户端曾经访问过,只要基于请求的序列,能跟此前保持会话信息,即可查询

2.4显式扩展


在iptalbes中数据包和被跟踪连接的4种不同状态相关联,


这四种状态分别是NEW、ESTABLISHED、RELATED及INVALID,


除了本机产生的数据包由NAT表的OUTPUT链处理外所有连接跟踪都是在NAT表的


PREROUTING链中进行处理的,


也就是说iptables在NAT表的PREROUTING链里从新计算所有数据包的状态。


如果发送一个流的初始化数据包,状态就会在NAT表的OUTPUT链里被设置为NEW,当收到回应的数据包时,状态就会在NAT表的PREROUTING链里被设置为ESTABLISHED,


如果第一个数据包不是本机生成的,那就回在NAT表PREROUTING链里被设置为NEW状态,


所以所有状态的改变和计算都是在NAT表中的表链和OUTPUT链里完成的。


使用-m来指定其状态并赋予匹配规则,语法如下


-mstate --state 状态

   NEW

   ESTABLISHED

   RELATED 


   INVALID


NEW:


NEW状态的数据包说明这个数据包是收到的第一个数据包。比如收到一个SYN数据包,它是连接的第一个数据包,就会匹配NEW状态。第一个包也可能不是SYN包,但它仍会被认为是NEW状态。


ESTABLISHED:


只要发送并接到应答,一个数据连接就从NEW变为ESTABLISHED,而且该状态会继续匹配这个连接后继数据包。


RELATED:


当一个连接和某个已处于ESTABLISHED状态的连接有关系时,就被认为是RELATED,也就是说,一个连接想要是RELATED的,首先要有个ESTABLISHED的连接,这个ESTABLISHED连接再产生一个主连接之外的连接,这个新的连接就是RELATED。


INVALID:


INVALID状态说明数据包不能被识别属于哪个连接或没有任何状态。


例:


对本机22端口做状态监测:


进来的请求状态为new,而出去的状态则为ESTABLISHED,如果自动连接别人 状态肯定为


NEW,如果正常去响应别人那么状态肯定是ESTABLISHED



[root@test3~]# iptables -I INPUT -s 10.0.10.0/24 -d 10.0.10.62 -p tcp --dport 22 -m state--state NEW,ESTABLISHED -j ACCEPT


出口的响应都必须是ESTABLISHED


[root@test3~]# iptables -A OUTPUT -s 10.0.10.62 -d 10.0.10.0/24 -p tcp --dport 22 -m state--state ESTABLISHED -j ACCEPT


[root@test3~]# iptables -L -n


ChainINPUT (policy ACCEPT)


target     prot opt source               destination        


ACCEPT     tcp --  10.0.10.0/24         10.0.10.62          tcp dpt:22 state NEW,ESTABLISHED


 
ChainFORWARD (policy DROP)


target     prot opt source               destination        



ChainOUTPUT (policy ACCEPT)


target     prot opt source               destination        


ACCEPT     tcp  -- 10.0.10.62          10.0.10.0/24        tcp dpt:22state ESTABLISHED


多端口规则匹配


使用参数-m multiport 可以指定15个以内的非连续端口,比如21-22,80


-mmulitport  


   --src-prots


   --dst-ports


   --prots


#对多端口进行匹配,只要匹配以下端口,则全部放行


[root@test3~]# iptables -A INPUT  -s 10.0.10.0/24 -d10.0.10.62 -p tcp -m state --state NEW  -m mulitport--destination-ports 21,22,80 -j ACCEPT


多IP匹配,指定匹配的IP地址范围:

-miprange


   --src-range


   --dst-range


指定匹配的连续ip段


[root@test3~]# iptables -A INPUT -s  -m iprange --src-range 10.0.10.100-10.0.10.200


指定速率匹配


默认为每秒匹配3个报文,基于令牌桶算法


-mlimit


   --limit             #NUMBER,表示允许收集多少个空闲令牌


   --limit-burst          #RATE,允许放行多少个报文


比如:ssh一分钟之内只能建立20个链接,平均5秒一个,而一次性只能放行2个空闲令牌


   --limit 20/min


   --limit-burst 2


只有在大量空闲令牌存储的情况下,才可有limit-burst控制


例:控制NEW状态的请求


[root@test3~]# iptables -A INPUT -s 10.0.10.0/24 -d 10.0.10.62 -m state --state NEW -mlimit --limit 12/min --limit 12/min --limit-burst 2 -j ACCEPT


例2:每次只允许2个ping包进来


[root@test3~]# iptables -F


[root@test3~]# iptables -A INPUT -s 10.0.10.0/24 -d 10.0.10.62 -p icmp --icmp-type 8 -mlimit --limit 20/min --limit-burst 5 -j ACCEPT


新建立一终端,在其终端ping10.0.10.62可以看到效果,不再演示


 
2.5对应用层进行匹配


对应用层编码字符串做相似匹配,常用算法使用--alog来指定 ,一般来讲算法一般为bm和kmp


-msrting  


   --string ""


   --algo {bm|kmp}


例:


·假如我们期望web站点页面中任何包含"hello"的字符串的页面,则禁止访问,其他则放行


·请求报文中不会包含hello,一般来讲只包含访问某个页面,那么请求内容无非包含了请求某个链接而已


·响应报文中会封装页面的内容信息,因此 会出现在响应报文中,而不是请求报文


启动httpd服务


[root@test3~]# /etc/init.d/httpd start


在web站点新建页面1.html,内容为"hello" , 2.html内容为"word"


[root@test3domian]# echo hello > 1.html


[root@test3domian]# echo word > 2.html


在iptables的允许放行规则前面加一条更严谨的禁止规则:


[root@test3domian]# iptables -A OUTPUT -s 10.0.10.62 -p tcp --sport 80 -m string --string"hello" --algo kmp -j REJECT


再次访问


[root@test3domian]# curl -dump


word


[root@test3domian]# curl -dump


#请求已发出去但是一直没有反应,我们来看一下防火墙规则是否被匹配到


[root@test3domian]# iptables -L -nv


ChainINPUT (policy ACCEPT 255 packets, 30024 bytes)


pkts bytes target     prot opt in     out    source               destination        


 

ChainFORWARD (policy DROP 0 packets, 0 bytes)


pkts bytes target     prot opt in     out    source              destination        


 

ChainOUTPUT (policy ACCEPT 201 packets, 29406 bytes)


pkts bytes target     prot opt in     out    source              destination        


  35 11209 REJECT     tcp --  *      *      10.0.10.62          0.0.0.0/0           tcp spt:80STRING match "hello" ALGO name kmp TO 65535 reject-withicmp-port-unreachable


基于时间限定


-m time


#指定日期起止范围


   --datestart


   --datestop


#指定时间的起止范围


   --timestart


   --timestop


#指定星期x范围


   --weekdays


#指定月份


   --monthdays


 
3.基于iptables实现NAT功能


3.1基于SNAT功能的实现


考虑场景:为解决IP地址不足,所以用NAT功能来实现成本节约


SNAT:源地址转换(代理内部客户端访问外部网络)在POSTROUTING或OUTPUT链上来做规则限制


参数选项:


    -j SNAT --to-source IP


    -j MASQUERADE


DNAT :目标地址转换(将内部服务器公开至外部网络)需在PREROUTING做限制


参数选项:


   -j DNAT --to-destination IP:prot


NAT不但可以转换目标地址,还可以映射目标端口


拓补图如下:


wKioL1Lw7qSRlOaVAACmAxfTfhM460.jpg


假设iptables为网关服务器,192.168.0.0为内网地址段 10.0.10.0 为外网地址段


规划:


服务器角色


服务器内网IP地址


iptables


10.0.10.62 、 192.168.0.4


client


10.0.10.60


web  server


192.168.0.110


下面来配置服务器:


webserver服务器配置如下:


[root@mode~]# /etc/init.d/httpd start


[root@modehtml]# echo 111 > test.html


#查看路由信息


[root@modehtml]# route -n
Kernel IP routing table


Destination     Gateway         Genmask         Flags Metric Ref    Use Iface


192.168.0.0     0.0.0.0         255.255.255.0   U    0      0        0 eth1


10.0.10.0       0.0.0.0         255.255.255.0   U     0     0        0 eth0


169.254.0.0     0.0.0.0         255.255.0.0     U    0      0        0 eth0


0.0.0.0         192.168.0.4     0.0.0.0         UG   0      0        0 eth1


0.0.0.0         192.168.0.1     0.0.0.0         UG   0      0        0 eth1


iptables服务器配置如下:


开启路由转发功能


[root@test3domian]# echo 1 > /proc/sys/net/ipv4/ip_forward


client配置如下:


#将eth1的网卡关闭,真正意义上断开连接


[root@test~]# ifdown eth1


#添加直连路由


[root@test~]# route add default gw 10.0.10.62


[root@test~]# route -n


KernelIP routing table


Destination     Gateway         Genmask         Flags Metric Ref    Use Iface


10.0.10.0       0.0.0.0         255.255.255.0   U    0      0        0 eth0


169.254.0.0     0.0.0.0         255.255.0.0     U    1002   0        0 eth0


0.0.0.0         10.0.10.62      0.0.0.0         UG   0      0        0 eth0


这时去ping192.168.0.0 段的地址是通的,如下所示


[root@test~]# ping 192.168.0.4


PING192.168.0.4 (192.168.0.4) 56(84) bytes of data.


64bytes from 192.168.0.4: icmp_seq=1 ttl=64 time=22.0 ms


64bytes from 192.168.0.4: icmp_seq=2 ttl=64 time=0.245 ms


查看是否可访问webserver的web服务


[root@test ~]# curl -dump


111


返回web server上查看访问日志


[root@modelogs]# tail access_log


10.0.10.60- - [02/Feb/2014:20:33:27 +0800] "POST /test.htmlHTTP/1.1" 200 4 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu)libcurl/7.19.7 NSS/3.13.6.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2"


#源地址为10.60 由此可见,由路由来实现两台主机的通信


如果想使用nat方式来实现任何来自10.0/24的网络 通过此台服务器想访问web其他主机,都将源地址改为iptables的ip地址


#凡是来自10.0.10.0网段的主机都将其转换为自己的ip地址


[root@test3domian]#  iptables -t nat -A POSTROUTING-s 10.0.10.0/24 -j SNAT --to-source 192.168.0.4


返回client端再次访问web server,并查看日志


[root@mode logs]# tail access_log


10.0.10.60- - [02/Feb/2014:20:33:27 +0800] "POST /test.html HTTP/1.1" 200 4"-" "curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7NSS/3.13.6.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2"


192.168.0.4- - [02/Feb/2014:20:37:13 +0800] "POST /test.htmlHTTP/1.1" 200 4 "-" "curl/7.19.7 (x86_64-redhat-linux-gnu)libcurl/7.19.7 NSS/3.13.6.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2"


由此可见,来源IP为代理服务器,因此它是回给192.168.0.4的 ,由192.168.0.4通过nat路由表再返回给client


查看规则


[root@test3domian]# iptables -t nat -L -n -v


ChainPREROUTING (policy ACCEPT 3 packets, 387 bytes)


pkts bytes target     prot opt in     out    source               destination        


 


ChainPOSTROUTING (policy ACCEPT 0 packets, 0 bytes)


pkts bytes target     prot opt in     out    source              destination        


  2   144 SNAT       all --  *      *      10.0.10.0/24        0.0.0.0/0           to:192.168.0.4


 


ChainOUTPUT (policy ACCEPT 0 packets, 0 bytes)


pkts bytes target     prot opt in     out    source               destination


将其状态全部放行


[root@test3domian]# iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT


[root@test3domian]#  iptables -A FORWARD -s10.0.10.0/24 -p tcp --dport 80 -m state --state NEW -j ACCEPT


再来测试:切换至Client


[root@test~]# curl -dump
111


返回iptables服务器,查看规则匹配情况


[root@test3domian]# iptables -L -nv


ChainINPUT (policy ACCEPT 45 packets, 3241 bytes)


pkts bytes target     prot opt in     out    source              destination        


 


ChainFORWARD (policy ACCEPT 0 packets, 0 bytes)


pkts bytes target     prot opt in     out    source              destination        


 27  2964 ACCEPT     all --  *      *      0.0.0.0/0           0.0.0.0/0           stateESTABLISHED


  3   180 ACCEPT     tcp --  *      *      10.0.10.0/24        0.0.0.0/0           tcp dpt:80state NEW


 


ChainOUTPUT (policy ACCEPT 31 packets, 4064 bytes)


pkts bytes target     prot opt in     out    source              destination        


通过规则匹配可以看到,首先其会先发起三次握手第一次由第二条规则先匹配到,而后来由状态规则ESTABLISHED进行匹配


 


3.2定义DNAT的实现


如果构建大并发的环境时,NAT并不适用,一般来讲能够并发用户请求的场景来讲,在2-3W 已经非常庞大了,通常都是专业级硬件分发设备或应用来做分发,下面尝试着使client能够访问web服务器,但期望的是今后访问web服务器不是访问192.168.0.110而是iptables服务器10.0.10.62


因为是实验环境,所以清空所有规则


[root@test3~]# iptables -t nat -F


[root@test3~]# iptables -F


[root@test3~]# iptables -P FORWARD ACCEPT


我们期望网关10.0.10.62为用户访问目标,而不是192.168.0.110,但62上是没有web服务的,所以有人访问62的web服务必须将其转换到110上


所以要在iptables服务器上操作:


[root@test3~]# iptables -t nat -A PREROUTING -d 10.0.10.62 -p tcp --dport 80 -j DNAT--to-destination 192.168.0.110


在客户端测试:


[root@test~]# curl -dump
111


如果将FORWARD链的规则改为DROP那么该如何来实现:


[root@test3~]# iptables -P FORWARD DROP


再次测试,果然无法访问


它可以实现地址转换,但是地址转换后的报文是无法再转发至内部主机中去,因为forward规则给挡住了


可以将已经建立过连接的请求全部放行,于是乎:


[root@test3~]# iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@test3 ~]# iptables -A FORWARD -d 192.168.0.110 -p tcp --dport 80 -m state--state NEW -j ACCEPT


#目标地址必须是内部web地址 因为forward链在路由之后才可知其是否要进行转发


#也就是意味着用户的请求到达PREROUTING的时候,目标的地址已经改过了,当用户的请求FORWARD之后目标地址已经是web地址


 


放行转发ssh服务:


我们想请求iptables的22端口则转发至web server端的22端口上去


[root@test3~]# iptables -t nat -A PREROUTING -d 10.0.10.62 -p tcp --dport 22 -j DNAT --to-destination 192.168.0.110


[root@test3~]# iptables -A FORWARD -d 192.168.0.110 -p tcp --dport 22 -m state --state NEW-j ACCEPT


进行登录


[root@test~]# ssh 10.0.10.62


由此可见,以后想登陆10.62则登陆不上去了(可以更改为非22端口等,不再说明了哦)


 
将80端口请求转发至web端8080端口


更改apache服务的监听端口:


Listen8080


切换至iptables服务端添加规则:


[root@test3~]# iptables -t nat -A PREROUTING -d 10.0.10.62 -p tcp --dport 80 -j DNAT--to-destination 192.168.0.110:8080


[root@test3~]# iptables -t nat -L -nv
Chain PREROUTING (policy ACCEPT 2 packets, 458 bytes)
pkts bytes target     prot opt in    out    source              destination        
   6   360 DNAT      tcp  --  *     *      0.0.0.0/0           10.0.10.62          tcp dpt:80to:192.168.0.110:8080


Chain POSTROUTING (policy ACCEPT 9 packets, 564 bytes)
pkts bytes target     prot opt in    out     source              destination        


Chain OUTPUT (policy ACCEPT 3 packets, 204 bytes)
pkts bytes target     prot opt in    out    source              destination  


 


在端口映射环境下如何放行web服务:


在做地址转发的时候必须以转换之后的端口和地址为目标端口和目标ip地址


[root@test3~]# iptables -P FORWARD DROP
[root@test3 ~]# iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT
[root@test3 ~]# iptables -A FORWARD -d 192.168.0.110 -p tcp --dport 8080 -mstate --state NEW -j ACCEPT


假设在此服务器上还有mysql服务,假设mysql在内网工作在正常服务端口,但告知外面工作在6789端口上,那么


进入mysql并授权


mysql>grant all on *.* to 'root'@'%' identified by '123456';


mysql>flush privileges;


在iptables服务器上添加规则如下


[root@test3 ~]# iptables -t nat -A PREROUTING-d 10.0.10.62 -p tcp --dport 6789 -j DNAT --to-destination 192.168.0.110:3306


[root@test3~]# iptables -A FORWARD -d 192.168.0.110 -p tcp --dport 3306 -m state --stateNEW -j ACCEPT


[root@test~]# mysql -uroot -h10.0.10.62 -P6789 -p


切换至client端进行测试


[root@test~]# mysql -uroot -h10.0.10.62 -P6789 -p


 


4.ip_conntrack 功能


其扩展模块路径为


/proc/net/nf_conntrack


/proc/sys/net/nf_conntrack_max


不同版本的值和相关信息未必一致


[root@test3~]# cat /proc/sys/net/nf_conntrack_max
31860


比起红帽5的值已经大的太多了


#这些超时时间非常长,如下所示:


[root@test3 ~]# cat/proc/net/nf_conntrack
ipv4     2 tcp      6 431999ESTABLISHED src=10.0.10.62 dst=10.0.10.1sport=22 dport=59448 src=10.0.10.1 dst=10.0.10.62 sport=59448 dport=22[ASSURED] mark=0 secmark=0 use=2


#可以在某些时候将值尽量调低,如果不尽量追踪过长时间


[root@test3~]# cat /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established
432000       #5天时间


如果没有特殊需求的话,将其值调低,这样可以保证被追踪的连接尽早被记录的文件中清除出去,已腾出空间供其他被追踪使用


既然追踪连接功能有限制而且对性能有很大的影响为何还要开启呢?


启动其功能的原因在于 在某些场景中必须追踪状态,才能达到目的,如果在并发连接非常大的场景下启用连接追踪是不明智的


因此需自己判断好应用场景,不得不启用,连接数也非常大,方法如下:


(1).调小nf_conntrack_tcp_timeout_established


(2).调大 /proc/sys/net/nf_conntrack_max        #需要一定的内存容量,只要空间充足即可


 


扩展模块connlimit:


connlimit 连接数限制,一般可以实现控制某源ip地址发起来某连接个数的


--connlimit-above[number]  #连接数的上限,如果某个连接数的个数超过为某个值之后(高于),通常用取反的方法来放行:


#iptables-A INPUT -s 10.0.10.0/24 -p tcp --dport 80 -m connlimit ! --connlimit-above 5-j ACCEPT  


hashlimit,limit   #能够分析每个ip地址的速率


 


5.recent模块


利用iptables的recent模块来抵御DOS攻击: 22,建立一个列表,保存有所有访问过指定的服务的客户端IP 对本机ssh: 远程连接


(1).利用connlimit模块将单IP的并发设置为3;会误杀使用NAT上网的用户,可以根据实际情况增大该值;


iptables-I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP


第二句是记录访问tcp 22端口的新连接,记录名称为SSH --set 记录数据包的来源IP,如果IP已经存在将更新已经存在的条目


 


(2).利用recent和state模块限制单IP在300s内只能与本机建立2个新连接。被限制五分钟后即可恢复访问


iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent--set --name SSH
iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent--update --seconds 300 --hitcount 3 --name SSH -j LOG --log-prefix "SSHAttach: "
iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent--update --seconds 300 --hitcount 3 --name SSH -j DROP


第三句是指SSH记录中的IP,300s内发起超过3次连接则拒绝此IP的连接。
--update 是指每次建立连接都更新列表;
--seconds必须与--rcheck或者--update同时使用
--hitcount必须与--rcheck或者--update同时使用


 


(3).iptables的记录:/proc/net/xt_recent/SSH


也可以使用下面的这句记录日志:


iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent--update --name SSH --second 300 --hitcount 3 -j LOG --log-prefix "SSHAttack"




[root@localhost ben.liu]# service iptables status
Table: filter
Chain INPUT (policy ACCEPT)

num  target     prot opt source               destination         

1    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:2256 

2    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 

3    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           

4    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           

5    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:80 

6    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22 

7    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 

Chain FORWARD (policy ACCEPT)

num  target     prot opt source               destination         

1    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 

Chain OUTPUT (policy ACCEPT)

num  target     prot opt source               destination     

-----------

插入1条记录

[root@localhost ben.liu]# iptables -I INPUT -j ACCEPT -s 172.16.0.0/16 -p tcp --dport 443 -m state --state NEW 

[root@localhost ben.liu]# service iptables status

Table: filter

Chain INPUT (policy ACCEPT)

num  target     prot opt source               destination         

1    ACCEPT     tcp  --  172.16.0.0/16        0.0.0.0/0           tcp dpt:443 state NEW 

2    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:2256 

3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 

4    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           

5    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           

6    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:80 

7    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22 

8    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 

Chain FORWARD (policy ACCEPT)

num  target     prot opt source               destination         

1    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 

Chain OUTPUT (policy ACCEPT)

num  target     prot opt source               destination   

-    

[root@localhost ben.liu]# iptables-save

# Generated by iptables-save v1.4.7 on Sat Dec 24 16:50:09 2011

*filter

:INPUT ACCEPT [0:0]

:FORWARD ACCEPT [0:0]

:OUTPUT ACCEPT [201:20052]

-A INPUT -s 172.16.0.0/16 -p tcp -m tcp --dport 443 -m state --state NEW -j ACCEPT 

-A INPUT -p tcp -m state --state NEW -m tcp --dport 2256 -j ACCEPT 

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

-A INPUT -p icmp -j ACCEPT 

-A INPUT -i lo -j ACCEPT 

-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT 

-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT 

-A INPUT -j REJECT --reject-with icmp-host-prohibited 

-A FORWARD -j REJECT --reject-with icmp-host-prohibited 

COMMIT

# Completed on Sat Dec 24 16:50:09 2011

--

修改1条记录:比如第7条   state NEW tcp dpt:22 

[root@localhost ben.liu]# iptables -R INPUT 7 -s 172.16.0.0/16 -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT

[root@localhost ben.liu]# iptables status

Bad argument `status'

Try `iptables -h' or 'iptables --help' for more information.

[root@localhost ben.liu]# service iptables status

Table: filter

Chain INPUT (policy ACCEPT)

num  target     prot opt source               destination         

1    ACCEPT     tcp  --  172.16.0.0/16        0.0.0.0/0           tcp dpt:443 state NEW 

2    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:2256 

3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 

4    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           

5    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           

6    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:80 

7    ACCEPT     tcp  --  172.16.0.0/16        0.0.0.0/0           state NEW tcp dpt:22 

8    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 

Chain FORWARD (policy ACCEPT)

num  target     prot opt source               destination         

1    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 

Chain OUTPUT (policy ACCEPT)

num  target     prot opt source               destination     

--

删除1条记录,比如:第7

[root@localhost ben.liu]# iptables -D INPUT 7

[root@localhost ben.liu]# iptables -L 

Chain INPUT (policy ACCEPT)

target     prot opt source               destination         

ACCEPT     tcp  --  172.16.0.0/16        anywhere            tcp dpt:https state NEW 

ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:pcc-mfp 

ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED 

ACCEPT     icmp --  anywhere             anywhere            

ACCEPT     all  --  anywhere             anywhere            

ACCEPT     tcp  --  anywhere             anywhere            state NEW tcp dpt:http 

REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited 

Chain FORWARD (policy ACCEPT)

target     prot opt source               destination         

REJECT     all  --  anywhere             anywhere            reject-with icmp-host-prohibited 

Chain OUTPUT (policy ACCEPT)

target     prot opt source               destination         

[root@localhost ben.liu]# iptables -L -n

Chain INPUT (policy ACCEPT)

target     prot opt source               destination         

ACCEPT     tcp  --  172.16.0.0/16        0.0.0.0/0           tcp dpt:443 state NEW 

ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:2256 

ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 

ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           

ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           

ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:80 

REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 

Chain FORWARD (policy ACCEPT)

target     prot opt source               destination         

REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 

Chain OUTPUT (policy ACCEPT)

target     prot opt source               destination         

[root@localhost ben.liu]# service iptables status

Table: filter

Chain INPUT (policy ACCEPT)

num  target     prot opt source               destination         

1    ACCEPT     tcp  --  172.16.0.0/16        0.0.0.0/0           tcp dpt:443 state NEW 

2    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:2256 

3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 

4    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           

5    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           

6    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:80 

7    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 

Chain FORWARD (policy ACCEPT)

num  target     prot opt source               destination         

1    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 

Chain OUTPUT (policy ACCEPT)

num  target     prot opt source               destination      

---

清空所有INPUT 记录      

[root@localhost ben.liu]# iptables-save > /etc/sysconfig/iptables.bak

[root@localhost ben.liu]# iptables -F INPUT

[root@localhost ben.liu]# service iptables status

Table: filter

Chain INPUT (policy ACCEPT)

num  target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)

num  target     prot opt source               destination         

1    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 

Chain OUTPUT (policy ACCEPT)

num  target     prot opt source               destination     

[root@localhost ben.liu]# iptables-save > /etc/sysconfig/iptables.bak

[root@localhost ben.liu]# iptables -F INPUT

[root@localhost ben.liu]# service iptables status

Table: filter

Chain INPUT (policy ACCEPT)

num  target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)

num  target     prot opt source               destination         

1    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 

Chain OUTPUT (policy ACCEPT)

num  target     prot opt source               destination         

恢复以前保存的记录:

[root@localhost ben.liu]# iptables-restore /etc/sysconfig/iptables.bak 

[root@localhost ben.liu]# service iptables status

Table: filter

Chain INPUT (policy ACCEPT)

num  target     prot opt source               destination         

1    ACCEPT     tcp  --  172.16.0.0/16        0.0.0.0/0           tcp dpt:443 state NEW 

2    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:2256 

3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED 

4    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           

5    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           

6    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:80 

7    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 

Chain FORWARD (policy ACCEPT)

num  target     prot opt source               destination         

1    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited 

Chain OUTPUT (policy ACCEPT)

num  target     prot opt source               destination         

[root@localhost ben.liu]# iptables-save

# Generated by iptables-save v1.4.7 on Sat Dec 24 17:24:57 2011

*filter

:INPUT ACCEPT [0:0]

:FORWARD ACCEPT [0:0]

:OUTPUT ACCEPT [44:5152]

-A INPUT -s 172.16.0.0/16 -p tcp -m tcp --dport 443 -m state --state NEW -j ACCEPT 

-A INPUT -p tcp -m state --state NEW -m tcp --dport 2256 -j ACCEPT 

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

-A INPUT -p icmp -j ACCEPT 

-A INPUT -i lo -j ACCEPT 

-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT 

-A INPUT -j REJECT --reject-with icmp-host-prohibited 

-A FORWARD -j REJECT --reject-with icmp-host-prohibited 

COMMIT

# Completed on Sat Dec 24 17:24:57 2011

----------

查看iptables 启动的规则文件:

[root@localhost ben.liu]# cat /etc/sysconfig/iptables

# Firewall configuration written by system-config-firewall

# Manual customization of this file is not recommended.

*filter

:INPUT ACCEPT [0:0]

:FORWARD ACCEPT [0:0]

:OUTPUT ACCEPT [0:0]

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

-A INPUT -p icmp -j ACCEPT

-A INPUT -i lo -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT

-A INPUT -j REJECT --reject-with icmp-host-prohibited

-A FORWARD -j REJECT --reject-with icmp-host-prohibited

COMMIT

---

关闭禁止、允许随系统启动/启动/重启/   iptables服务  

[root@localhost ben.liu]# service iptables stop

iptables: Flushing firewall rules:                         [  OK  ]

iptables: Setting chains to policy ACCEPT: filter          [  OK  ]

iptables: Unloading modules:                               [  OK  ]

[root@localhost ben.liu]# chkconfig --level 35 iptables off

[root@localhost ben.liu]# chkconfig --level 35 iptables on

[root@localhost ben.liu]# service iptables start

iptables: Applying firewall rules:                         [  OK  ]

[root@localhost ben.liu]# service iptables restart

iptables: Flushing firewall rules:                         [  OK  ]

iptables: Setting chains to policy ACCEPT: filter          [  OK  ]

iptables: Unloading modules:                               [  OK  ]

iptables: Applying firewall rules:                         [  OK  ]



阅读(1762) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~