欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

centos下iptables防火墙规则用法和概述

程序员文章站 2022-03-01 18:27:20
iptables是组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。在日常Linux运维工作中,经常会设置iptables防火墙规则,用来加固服务安全。 以下对ipt ......

   iptables是组成linux平台下的包过滤防火墙,与大多数的linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(nat)等功能。在日常linux运维工作中,经常会设置iptables防火墙规则,用来加固服务安全。

以下对iptables的规则使用做了总结性梳理:

iptables首先需要了解的:
1)规则概念
规则(rules)其实就是网络管理员预定义的条件,规则一般的定义为“如果数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间的信息 包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如tcp、udp、icmp)和服务类型(如http、ftp和smtp)等。
当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept),拒绝(reject)和丢弃(drop)等。配置防火墙的主要工作是添加,修改和删除等规则。
其中:
匹配(match):符合指定的条件,比如指定的 ip 地址和端口。
丢弃(drop):当一个包到达时,简单地丢弃,不做其它任何处理。
接受(accept):和丢弃相反,接受这个包,让这个包通过。
拒绝(reject):和丢弃相似,但它还会向发送这个包的源主机发送错误消息。这个错误消息可以指定,也可以自动产生。
目标(target):指定的动作,说明如何处理一个包,比如:丢弃,接受,或拒绝。
跳转(jump):和目标类似,不过它指定的不是一个具体的动作,而是另一个链,表示要跳转到那个链上。
规则(rule):一个或多个匹配及其对应的目标。

2)iptables和netfilter的关系: 
iptables和netfilter的关系是一个很容易让人搞不清的问题。很多的知道iptables却不知道 netfilter。其实iptables只是linux防火墙的管理工具而已,位于/sbin/iptables。真正实现防火墙功能的是 netfilter,它是linux内核中实现包过滤的内部结构。

3)iptables的规则表和链
表(tables):提供特定的功能,iptables内置了4个表,即filter表、nat表、mangle表和raw表,分别用于实现包过滤,网络地址转换、包重构(修改)和数据跟踪处理。
链(chains):是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一 条或数条规则。当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据 该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定 义的默认策略来处理数据包。

iptables采用“表”和“链”的分层结构,在linux中现在是四张表五个链。下面罗列一下这四张表和五个链(注意一定要明白这些表和链的关系及作用)。

centos下iptables防火墙规则用法和概述

规则表:
    1)filter表——三个链:input、forward、output
作用:过滤数据包 内核模块:iptables_filter.
    2)nat表——三个链:prerouting、postrouting、output
作用:用于网络地址转换(ip、端口) 内核模块:iptable_nat
    3)mangle表——五个链:prerouting、postrouting、input、output、forward
作用:修改数据包的服务类型、ttl、并且可以配置路由实现qos内核模块:iptable_mangle(别看这个表这么麻烦,咱们设置策略时几乎都不会用到它)
   4)raw表——两个链:output、prerouting
作用:决定数据包是否被状态跟踪机制处理 内核模块:iptable_raw

规则链:
   1)input——进来的数据包应用此规则链中的策略
   2)output——外出的数据包应用此规则链中的策略
   3)forward——转发数据包时应用此规则链中的策略
   4)prerouting——对数据包作路由选择前应用此链中的规则
(记住!所有的数据包进来的时侯都先由这个链处理)
   5)postrouting——对数据包作路由选择后应用此链中的规则
(所有的数据包出来的时侯都先由这个链处理)

管理和设置iptables规则:

centos下iptables防火墙规则用法和概述

centos下iptables防火墙规则用法和概述

4)iptables传输数据包的过程

centos下iptables防火墙规则用法和概述

   1)当一个数据包进入网卡时,它首先进入prerouting链,内核根据数据包目的ip判断是否需要转送出去。 
   2)如果数据包就是进入本机的,它就会沿着图向下移动,到达input链。数据包到了input链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包会经过output链,然后到达postrouting链输出。 
   3)如果数据包是要转发出去的,且内核允许转发,数据包就会如图所示向右移动,经过forward链,然后到达postrouting链输出。

如果还是不清楚数据包经过iptables的基本流程,再看下面更具体的流程图:

centos下iptables防火墙规则用法和概述

