注释:文章中fg:为示例  红色标记的为命令

在上篇博文中详细讲解了iptables的原理及一些常用命令,这里在简要的说明一下:

Linux防火墙包含了2个部分,分别是存在于内核空间的(netfilter)和用户空间的(iptasbles);而iptables可以定义规则如:

filter:防火墙的核心所在,实现包过滤功能

nat:实现地址转换,(如:IP、PORT)

mangle:实现数据包的修改操作,如打标记、修改TTL等

raw:对数据包进行状态跟踪,不是很常用,不做过多解释

而它们的优先顺序为:   RAW--MANGLE--NAT--FILTER


在iptables中定义的防火墙规则要被传入到内核中的netfilterft才能生效;而在定义防火墙规则的时候一般有两种模式:一种是比较严格的,只允许匹配规则中定义的规则的数据包通过,而其余的数据包则全部阻止;另一种是比较宽松的,只阻止匹配规则中定义的规则的数据包,而其余的数据包则全部允许通过。而在企业应用中,一般情况下是使用的第一种,根据自己业务的需要只允许通过对应的数据包。

命令使用格式:

iptables命令语法格式: iptables [-t 表名] 管理选项 [链名] [条件匹配] [-j 目标动作或跳转]

注释: -t: 默认没有指定表是filter表,当然也可以指定mangle、nat、raw

管理选项:

-A:在规则尾部追加一条规则

-I [n]:在链的第一条或指定序号插入规则

-D [n]:删除指定序号的规则

-R [n]:修改指定序号的规则

-P:为规则链设置默认策略    fg:将INPUT链的默认策略改为DROP;iptables -t filter -p INPUT DROP

-N:新创建一条自定义链

-E:重命名自定义链名

-L:查看链中的所有规则,默认不指定链名是filter

-n:以数字形式显示IP、PORT,不会反向解析IP地址

-x:精确显示数据包大小,不做单位换算

-v:显示详细信息

--line-numbers:查看规则时显示规则序号

-X:删除用户自定义的空链

-Z:清空计数器

每条规则都会有两条计数器:

1、记录本条规则所匹配到的包的个数

2、记录匹配到本条规则的包的大小之和

-F:清空指定表中的所有规则

重启防火墙服务时,规则会被清空我们可以使用命令来保存到一个文件中,这样再重启防火墙时,会自动加载文件中保存的规则;文件默认路径:/etc/sysconfig/iptables

   [root@localhost~]service iptables save

   另一种方法可以把防火墙规则保存到一个指定的文件中,可以自己手动的导入规则,如下:

   [root@localhost~]# iptables-save /root/iptables        #将防火墙规则保存到/root/iptables文件中

   [root@localhost~]# iptables-resstore < /root/iptables  #将防火墙规则从/root/iptables文件中导入

条件匹配:

-s|--src|-source:[!] IP/NETWORK:源地址或网络    注:叹号表示取反

-d|--dst|--destination:[!] IP/NETWORK:目标地址或网络

-p:{tcp|udp|icmp}:指定协议类型

-i:input interface:指定数据包的进入接口

-o:output interface:指定数据包的外出接口

fg:禁止172.16.1.0/24的网络远程ssh连接172.16.14.1主机

iptables -A INPUT -s 172.16.1.0/24 -d 172.16.14.1 -p tcp --dport 22 -j DROP

扩展匹配:要使用"-m 扩展名称"来引用,而每个扩展模块一般都会有自己特有的专用选项,在这些选项中,有些是必备的;

隐含扩展:

-t:tcp    --sport(源端口)    --dport(目标端口)    --syn SYN标志位为1

--tcp-flags    SYN  ACK  RST  FIN   ALL代表所有标志位为1  NONE代表所有标志位为0

fg:允许访问172.16.14.1主机的WEB服务

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

iptables -A OUTPUT -s 172.16.14.1 -p tcp --sport 80 -j ACCEPT

-t: udp    --sport(源端口)    --dport(目标端口)

fg:本机DNS服务器,要为本地客户端做递归查询,iptables的INPUT、OUTPUT默认为DROP,本机地址:172.16.14.1

允许客户端查询:

iptables -A INPUT -d 172.16.14.1 -p udp --dport 53 -j ACCEPT

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

本机做递归查询:

iptables -A INPUT -s 172.16.14.1 -p udp --dport 53 -j ACCEPT

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

-p icmp    --icmp-type  类型:请求为:8  响应为:0

fg:本机地址为:172.16.14.1,能Ping 172.16.0.0/16网络中的所有主机

iptables -A OUTPUT -s 172.16.14.1 -d 172.16.0.0/16 -p icmp --icmp-type 8 -j ACCEPT

iptables -A INPUT -d 172.16.14.1 -s 172.16.0.0/16 -p icmp --icmp-type 0 -j ACCEPT

