iptables的结构:iptables -> Tables -> Chains -> Rules. 简单地讲,tableschains组成,而chains又由rules组成。如下图所示。

说明: http://lesca.me/blog/wp-content/uploads/2012/03/iptables-table-chain-rule-structure.png

一、iptables的表与链  用我的话说是[45]

1. Filter

Filter表示iptables的默认表,因此如果你没有自定义表,那么就默认使用filter表,它具有以下三种内建链:

·       INPUT – 处理来自外部的数据。

·       OUTPUT – 处理向外发送的数据。

·       FORWARD – 将数据转发到本机的其他网卡设备上。

2. NAT

NAT表有三种内建链:

·       PREROUTING – 处理刚到达本机并在路由转发前的数据包。它会转换数据包中的目标IP地址(destination ipaddress),通常用于DNAT(destination NAT)

·       POSTROUTING – 处理即将离开本机的数据包。它会转换数据包中的源IP地址(source ipaddress),通常用于SNATsource NAT)。

·       OUTPUT – 处理本机产生的数据包。

3. Mangle

Mangle表用于指定如何处理数据包。它能改变TCP头中的QoS位。Mangle表具有5个内建链:

·       PREROUTING

·       OUTPUT

·       FORWARD

·       INPUT

·       POSTROUTING

4. Raw

Raw表用于处理异常,它具有2个内建链:

·       PREROUTING chain

·       OUTPUT chain

二、IPTABLES 规则(Rules)

·       Rules包括一个条件和一个目标(target)

·       如果满足条件,就执行目标(target)中的规则或者特定值。

·       如果不满足条件,就判断下一条Rules