从图中可将iptables数据包报文的处理过程分为三种类型:
1)目的为本机的报文
报文以本机为目的地址时,其经过iptables的过程为:

1.数据包从network到网卡
2.网卡接收到数据包后,进入raw表的prerouting链。这个链的作用是在连接跟踪之前处理报文,能够设置一条连接不被连接跟踪处理。(注:不要在raw表上添加其他规则)
3.如果设置了连接跟踪,则在这条连接上处理。
4.经过raw处理后,进入mangle表的prerouting链。这个链主要是用来修改报文的tos、ttl以及给报文设置特殊的mark。(注:通常mangle表以给报文设置mark为主,在这个表里面,千万不要做过滤/nat/伪装这类的事情)
5.进入nat表的prerouting链。这个链主要用来处理 dnat,应该避免在这条链里面做过滤,否则可能造成有些报文会漏掉。(注:它只用来完成源/目的地址的转换)
6.进入路由决定数据包的处理。例如决定报文是上本机还是转发或者其他地方。(注:此处假设报文交给本机处理)
7.进入mangle表的 input 链。在把报文实际送给本机前,路由之后,我们可以再次修改报文。
8.进入filter表的 input 链。在这儿我们对所有送往本机的报文进行过滤,要注意所有收到的并且目的地址为本机的报文都会经过这个链,而不管哪个接口进来的或者它往哪儿去。
9. 进过规则过滤,报文交由本地进程或者应用程序处理,例如服务器或者客户端程序。

 

2)本地主机发出报文

数据包由本机发出时,其经过iptables的过程为:

1.本地进程或者应用程序(例如服务器或者客户端程序)发出数据包。
2.路由选择,用哪个源地址以及从哪个接口上出去,当然还有其他一些必要的信息。
3.进入raw表的output链。这里是能够在连接跟踪生效前处理报文的点,在这可以标记某个连接不被连接跟踪处理。
4.连接跟踪对本地的数据包进行处理。
5.进入 mangle 表的 output 链,在这里我们可以修改数据包,但不要做过滤(以避免副作用)。
6.进入 nat 表的 output 链,可以对防火墙自己发出的数据做目的nat(dnat) 。
7.进入 filter 表的 output 链,可以对本地出去的数据包进行过滤。
8.再次进行路由决定,因为前面的 mangle 和 nat 表可能修改了报文的路由信息。
9.进入 mangle 表的 postrouting 链。这条链可能被两种报文遍历,一种是转发的报文,另外就是本机产生的报文。
10.进入 nat 表的 postrouting 链。在这我们做源 nat(snat),建议你不要在这做报文过滤,因为有副作用。即使你设置了默认策略,一些报文也有可能溜过去。
11.进入出去的网络接口

 

3)转发报文

报文经过iptables进入转发的过程为:
1.数据包从network到网卡
2.网卡接收到数据包后,进入raw表的prerouting链。这个链的作用是在连接跟踪之前处理报文,能够设置一条连接不被连接跟踪处理。(注:不要在raw表上添加其他规则)
3.如果设置了连接跟踪,则在这条连接上处理。
4.经过raw处理后,进入mangle表的prerouting链。这个链主要是用来修改报文的tos、ttl以及给报文设置特殊的mark。(注:通常mangle表以给报文设置mark为主,在这个表里面,千万不要做过滤/nat/伪装这类的事情)
5.进入nat表的prerouting链。这个链主要用来处理 dnat,应该避免在这条链里面做过滤,否则可能造成有些报文会漏掉。(注:它只用来完成源/目的地址的转换)
6.进入路由决定数据包的处理。例如决定报文是上本机还是转发或者其他地方。(注:此处假设报文进行转发)
7.进入 mangle 表的 forward 链,这里也比较特殊,这是在第一次路由决定之后,在进行最后的路由决定之前,我们仍然可以对数据包进行某些修改。
8.进入 filter 表的 forward 链,在这里我们可以对所有转发的数据包进行过滤。需要注意的是:经过这里的数据包是转发的,方向是双向的。
9.进入 mangle 表的 postrouting 链,到这里已经做完了所有的路由决定,但数据包仍然在本地主机,我们还可以进行某些修改。
10.进入 nat 表的 postrouting 链,在这里一般都是用来做 snat ,不要在这里进行过滤。
11.进入出去的网络接口。

 