显式扩展:

-m state --state

NEW:已经或将启动新的连接

ESTABLISHED:已建立的连接

RELATED:正在启动新连接

INVALID:非法或无法识别的

fg:本机地址:172.16.4.1,允许所有地址访问本机的ftp服务;

注:确定ftp模块被装载 lsmod | grep nf_conntrack_ftp如果没有被装载使用modprobe装载模块:modprobe nf_conntrack_ftp

iptables -A INPUT -d 172.16.14.1 -p tcp --dport 21 -m state --state NEW -j ACCEPT

iptables -A INPUT -d 172.16.14.1 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -s 172.16.14.1 -m state --state ESTABLISHED,RELATED -j ACCEPT

-m mulitport:可以指定15个离散端口

--source-ports:源端口

--destination-ports:目标端口

--ports:指定端口

fg:本机地址:172.16.14.1,开放本机端口21、22、80

iptables -A INPUT -d 172.16.14.1 -p tcp -m mulitport --destination-ports 21,22,80 -m state --state NEW -j ACCEPT

-m iprange

--src-range:源端口范围

--dst-range:目标端口范围

fg:本机地址:172.16.14.1,拒绝172.16.1.10-172.16.1.100这些IP访问本机的ssh

iptables -A INPUT -m iprange --src-range 172.16.1.10-172.16.10.100 -d 172.16.14.1 -p tcp --dport 22 -j DROP

-m limit

--limit n/{second/minute/hour}:指定时间内的请求速率"n"为速率,后面为时间分别为:秒、分、时

--limit-burst [n]:在同一时间内允许通过的请求"n"为数字,不指定默认为5

fg:本机地址:172.16.14.1,允许172.16.0.0/16网络ping本机,但限制每分钟请求不能超过20,每次并发不能超过6个

iptables -A INPUT -s 172.16.0.0/16 -d 172.16.14.1 -p icmp --icmp-type 8 -m limit --limit 20/min --limit-burst 6 -j ACCEPT

iptables -A OUTPUT -s 172.16.14.1 -d 172.16.0.0/16 -p icmp --icmp-type 0 -j ACCEPT

connlimit

--connlimit-above [num]

-m string

--string "":过滤指定的字符串

--algo {bm|kmp}:过虑指定的算法

fg:本机地址:172.16.14.1,过滤访问本机网页包含"hello"字符串的页面

iptables -A INPUT  -d 172.16.14.1 -p tcp --sport 80 -m string --string "hello" --algo kmp -j REJECT

-m time

--datestart    --datestop:指定起始日期

--timestart    --timestop:指定开始和结束时间

--weekdays:周可以指定每周几,周一到周日可以使用"1-7"

--monthdays:月可以指定每个月的哪几天

fg:在工作时间,即周一到周五的9:30-18:00,开放本机的ftp服务给172.16.0.0/16网络中的主机访问,本机地址172.16.14.1;数据下载请求的次数每分钟不得超过5个

iptables -A INPUT -s 172.16.0.0/16 -d 172.16.14.1 -p tcp --dport 21 -m time --weekdays Mon,Tue,Wed,Thu,Fri --timestart 09:30 --timestop 18:00 -j ACCEPT

iptables -A INPUT -s 172.16.0.0/16 -d 172.16.14.1 -p tcp -m state --state RELATED -m limit --limit 5/min -j ACCEPT

fg:开放本机的ssh服务给172.16.1.1-172.16.1.100中的主机访问本机,本机地址:172.16.14.1,新请求建立的速率一分钟不得超过2个;仅允许响应报文通过其服务端口离开本机

iptables -A INPUT -m iprange --src-range 172.16.1.1-172.16.1.100 -m limit --limit 2/min -p tcp --dport 22 -d 172.16.100.1 -i eth0 -m state --state NEW -j ACCEPT

fg:拒绝TCP标志位全部为1及全部为0的报文访问本机,我们新建一个自定义链

iptables -N clean_in

iptables -A clean_in -p tcp --tcp-flags ALL ALL -j DROP

iptables -A clean_in -p tcp --tcp-flags ALL NONE -j DROP

iptables -A clean_in -d 172.16.100.1 -j RETURN

iptables -I INPUT 1 -d 172.16.100.1 -j clean_in


DNAT与SNAT

SNAT:源地址转换,代理内部客户端访问外部网络

目标地址不变,重新改写源地址,并在本机建立NAT表项,当数据返回时,根据NAT表将目的地址数据改写为数据发送出去时候的源地址,并发送给主机,目前基本都是解决内网用户用同一个公网IP地址上网的情况

DNAT:目标地址转换,将内部服务器发布至外部网络