目标值(Target Values

下面是你可以在target里指定的特殊值:

·       ACCEPT – 允许防火墙接收数据包

·       DROP – 防火墙丢弃包

·       LOG - /var/log/messages 文件中记录日志信息,然后传递给下一条规则。防火墙规定的匹配即停止的原则对LOG来说是一个例外。LOG是一种辅助动作,没有真正出来数据包。

·       REJECT – 防火墙拒绝数据包通过。并且给数据发送端一个回应的信息

 

三 、编写防火墙规则

基本语法、控制类型

iptables [-t 表名]  可以省略,默认是filter表 [管理选项](-I、-A、-D、-L)[链名](INPUT、OUTPUT、FORWARD)[匹配条件] [-j 控制类型]

一定要区分大小写    

例子:在filter表的INPUT链中插入规则,拒绝发给本机的使用ICMP协议的数据包

iptables -t filter -I INPUT -p icmp -j REJECT 

管理选项 -A 在指定的链的末尾追加一条新的规则 -I 在指定的链中插入一条规则。

例子:

在filter表的INPUT链的末尾追加一条防火墙规则

iptables -t filter -A INPUT -p tcp -j ACCEPT

-I

在filter表中插入第1条和第2条规则

iptables -I INPUT -p udp -j ACCEPT

iptabels -I INPUT 2 -p icmp -j ACCPET

查看规则列表

iptables -L INPUT --line-numbers

插入一条策略

    iptables -I INPUT 3 -p tcp--dport 22 -j ACCEPT

    注释:所有使用TCP协议并且目标端口是22的流量全部允许通过的顺序为3的策略

删除一条策略

    iptables -D INPUT 3

删除所有策略(临时生效)

    iptables -F 清除预设表filter链中的所有规则

  iptables -X 清除预设表filter使用者自定义的规则

iptables -n -F INPUT 查看删除后的效果

iptables -t nat -F

iptables -t mangle -F

 

开机后自启动防火墙的设定  命令行输入

 #ntsysv  

[root@host.jefflei.com ~]# ntsysv 

在gui中选上iptables后。确认

 设置chain(链)的策略  -P

iptables -P INPUT DROP

iptables -P FORWARD DROP

iptables -P OUTPUT DROP

3.屏蔽指定ip

有时候我们发现某个ip不停的往服务器发包,这时我们可以使用以下命令,将指定ip发来的包丢弃:

BLOCK_THIS_IP="x.x.x.x"iptables -A INPUT -i eth0 -p tcp -s "$BLOCK_THIS_IP" -j DROP

以上命令设置将由x.x.x.x ip发往eth0网口的tcp包丢弃。

 

4.配置服务项

利用iptables,我们可以对日常用到的服务项进行安全管理,比如设定只能通过指定网段、由指定网口通过SSH连接本机:

iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 --dport 22 -m state --state NEW,ESTABLESHED -j ACCEPT

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

若要支持由本机通过SSH连接其他机器,由于在本机端口建立连接,因而还需要设置以下规则:

iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 --dport 22 -m state --state ESTABLESHED -j ACCEPT

iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

类似的,对于HTTP/HTTPS(80/443)pop3(110)rsync(873)MySQL(3306)等基于tcp连接的服务,也可以参照上述命令配置。

 

对于基于udpdns服务,使用以下命令开启端口服务:

iptables -A OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT

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

 

5.网口转发配置

对于用作防火墙或网关的服务器,一个网口连接到公网,其他网口的包转发到该网口实现内网向公网通信,假设eth0连接内网,eth1连接公网,配置规则如下:

iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT

 

6.端口转发配置

对于端口,我们也可以运用iptables完成转发配置:

iptables -t nat -A PREROUTING -p tcp -d 192.168.102.37 --dport 422 -j DNAT --to 192.168.102.37:22

以上命令将422端口的包转发到22端口,因而通过422端口也可进行SSH连接,当然对于422端口,我们也需要像以上“4.配置服务项一节一样,配置其支持连接建立的规则。

 

7.DoS***防范

利用扩展模块limit,我们还可以配置iptables规则,实现DoS***防范:

iptables -A INPUT -p -tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT

--litmit25/minute 指示每分钟限制最大连接数为25

--litmit-burst100 指示当总连接数超过100时,启动 litmit/minute 限制

 

8.配置web流量均衡

我们可以将一台服务器作为前端服务器,利用iptables进行流量分发,配置方法如下:

说明: 复制代码

iptables -A PREROUTING -i eth0 -p tcp --dport 80 -m state --state NEW -m nth --counter 0 --every 3 --packet 0 -j DNAT --to-destination 192.168.1.101:80iptables -A PREROUTING -i eth0 -p tcp --dport 80 -m state --state NEW -m nth --counter 0 --every 3 --packet 0 -j DNAT --to-destination 192.168.1.102:80iptables -A PREROUTING -i eth0 -p tcp --dport 80 -m state --state NEW -m nth --counter 0 --every 3 --packet 0 -j DNAT --to-destination 192.168.1.103:80

说明: 复制代码

以上配置规则用到nth扩展模块,将80端口的流量均衡到三台服务器。

 

9.将丢弃包情况记入日志

使用LOG目标和syslog服务,我们可以记录某协议某端口下的收发包情况。拿记录丢包情况举例,可以通过以下方式实现。

首先自定义一个chain

iptables -N LOGGING

其次将所有接收包导入LOGGING chain中:

iptables -A INPUT -j LOGGING

然后设置日志前缀、日志级别:

iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables Packet Dropped: " --log-level 7

最后将包倒向DROP,将包丢弃:

iptables -A LOGGING -j DROP

另可以配置syslog.conf文件,指定iptables的日志输出。

禁止访问21端口(ftp)和80端口(web
iptables -A -i eth1 -p tcp --dprot 21 -j DROP

iptables之实现SNAT

说明: 131111113654131.jpg

1.开启路由转发功能

#echo 1 >/proc/sys/net/ipv4/ip_forward 
#sysctl -a | grep "ip_forward" 
显示“net.ipv4.ip_forward=1”即可表示成功开启,该方法只是临时有效,重启就会失效 
永久生效方式,则需要将“net.ipv4.ip_forwaed=1”写入/etc/sysctl.conf中,“sysctl -p”生效

2.配置iptablesSNAT规则
外网使用的是静态的ip

iptables -t  nat -A  POSTROUTING -s192.168.1.0/24 -o eth0  -j  SNAT --to-source 202.100.1.1 
语法: 
iptables -t nat -A POSTROUTING -s source_ip  -o  interface_output -jSNAT --to-source ip[-ip]:[port-port]

如果是动态获取ip+ADSL拨号则使用

iptables -t  nat -A POSTROUTING -s 192.168.1.0/24 -oppp0  -j MASQUERADE

www-server

yum  install -y  httpd 
echo "jeffery.com's home page" > /var/www/html/index.html 
service httpd start 
setenforce 0  ##
关闭selinux 
iptables -F    ##
做测试,防火墙可关闭

w2003只需要配置好ip地址和gw即可

测试:

说明: iptables之实现SNAT

 

iptables之实现DNAT

iptables -t  nat -A  PREROUTING -d 202.100.1.1 -p tcp --dport 80 -jDNAT --to-destination 192.168.1.1
DNAT中可以再发布时修改目标端口。为了提高安全
iptables -t  nat -A  PREROUTING -d 202.100.1.1 -p tcp --dport 8080 -jDNAT --to-destination 192.168.1.1:80