接下来说下iptables规则设置用法

1)iptables的基本语法格式

iptables [-t 表名] 命令选项 [链名] [条件匹配] [-j 目标动作或跳转]
说明:
表名、链名:用于指定iptables命令所操作的表和链;
命令选项:用于指定管理iptables规则的方式(比如:插入、增加、删除、查看等;
条件匹配:用于指定对符合什么样 条件的数据包进行处理;
目标动作或跳转:用于指定数据包的处理方式(比如允许通过、拒绝、丢弃、跳转(jump)给其它链处理。

 

2)iptables命令的管理控制选项

-a 在指定链的末尾添加(append)一条新的规则 
-d 删除(delete)指定链中的某一条规则,可以按规则序号和内容删除 
-i 在指定链中插入(insert)一条新的规则,默认在第一行添加 
-r 修改、替换(replace)指定链中的某一条规则,可以按规则序号和内容替换 
-l 列出(list)指定链中所有的规则进行查看(默认是filter表,如果列出nat表的规则需要添加-t,即iptables -t nat -l)
-e 重命名用户定义的链,不改变链本身 
-f 清空(flush) 
-n 新建(new-chain)一条用户自己定义的规则链 
-x 删除指定表中用户自定义的规则链(delete-chain) 
-p 设置指定链的默认策略(policy)
-z 将所有表的所有链的字节和数据包计数器清零 
-n 使用数字形式(numeric)显示输出结果 
-v 查看规则表详细信息(verbose)的信息 
-v 查看版本(version) 
-h 获取帮助(help)

 

3)防火墙处理数据包的四种方式accept 允许数据包通过
drop 直接丢弃数据包,不给任何回应信息
reject 拒绝数据包通过,必要时会给数据发送端一个响应的信息。
log在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则

4)iptables防火墙规则的保存与恢复
iptables-save把规则保存到文件中,再由目录rc.d下的脚本(/etc/rc.d/init.d/iptables)自动装载
使用命令iptables-save来保存规则。

一般用:
iptables-save > /etc/sysconfig/iptables
生成保存规则的文件/etc/sysconfig/iptables
也可以用:
service iptables save
它能把规则自动保存在/etc/sysconfig/iptables中

 

当计算机启动时,rc.d下的脚本将用命令iptables-restore调用这个文件,从而就自动恢复了规则。

5)iptables防火墙常用的策略梳理
设置默认链策略
ptables的filter表中有三种链:input, forward和output。
默认的链策略是accept,可以将它们设置成drop,如下命令就将所有包都拒绝了:

iptables -p input drop 
iptables -p forward drop 
iptables -p output drop

 

---------------------------------------------------------------------------------------------------------------------------
其实,在运维工作中最常用的两个规则就是白名单规则和nat转发规则:

1)白名单规则

在linux终端命令行里操作时,如果不是默认的filter表时,需要指定表;
如果在/etc/sysconfig/iptables文件里设置,就在对应表的配置区域内设置;
上面两种方式设置效果是一样的!

比如开通本机的22端口,允许192.168.1.0网段的服务器访问(-t filter表配置可以省略,默认就是这种表的配置)

iptables -a input -s 192.168.1.0/24 -p tcp -m state --state new -m tcp --dport 22 -j accept
或者
iptables -t filter -a input -s 192.168.1.0/24 -p tcp -m state --state new -m tcp --dport 22 -j accept

 

开通本机的80端口,只允许192.168.1.150机器访问(32位掩码表示单机,单机指定时可以不加掩码)

iptables -t filter -a input -s 192.168.1.150/32 -p tcp -m state --state new -m tcp --dport 80 -j accept
然后保存规则,重启iptables
service iptables save
service iptables restart

 

或者在/etc/sysconfig/iptables文件里设置如下(其实上面在终端命令行里设置并save和restart防火墙后,就会自动保存规则到/etc/sysconfig/iptables这个文件中的):

[root@bastion-idc ~]# cat /etc/sysconfig/iptables
......
*filter
:input accept [442620:173026884]
:forward accept [118911:23993940]
:output accept [8215384:539509656]
-a input -m state --state related,established -j accept 
-a input -p icmp -j accept 
-a input -i lo -j accept 
-a input -s 192.168.1.0/24 -p tcp -m state --state new -m tcp --dport 22 -j accept
-a input -s 192.168.1.150/32 -p tcp -m state --state new -m tcp --dport 80 -j accept