和SNAT相反,源地址不变,重新修改目标地址,在本机建立NAT表项,当数据返回时,根据NAT表将源地址修改为数据发送过来时的目标地址,并发给远程主机在DNAT的基础上,可以根据请求数据包的端口做PNAT(端口转换,也称为端口映射),可以根据请求数据包不同的端口改写不同的目标地址,从而发送给不同的主机这在用一个公网地址做不同服务时用的比较多,而且相对来说,用NAT的方式可以隐藏后端服务器的真实地址,比较安全

在这张图中,完成了NAT的实现,数据要经过PREROUTING-->FORWARD-->POSTROUTING这三个链

SNAT的数据流向过程

首先进入PREROUTING,发现不是本网段的地址,而后开始查找路由表(查找路由的过程在PREROUTING和FORWARD之间),于是经过FORWARD链进行转发,在通过POSTROUTING时进行NAT转换。在这个流程中,NAT转换的步骤在POSTROUTING链上实现,之所以不再PREROUTING上做NAT是因为数据包在进来之前,还不知道是本网段地址还是外网地址

DNAT的数据流向过程

在DNAT中,NAT要在PREROUTING链上做。在数据进入主机后,路由选择过程是在PREROUTING和FORWARD之间的,所以应该先做地址转换之后再进行路由选择,而后经过FORWARD链,最后从POSTROUTING链出去

下面我们通过一个案例来讲解DNAT与SNAT:

这里三台计算机都使用的VMware来实现,系统都是CentOS6.4_x86_64,PC1与NAT的eth0网卡为VMnet3,NAT的eth1与PC2的网卡为VMnet2

PC1地址: 网关指向:172.16.14.254

[root@localhost~]route add default gw 172.16.14.254

NAT服务器地址:

PC2地址:

SNAT的实现:

在我们做NAT之前,首先要把NAT服务器的路由功能打开,不然数据包过不了FORWARD链