[root@bastion-idc ~]# service iptables restart

 

2)nat转发设置

比如访问本机(192.168.1.7)的8088端口转发到192.168.1.160的80端口;访问本机的33066端口转发到192.168.1.161的3306端口
准备工作:
本机打开ip_forword路由转发功能;192.168.1.160/161的内网网关要和本机网关一致!如果没有内网网关,就将网关设置成本机内网ip,并且关闭防火墙(防火墙要是打开了,就设置对应端口允许本机访问)

iptables -t nat -a prerouting -p tcp -m tcp --dport 8088 -j dnat --to-destination 192.168.1.160:80iptables -t nat -a postrouting -d 192.168.1.160/32 -p tcp -m tcp --sport 80 -j snat --to-source 192.168.1.7iptables -t filter -a input -p tcp -m state --state new -m tcp --dport 8088 -j accept

iptables -t nat -a prerouting -p tcp -m tcp --dport 33066 -j dnat --to-destination 192.168.1.161:3306iptables -t nat -a postrouting -d 192.168.1.161/32 -p tcp -m tcp --sport 3306 -j snat --to-source 192.168.1.7iptables -t filter -a input -p tcp -m state --state new -m tcp --dport 33066 -j accept

service iptables save
service iptables restart

或者在/etc/sysconfig/iptables文件里设置如下
[root@bastion-idc ~]# cat /etc/sysconfig/iptables
......
*nat
:prerouting accept [60:4250]
:input accept [31:1973]
:output accept [3:220]
:postrouting accept [3:220]
-a prerouting -p tcp -m tcp --dport 8088 -j dnat --to-destination 192.168.1.160:80    //prerouting规则都放在上面
-a prerouting -p tcp -m tcp --dport 33066 -j dnat --to-destination 192.168.1.161:3306
-a postrouting -d 192.168.1.160/32 -p tcp -m tcp --sport 80 -j snat --to-source 192.168.1.7   //postrouting规则都放在下面
-a postrouting -d 192.168.1.161/32 -p tcp -m tcp --sport 3306 -j snat --to-source 192.168.1.7
.....
*filter
:input accept [16:7159]
:forward accept [0:0]
:output accept [715:147195]
-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 8088 -j accept
-a input -p tcp -m state --state new -m tcp --dport 33066 -j accept
.....
[root@bastion-idc ~]# service iptables restart

[root@bastion-idc ~]# iptables -l             //列出设置的规则,默认列出的是filter表下的规则
[root@bastion-idc ~]# iptables -l -t nat      //如果列出nat表下规则,就加-t参数

 

--------------------------------------------------------------------------------------------------------------------------

删除input链的第一条规则

iptables -d input 1

 

拒绝进入防火墙的所有icmp协议数据包

iptables -i input -p icmp -j reject

 

允许防火墙转发除icmp协议以外的所有数据包

iptables -a forward -p ! icmp -j accept
说明:使用“!”可以将条件取反

 

拒绝转发来自192.168.1.10主机的数据,允许转发来自192.168.0.0/24网段的数据

iptables -a forward -s 192.168.1.11 -j reject 
iptables -a forward -s 192.168.0.0/24 -j accept
说明:注意一定要把拒绝的放在前面不然就不起作用了!

 

丢弃从外网接口(eth1)进入防火墙本机的源地址为私网地址的数据包

iptables -a input -i eth1 -s 192.168.0.0/16 -j drop 
iptables -a input -i eth1 -s 172.16.0.0/12 -j drop 
iptables -a input -i eth1 -s 10.0.0.0/8 -j drop

 

封堵网段(192.168.1.0/24),两小时后解封

# iptables -i input -s 10.20.30.0/24 -j drop 
# iptables -i forward -s 10.20.30.0/24 -j drop 
# at now 2 hours at> iptables -d input 1 at> iptables -d forward 1
说明:这个策略可以借助crond计划任务来完成,就再好不过了

 

只允许管理员从202.13.0.0/16网段使用ssh远程登录防火墙主机

iptables -a input -s 202.13.0.0/16 -p tcp -m tcp -m state --state new --dport 22  -j accept 
说明:这个用法比较适合对设备进行远程管理时使用,比如位于分公司中的sql服务器需要被总公司的管理员管理时

 

通常在服务器上会对某一服务端口的访问做白名单限制,比如(其他端口设置和下面一致):
运行本机的3306端口(mysql服务)被访问

iptables -a input -p tcp -m tcp -m state --state new --dport 3306 -j accept 
或者只运行本机的3306端口被192.168.1.0/24网段机器访问
iptables -a input -s 192.168.1.0/24 -p tcp -m tcp -m state --state new --dport 3306 -j accept

 

允许本机开放从tcp端口20-1024提供的应用服务

iptables -a input -p tcp -m tcp -m state --state new --dport 20:1024 -j accept

 

允许转发来自192.168.0.0/24局域网段的dns解析请求数据包

iptables -a forward -s 192.168.0.0/24 -p udp --dport 53 -j accept 
iptables -a forward -d 192.168.0.0/24 -p udp --sport 53 -j accept

 

屏蔽指定的ip地址
以下规则将屏蔽block_this_ip所指定的ip地址访问本地主机:

block_this_ip="x.x.x.x"
iptables -a input -i eth0 -s "$block_this_ip" -j drop
(或者仅屏蔽来自该ip的tcp数据包)
iptables -a input -i eth0 -p tcp -s "$block_this_ip" -j drop

 

屏蔽环回(loopback)访问

iptables -a input -i lo -j drop
iptables -a output -o lo -j drop

 

屏蔽来自外部的ping,即禁止外部机器ping本机

iptables -a input -p icmp --icmp-type echo-request -j drop
iptables -a output -p icmp --icmp-type echo-reply -j drop

 

屏蔽从本机ping外部主机,禁止本机ping外部机器

iptables -a output -p icmp --icmp-type echo-request -j drop
iptables -a input -p icmp --icmp-type echo-reply -j drop

 

禁止其他主机ping本机,但是允许本机ping其他主机(禁止别人ping本机,也可以使用echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all)

iptables -i input -p icmp --icmp-type echo-request -j drop 
iptables -i input -p icmp --icmp-type echo-reply -j accept 
iptables -i input -p icmp --icmp-type destination-unreachable -j accept

 

禁止转发来自mac地址为00:0c:29:27:55:3f的和主机的数据包

iptables -a forward -m mac --mac-source 00:0c:29:27:55:3f -j drop
说明:iptables中使用“-m 模块关键字”的形式调用显示匹配。咱们这里用“-m mac –mac-source”来表示数据包的源mac地址

 

允许防火墙本机对外开放tcp端口20、21、25、110以及被动模式ftp端口1250-1280

iptables -a input -p tcp -m multiport --dport 20,21,25,110,1250:1280 -j accept
注意:这里用“-m multiport --dport”来指定多个目的端口
iptables -a input -p tcp -m tcp -m multiport --dports 22,80,443,1250-1280 -m state --state new -j accept
也可以将这几个端口分开设置多行:
iptables -a input -p tcp -m tcp -m state --state new --dport 22 -j accept
iptables -a input -p tcp -m tcp -m state --state new --dport 80 -j accept
iptables -a input -p tcp -m tcp -m state --state new --dport 443 -j accept
iptables -a input -p tcp -m tcp -m state --state new --dport 1250:1280 -j accept

 

禁止转发源ip地址为192.168.1.20-192.168.1.99的tcp数据包

iptables -a forward -p tcp -m iprange --src-range 192.168.1.20-192.168.1.99 -j drop
说明:
此处用“-m iprange --src-range”指定ip范围
1)过滤源地址范围:
iptables -a input -m iprange --src-range 192.168.1.2-192.168.1.7 -j drop
2)过滤目标地址范围:
iptables -a input -m iprange --dst-range 192.168.1.2-192.168.1.7 -j drop
3)针对端口访问的过滤。下面表示除了192.168.1.5-192.168.1.10之间的ip能访问192.168.1.67机器的80端口以外,其他ip都不可以访问!
iptables -a input -d 192.168.1.67 -p tcp --dport 80 -m iprange --src-range 192.168.1.5-192.168.1.10 -j accept

 

禁止转发与正常tcp连接无关的非--syn请求数据包