1
2
3
4
5
6
[root@localhost~]# sysctl -w net.ipv4.ip_forward=1
######也可以使用文件永久生效,下面值改为1即可
[root@localhost~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
######执行如下命令让其生效
[root@localhost~]# sysctl -p

在NAT服务器添加iptables规则如:

iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -j SNAT --to-source 192.168.1.254

注释:在POSTROUTING链上面,将来自源地址为172.16.0.0/16网段的数据包的源地址都转换为192.168.1.254

查看iptables规则:

下面我们在PC1上做测试,PC1现在就可以Ping通PC2主机了,如下图:

PC1 ping PC2在PC2主机上抓包来测试:

DNAT的实现:

fg:在NAT服务器添加iptables规则如:

iptables -t nat -A PREROUTING -d 192.168.1.254 -j DNAT --to-destination 172.16.14.1

注释:在PREROUTING链上面,将请求地址192.168.1.254的数据包全部转发到172.16.14.1主机上

查看iptables规则:

测试:PC1上面做了WEB服务,我们在PC2上看是否能请求到WEB页面:

fg:在NAT服务器添加iptables规则如:

iptables -t nat -A PREROUTING -d 192.168.1.254 -p tcp --dport 22 -j DNAT --to-destination 172.16.14.1

注释:此条规则是将所有请求192.168.1.254地址的22号端口都转发到172.16.14.1主机上

查看iptables规则:

在PC2主机上面远程连接NAT服务器eth1接口测试如下图:

fg:在NAT服务器添加iptables规则如:

iptables -t nat -A PREROUTING -d 192.168.1.254 -p tcp --dport 80 -j DNAT --to-destination 172.16.14.1:8080

注释:此条规则是将所有请求192.168.1.254地址的80号端口都转发到172.16.14.1主机上8080端口,当然前提必须在PC1上面监听8080端口

查看iptables规则:

在PC2主机上面远程连接NAT服务器eth1接口的80端口测试如下图:

我们在想一个问题,上面做的NAT都是基于静态IP地址来实现的,如果用的是ADSL动态获取的IP地址那么我们该怎么办呢,总不能看看获取到什么IP地址就手动的修改一下防火墙规则吧,那样岂不是很麻烦吗?下面我们来说明怎么基于动态IP地址来做NAT代理内部客户端来上网

fg:如果IP地址是动态获取的ADSL宽带来做NAT代理上网实现方式

iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -o eth1 -j MASQUEREADE

注释:这里最好使用"-o"选项来指定出口,MASQUEREADE会自动调用该接口的地址作为源地址出去;这里由于网络原因,就不在做测试了

  到此iptables的基本配置告一段落,如果有哪地方不理解可以留言。下一篇博文将会讲解编译内核来实现iptables的layer7实现7层访问过滤;可以实现控制QQ、迅雷、酷狗等应用程序的网络访问,当然也可以实现控制网络协议如:HTTP、FTP等...

iptables基本规则配置(二)的更多相关文章

  1. Linux学习笔记 --iptables防火墙配置

    iptables防火墙配置 一.防火墙简介 1.功能: 1)通过源端口,源IP地址,源MAC地址,包中特定标记和目标端口,IP,MAC来确定数据包是否可以通过防火墙 2)分割内网和外网[附带的路由器的 ...

  2. iptables防火墙配置

    iptables防火墙配置 一.防火墙简介 1.功能: 1)通过源端口,源IP地址,源MAC地址,包中特定标记和目标端口,IP,MAC来确定数据包是否可以通过防火墙 2)分割内网和外网[附带的路由器的 ...

  3. CentOS防火墙iptables的配置方法详解

    CentOS系统也是基于linux中的它的防火墙其实就是iptables了,下面我来介绍在CentOS防火墙iptables的配置教程,希望此教程对各位朋友会有所帮助. iptables是与Linux ...

  4. Maven 工程下 Spring MVC 站点配置 (二) Mybatis数据操作

    详细的Spring MVC框架搭配在这个连接中: Maven 工程下 Spring MVC 站点配置 (一) Maven 工程下 Spring MVC 站点配置 (二) Mybatis数据操作 这篇主 ...

  5. 【树莓派】iptables相关配置

    关于iptables的配置,参见官方资料:http://wiki.ubuntu.org.cn/IptablesHowTo 最好. 进入iptables # sudo iptables -L 列出目前的 ...

  6. SpringMVC常用配置(二),最简洁的配置实现文件上传

    Spring.SpringMVC持续介绍中,基础配置前面已经介绍了很多,如果小伙伴们还不熟悉可以参考这几篇文章: 1.Spring基础配置 2.Spring常用配置 3.Spring常用配置(二) 4 ...

  7. springboot区分开发、测试、生产多环境的应用配置(二)

    转:https://www.jb51.net/article/139119.htm springboot区分开发.测试.生产多环境的应用配置(二) 这篇文章主要给大家介绍了关于maven profil ...

  8. rsyslog 配置 二

    转自:https://www.cnblogs.com/cherishry/p/6775163.html rsyslog 配置 二 # rsyslog configuration file # For ...

  9. iptables简单配置

    iptables简单配置 分类: Linux 安全2010-10-20 16:56 4241人阅读 评论(0) 收藏 举报 input防火墙tcpfilterubuntuservice # iptab ...

随机推荐

  1. Initializing connection provider: org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider停住了

    2015.1.24进行了服务器的搬家,搬家后,更换了新的IP,导致新的IP访问以前IP的数据库服务无法成功Initializing connection provider: org.springfra ...

  2. python成长之路【第九篇】:网络编程

    一.套接字 1.1.套接字套接字最初是为同一主机上的应用程序所创建,使得主机上运行的一个程序(又名一个进程)与另一个运行的程序进行通信.这就是所谓的进程间通信(Inter Process Commun ...

  3. 锁相关知识 & mutex怎么实现的 & spinlock怎么用的 & 怎样避免死锁 & 内核同步机制 & 读写锁

    spinlock在上一篇文章有提到:http://www.cnblogs.com/charlesblc/p/6254437.html  通过锁数据总线来实现. 而看了这篇文章说明:mutex内部也用到 ...

  4. 【第1期】腾讯云的1001种玩法征集,Ipad mini和Kindle 等你拿!(文章评审中)

    版权声明:本文由阁主的小跟班原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/695994001482226944 来源:腾云 ...

  5. HTTP性能小测试

    一直说node.js如何如何好,就来测试一下吧~~ 首先接受一个小工具 Apache Bench简称ab 可以用来测试http性能 利用Apache Bench测试Web引擎性能关于此工具的详细介绍参 ...

  6. swiper横向轮播(兼容IE8)

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  7. 改造laravel的登录流程,仅使用一个token登录laravel

    背景:最近使用lavavel来改造目前的系统,但是之前的老系统还不能立马下线,这时就出现了双系统共存的状态,需要解决的一个问题就是一次登录2个系统. 第一步 修改中间件App\Http\Middlew ...

  8. 【转】Centos升级Python 2.7.12并安装pip、ipython

    Centos系统一般默认就安装有Python2.6.6版本,不少软件需要2.7以上的,通过包管理工具安装不了最新的版本,通过源码编译可以方便安装指定版本,只需要把下面版本的数字换成你想要的版本号. 1 ...

  9. 根据UUID和MD5, 生成可以用作Token的字符串

    import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util. ...

  10. C#基础总结

    1.执行.NET应用程序时经历的几个步骤 用C#编写应用程序代码 把应用程序代码编译为中间语言代码(MSIL),存储在程序集中 使用JIT编译器将MSIL编译为本机代码 在托管的公共语言运行库(CLR ...