iptables -a forward -m state --state new -p tcp ! --syn -j drop
说明:“-m state”表示数据包的连接状态,“new”表示与任何连接无关的

 

拒绝访问防火墙的新数据包,但允许响应连接或与已有连接相关的数据包

iptables -a input -p tcp -m state --state new -j drop 
iptables -a input -p tcp -m state --state established,related -j accept
说明:“established”表示已经响应请求或者已经建立连接的数据包,“related”表示与已建立的连接有相关性的,比如ftp数据连接等

 

防止dos攻击

iptables -a input -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j accept
-m limit: 启用limit扩展,限制速度。
--limit 25/minute: 允许最多每分钟25个连接
--limit-burst 100: 当达到100个连接后,才启用上述25/minute限制

--icmp-type 8 表示 echo request——回显请求(ping请求)。下面表示本机ping主机192.168.1.109时候的限速设置:
iptables -i input -d 192.168.1.109 -p icmp --icmp-type 8 -m limit --limit 3/minute --limit-burst 5 -j accept

 

允许路由
如果本地主机有两块网卡,一块连接内网(eth0),一块连接外网(eth1),那么可以使用下面的规则将eth0的数据路由到eht1:

iptables -a forward -i eth0 -o eth1 -j accept

 

iptables中可以灵活的做各种网络地址转换(nat)
网络地址转换主要有两种:snat和dnat
1)snat是source network address translation的缩写,即源地址目标转换。
比如,多个pc机使用adsl路由器共享上网,每个pc机都配置了内网ip。pc机访问外部网络的时候,路由器将数据包的报头中的源地址替换成路由器的ip,当外部网络的服务器比如网站web服务器接到访问请求的时候,它的日志记录下来的是路由器的ip地址,而不是pc机的内网ip,这是因为,这个服务器收到的数据包的报头里边的“源地址”,已经被替换了。所以叫做snat,基于源地址的地址转换

2)dnat是destination network address translation的缩写,即目标网络地址转换。
典型的应用是,有个web服务器放在内网中,配置了内网ip,前端有个防火墙配置公网ip,互联网上的访问者使用公网ip来访问这个网站。
当访问的时候,客户端发出一个数据包,这个数据包的报头里边,目标地址写的是防火墙的公网ip,防火墙会把这个数据包的报头改写一次,将目标地址改写成web服务器的内网ip,然后再把这个数据包发送到内网的web服务器上。这样,数据包就穿透了防火墙,并从公网ip变成了一个对内网地址的访问了。即dnat,基于目标的网络地址转换

以下规则将会把本机192.168.1.17来自422端口的流量转发到22端口,这意味着来自422端口的ssh连接请求与来自22端口的请求等效。

1)启用dnat转发
iptables -t nat -a prerouting -p tcp -d 192.168.1.17 --dport 422 -j dnat --to-destination 192.168.1.17:22
2)允许连接到422端口的请求
iptables -t filter -a input -p tcp -m tcp -m state --state new --dport 422 -j accept
3)保存规则
# service iptables save
# service iptables restart

 

假设现在本机外网网关是58.68.250.1,那么把http请求转发到内部的一台服务器192.168.1.20的8888端口上,规则如下:

iptables -t nat -a prerouting -p tcp -i eth0 -d 58.68.250.1 --dport 8888 -j dnat --to 192.168.1.20:80
iptables -a forward -p tcp -i eth0 -d 192.168.0.2 --dport 80 -j accept
iptables -t filter -a input -p tcp -m state --state new -m tcp --dport 80 -j accept
service iptables save
service iptables restart

 

或者或本机内网ip是192.168.1.10,那么把http请求转发到内部的一台服务器192.168.1.20的8888端口上,规则如下:
准备工作:本机打开ip_forword路由转发功能;192.168.1.20的内网网关要和本机网关保持一致!如果没有内网网关,就将网关地址设置成本机内网ip,并且关闭防火墙(防火墙要是打开了,就设置对应端口允许本机访问)

iptables -t nat -a prerouting -p tcp -m tcp --dport 20022 -j dnat --to-destination 192.168.1.150:22
iptables -t nat -a postrouting -d 192.168.1.150/32 -p tcp -m tcp --sport 22 -j snat --to-source 192.168.1.8
iptables -t filter -a input -p tcp -m state --state new -m tcp --dport 20022 -j accept
service iptables save
service iptables restart

 

masquerade,地址伪装,在iptables中有着和snat相近的效果,但也有一些区别:

1)使用snat的时候,出口ip的地址范围可以是一个,也可以是多个,例如:
     1)如下命令表示把所有10.8.0.0网段的数据包snat成192.168.5.3的ip然后发出去
iptables -t nat -a postrouting -s 10.8.0.0/255.255.255.0 -o eth0 -j snat --to-source 192.168.5.3
     2)如下命令表示把所有10.8.0.0网段的数据包snat成192.168.5.3/192.168.5.4/192.168.5.5等几个ip然后发出去
iptables -t nat -a postrouting -s 10.8.0.0/255.255.255.0 -o eth0 -j snat --to-source 192.168.5.3-192.168.5.5
这就是snat的使用方法,即可以nat成一个地址,也可以nat成多个地址。但是,对于snat,不管是几个地址,必须明确的指定要snat的ip!

 

假如当前系统用的是adsl动态拨号方式,那么每次拨号,出口ip192.168.5.3都会改变,而且改变的幅度很大,不一定是192.168.5.3到192.168.5.5范围内的地址。
这个时候如果按照现在的方式来配置iptables就会出现问题了,因为每次拨号后,服务器地址都会变化,而iptables规则内的ip是不会随着自动变化的,每次地址变化后都必须手工修改一次iptables,把规则里边的固定ip改成新的ip,这样是非常不好用的!

2)masquerade就是针对上述场景而设计的,它的作用是,从服务器的网卡上,自动获取当前ip地址来做nat。
比如下边的命令:

iptables -t nat -a postrouting -s 10.8.0.0/255.255.255.0 -o eth0 -j masquerade

 

如此配置的话,不用指定snat的目标ip了。
不管现在eth0的出口获得了怎样的动态ip,masquerade会自动读取eth0现在的ip地址然后做snat出去
这样就实现了很好的动态snat地址转换

再看看几个运维实例设置:
1)限制本机的web服务器在周一不允许访问;
     新请求的速率不能超过100个每秒;
     web服务器包含了admin字符串的页面不允许访问:
     web 服务器仅允许响应报文离开本机;
设置如下:
周一不允许访问

iptables -a input -p tcp --dport 80 -m time ! --weekdays mon -j accept
iptables -a output -p tcp --dport 80 -m state --state established -j accept

 

新请求速率不能超过100个每秒

iptables -a input -p tcp --dport 80 -m limit --limit 100/s -j accept

 

web包含admin字符串的页面不允许访问,源端口:dport

iptables -a input -p tcp --dport 80 -m string --algo bm --string 'admin' -j reject

 

web服务器仅允许响应报文离开主机,放行端口(目标端口):sport

iptables -a output -p tcp --dport 80 -m state --state established -j accept

 

2)在工作时间,即周一到周五的8:30-18:00,开放本机的ftp服务给 192.168.1.0网络中的主机访问;
    数据下载请求的次数每分钟不得超过 5 个;
设置如下:

iptables -a input -p tcp --dport 21 -s 192.168.1.0/24 -m time ! --weekdays 6,7 -m time --timestart 8:30 --timestop 18:00 -m connlimit --connlimit-above 5 -j accet

 

3)开放本机的ssh服务给192.168.1.1-192.168.1.100 中的主机;
     新请求建立的速率一分钟不得超过2个;
    仅允许响应报文通过其服务端口离开本机;
设置如下:

iptables -a input -p tcp --dport 22 -m iprange --src-rang 192.168.1.1-192.168.1.100 -m limit --limit 2/m -j accept
iptables -a output -p tcp --sport 22 -m iprange --dst-rang 192.168.1.1-192.168.1.100 -m state --state established -j accept

 

4)拒绝 tcp 标志位全部为 1 及全部为 0 的报文访问本机;

iptables -a input -p tcp --tcp-flags all all -j drop

 

5)允许本机 ping 别的主机;但不开放别的主机 ping 本机;

iptables -i input -p icmp --icmp-type echo-request -j drop 
iptables -i input -p icmp --icmp-type echo-reply -j accept 
iptables -i input -p icmp --icmp-type destination-unreachable -j accept
或者下面禁ping操作:
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

 

以上就iptables的常用用法