roach57
Python,Linux,运维自动化,Shell

导航

 

---恢复内容开始---

iptables

防火墙的规则设置最好的设置流程是,将防火墙规则写入到配置文件中,然后通过#iptables-restore读取,
这样可以避免防火墙设置错误和防火墙规则混乱;

一.iptables—语法:

iptables [-t 要操作的表] <操作命令> [要操作的链] [规则号码] [匹配条件] [-j 匹配后的动作]
                 小写      大写        大写                   小写           大写
 

            导出规则:

            导入规则:

配置文件:
/etc/sysconfig/iptables
 
保存规则:
#iptables-save //默认保存的位置是/etc/sysconfig/iptables
读取规则:
#iptables-restore /etc/sysconfig/iptables
 
保存:iptables-save
iptables-save [-c[-表名]
-c:保存包和字节计数器的值。可以使在重启防火墙后不丢失对包和字节的统计
-t:用来保存哪张表的规则,如果不跟-t参数则保存所有的表
可以使用重定向命令来保存这些规则集
iptables-save /etc/iptables-save
恢复:iptables-restore
iptables-restore [-c[-n]
-c:如果加上-c参数则表示要求装入包和字节计数器
-n:表示不覆盖己有的表或表内的规则,默认情况下是清除所有己存在的规则
            iptables-restore /etc/iptables-save
 
 

 

 

二、iptables—常用命令:

——————————————————————————-

            【临时/永久】开启防火墙和selinux

#/etc/init.d/iptables [start/stop] //(开启/关闭)防火墙
#chkconfig iptables off //不随机开启防火墙
#chkconfig iptables on //随机开启防火墙
 
#vim /etc/sysconfig/selinux //永久关闭selinux(重启生效)
SELINUX=disabled
#setenforce 0
//临时关闭selinux(立即生效)
    #只要防火墙打开,进入计算机的信息都必须经过防火墙的过滤,除非防火墙关闭;
    #内网的ip地址在外网是不生效的
 
    内核态:netfilter 防火墙
    用户态:iptables 管理防火墙的工具
 
#iptables –help//常看帮助
#iptables -L//查看防火墙规则
        #iptables -L -n                                //这看查看会比较快 加-n:以数字形式显示
#iptables -F //默认是清空filter表的规则;
#iptables -t nat -F         //清空nat表的规则链
#iptables -t nat -vnL //查看nat表的规则链
#iptables -t mangle -vnL //查看mangle表的规则链
#iptables -t filter -vnL         //查看filter表的规则链
#iptables -t raw -vnL //查看raw表的规则链
#iptables -t nat -vnL –line         //并且显示行号
#iptables -t filter -D INPUT 3 //删除filter表INPUT第三条规则
#iptables -t filter -F INPUT         //清空filter表中的INPUT链
#iptables -t nat -F POSTROUTING //清空nat表中的POSTROUTING链
#iptables -P INPUT DROP //将filter表的INPUT的默认规则设置成为DROP
#iptables -R INPUT 3 -j DROP//将fitler表的INPUT的第三个规则设置成为DROP
        #ntsysv                                            //开机后自启动防火墙的设定
 
凡是写到自定义链里的规则默认不会生效,【只有自定链可以改名】

        # iptables -N mydefine                 //定义自定义链

        # iptables -A INPUT -j mydefine  //使用自定义链
        # iptables -E mydefine HELLO     //给自定义链改名
        # iptables -X mydefine                 //删除自定义链
 
            如何使用自定义链:
使用自定义链
#iptables -t filter -N Mylan1
#iptables -A FORWARD -s 192.168.1.0/24 -j Mylan1
#iptables -A FORWARD -d 192.168.1.0/24 -j Mylan1
#iptables -A Mylan1 -p icmp -j DROP
#iptables -A Mylan1 ...
 

三、四表五链:

——————————————————————————-
四表:raw—mangle—nat—filter【由左到右,优先级别越来越低】
 
     raw: 主要做连接追踪
mangle:对数据包进行修改,例如给数据包打标记MARK
       nat:  主要修改数据包的地址,例如源地址或目标地址
     filter:  实现对数据包的过滤
 
五链:POSTROUTING—INPUT—FORWARD—OUTPUT—PREROUTING
[这个可以通过#iptables -t [raw|mangle|nat|filter] -vnL    //查看都可以应到到哪几个表上]
                    1.PREROUTING     (路由前)
2.INPUT                (数据包流入口)
3.FORWARD         (转发管卡)
4.OUTPUT             (数据包出口)
5.POSTROUTING (路由后)
 
对于filter来讲一般只能做在3个链上:INPUT ,FORWARD ,OUTPUT
对于nat来讲一般也只能做在3个链上:PREROUTING ,OUTPUT ,POSTROUTING
而mangle则是5个链都可以做:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
 

四、语法详解:

——————————————————————————-

图形1


                            因为mangle很少使用,简化后如下:

图形2

 
1、操作表:
-t raw
-t mangle
-t nat
-t filter 这个表示默认的,如果是设置数据包的过滤,这个可以省略不写
 
 
2、操作命令:【 后面跟链 或 自定义链 】
                            列表查看规则:
-L     //查看防火墙规则,v详细,n不反解 --line-numbers,-vnL,-nL,-vL
-v     //查看接收的包的个数,需要和-L连用,且需要放在L前面
-vvv //越多越详细
-//显示包和字节计数器的精确值,不做单位换算,这个命令需要和-L联合起来才
                         能使用;
--line-numbers //显示规则的行号
-n     //显示对应的端口
 
                            设置规则内容:
-A     //追加,放置最后一条
-I     //插入,默认是插入成第一条
-P     //设置指定链的默认规则
-R     //修改或替换指定位置或内容的规则
                            清除规则:
-D     //删除指定位置的内容和规则
-F     //清空规则链内的所有规则
                            自定义规则链:
-N     //设定用户自定义链
-E     //给自定义链改名
-X     //删除指定的用户自定义链,这个链必须没有被引用,如果被引用,
                          在删除之前你必须删 除或者替换与之有关的规则
 
                            其他:
-Z     //计数器归零
-C     //修改规则
     -h              //查看iptables的帮助信息
 
3、操作的链:
POSTROUTING
INPUT
FORWARD
OUTPUT
PREROUTING
 
4、规则号码:
5、匹配条件:
           指定协议不一定需要指定端口,但是指定端口就必须指定协议:
                           通用匹配:
协议匹配:【常用的协议包括tcpudpicmp
-p tcp|udp|icmp
 
地址匹配:【地址可以是单个IP地址、网络地址(带掩码)】
-s IP
-d IP
 
接口匹配:【分别指定接收、发送数据包的网络接口】
-i lo|eth0
-o lo|eth0
 
                            隐含匹配:【需要指定协议】
端口匹配: 【采用“端口1:端口2 ”的形式可以指定一个范围的端口,最多指定15个端口】
–sport port //源端口 
–dport prot //目标端口
 
TCP标记匹配: 【】
–sport port //源端口 

 

–dport prot //目标端口
          –sports port1,port2 //源端口
–dports port1,port2 //目标端口
--tcp-flags SYN,RST,ACK SYN //表示检查SYN、RST、ACK这三个标记,只有SYN为1时满足
等价于 --syn
总共的类型包括: SYN| ACK| FIN| RST| URG| PSH| ALL |NONE
 
UDP标记匹配: 【】
–sport port //源端口 
–dport port //目标端口
–sports port1,port2 //源端口
–dports port1,port2 //目标端口

 

ICMP类型匹配:【echo-request(8)(请求回显),echo-reply(0)(响应的数据包)】
--icmp-type [Echo-Request|Echo-Reply]    // icmp请求和icmp回复;
 
例子:
禁止别人 ping 服务器,但允许服务器往外 ping #iptables -A OUTPUT -p icmp –icmp-type echo-request -j DROP     //拒绝ping的请求回显 #iptables -A INPUT -p icmp –icmp-type echo-reply -j ACCEPT      //允许响应的数据包
                
                #iptables -A OUTPUT -p icmp –icmp-type 8 -j ACCEPT             //允许ping的请求回显             #iptables -A INPUT -p icmp –icmp-type 0 -j ACCEPT             //允许响应的数据包
 
                            显示匹配:
数据包限制:【limit 功能可以指定单位时间内匹配的平均数据包个数】
-m limit --limit 3/second 3/minute 3/hour 3/day 指定时间间隔,或者使用缩写,所以3/second等于3/s.
-m connlimit –connlimit-above //限制链接数 
 
例子1:
#iptables -A INPUT -p tcp --syn -m limit --limit 5/s -i eth0 -j ACCEPT
你可以扩展这个 iptables  limit 功能,来降低遭受拒绝服务攻击的可能。
这里是一个靠限制 秒钟最多5 TCP  syn 连接来防范 SYN 洪水攻击。
 
例子2:
--limit-burst //指定最开始的峰值 #iptables -A INPUT -p tcp -m limit --limit-burst 8 --limit 3/minute -j ACCEPT 
最开始最多8个包,然后每分钟内最多允许通过3个包
 
          例子3:
–connlimit-above n //限制为n个
#iptables -I FORWARD -p tcp -m connlimit –connlimit-above 9 -j DROP  
#表示限制链接数最大为9个
 
MARK数据包标记:【匹配是否有被标记的数据包,且标记的编码与该规则设置的编码对应则被该规则处理,编码不超过4294967296】
-m mark –mark number
 
例子:
#iptables -t mangle -A INPUT -m mark –mark 1 -j DROP
#查看是否有被标记为1的数据包,如果有则丢弃;

 
MAC地址匹配:【仅仅对 PREROUTING  INPUT 链起作用】
-m mac --mac-source MAC地址
 
例子:
#iptables -A INPUT -m mac --mac-source xx:xx:xx:xx:xx:xx -j DROP
将源MAC地址为xx:xx:xx:xx:xx:xx的包丢弃
 
多端口匹配:【多个端口之间使用逗号","分隔,连续的端口也可以使用冒号":"分隔】
-m multiport --sports --dports
 
例子:
#iptables -A INPUT -p tcp -m multiport --dports 20,21,25,110,1250:1280 -j ACCEPT
接收目标端口为20,21,25,110 1250~1280的数据包;
 
IP地址范围匹配:【以"-"符号链接起始IP地址、结束IP地址】
-m iprange --src-range --dst-range
 
例子:
#iptables -A FORWARD -p tcp -m iprange --src-range 192.168.1.20-192.168.1.99 -j DROP
将源IP在 20-99之间的数据包丢弃
 
根据UIDGID进行匹配:【仅仅对OUTPUT链起作用】
-m owner --uid-owner --gid-owner |--pid-owner
用户 群组 进程
 
例子:
#iptables -A OUTPUT -p tcp --dport 23 -m owner --uid-owner 500 -j REJECT //匹配用户
#iptables -A OUTPUT -p tcp --dport 23 -m owner --gid-owner 500 -j REJECT //匹配群组
#iptables -A OUTPUT -p tcp –dport 23 -m owner –pid-owner 78 -j REJECT //匹配进程  
 
根据关键字进行匹配:
    -m string –algo bm –string “关键字” -j REJECT
    #iptables -I FORWARD -m string –algo [bm|kmp] –string “/etc/passwd” -j REJECT
     #iptables -I FORWARD -m string –algo [bm|kmp] –string “qq” -j REJECT
 
数据包状态匹配:【总共有四种状态 NEW | ESTABLISHED | RELATED | INVALID】
-m state --state NEW | ESTABLISHED | RELATED
 
例子:
#iptables -A FORWARD -m state –state NEW -p tcp !–syn -j DROP
#iptables -A INPUT -p tcp -m state --state NEW -j DROP #iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j DROP
 
说明:
什么是状态检测?对于整个TCP协议来讲,它是一个有连接的协议, 三次握手中, 第一次握手,我们就叫NEW连接, 而从第二次握手以后的,ack都为1,这是正常的数据传输,和tcp的第二次第三次握手,叫做已建立的连接(ESTABLISHED), 还有一种状态,比较诡异的,比如:SYN=1 ACK=1 RST=1,对于这种我们无法识别的,我们都称之为INVALID无法识别的。 还有第四种,FTP这种古老的拥有的特征,每个端口都是独立的,21号和20号端口都是一去一回,他们之间是有关系的,
这种关系我们称之为RELATED。
NEW:
所指的是每一条连接中的第一个数据包
ESTABLISHED:
一旦连接看到两个方向上都有通信流,与此附加相关的其它包都被看作处于
ESTABLISHED 状态。
RELATED
实际上 RELATED 状态的数据包与“协议”无关, “只要回应回来的是因为本机先送出的一个数据包导致另一个连接的产生, 而这一条新连接上的所有数据包都是属于 RELATED 状态
的数据包” 
INVALID
状态包指不属于 ESTABLISHEDNEWRELATED 这三种,通常将其视为恶意的数据包而丢弃。
 
 
 
6、处理动作:
数据包处理方式:
 
针对filter表:
-j ACCEPT //允许-[有返回值]
-j DROP //丢弃-[无返回值]
-j REJECT //拒绝-[有返回值]
 
针对mangle表:
-j MARK     //将封包标上某个代号,以便提供作为后续过滤的条件判断依据,进行完此处理动作后,将会继续比对其它规则。
例子:
#iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 2
#将目标端口为22的TCP协议包标记为2
 
针对nat表:
-j SNAT     //源地址转换 SNAT 源地址转换-----出口POSTROUTING
作用:内网用户访问外网服务器
例子:
#iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 172.16.100.1
#将所有192.168.10.0网段的IP在经过的时候全都转换成172.16.100.1这个假设出来的外网地址;源地址转换
 
-j DNAT     //目标地址转换 DNAT 目标地址转换-----进口PREROUTING
作用:外网用户访问内网服务器
例子:
#iptables -t nat -A PREROUTING -d 192.168.10.18 -p tcp --dport 80 -j DNAT --to-destination 172.16.100.2
#对192.168.10.18的TCP请求端口为80则转换成对目标地址172.16.100.2的请求;目标地址转换
 
-j MASQUERADE //源地址伪装(功能和SNAT类似,只是伪装的地址能够动态获得)
作用:内网用户访问外网服务器
例子:
#iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth0 -j MASQUERADE
#添加nat表,将源地址是 192.168.10.0/24 的数据包进行地址伪装成为eth0的IP出去。实现很好的动态SNAT地址转换;
我们都知道当我们使用联通或者电信上网的时候,一般它都会在每次你开机的时候随机生成一个外网的IP
意思就是外网地址是动态变换的。这时我们就要将外网地址换成 MASQUERADE(动态伪装):
它可以实现自动寻找到外网地址,而自动将其改为正确的外网地址;
 
-j REDIRECT
说明:重定向,主要用于端口重定向,将封包重新导向到另一个端口(PNAT),进行完此处理动作后,将会继续比对其它规则。
这个功能可以用来实作通透式porxy 或用来保护 web 服务器。
例子:
#iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
#访问80端口的TCP协议重定向到8080端口;
 
用户自定义链:【自定义链可以随意取名】
-Mylan1
 
例子:
使用自定义链
#iptables -t filter -N Mylan1
#iptables -A FORWARD -s 192.168.1.0/24 -j Mylan1
#iptables -A FORWARD -d 192.168.1.0/24 -j Mylan1
#iptables -A Mylan1 -p icmp -j DROP
#iptables -A Mylan1 ...
 
-j RETURN
RETURN:【匹配到RETURN的自定义链就返回到系统链中,接着匹配接下去的规则】
在自定义链执行完毕后使用返回,来返回系统链。
#iptables -A Mylan1 -j RETURN
 
 
 
 
其他:
LOG记录日志:
-j LOG
说明:Log会显示到messages里面,可以在syslog里面添加独立的kern对象日志
例子:
#iptables –A INPUT –p tcp --dport 22 –j LOG --log-level 5 --log-prefix "IPTABLES:"
--log-level :日志级别为5--log-prefix的前缀信息为“IPTABLES:”
对于为什么日志级别为5,可能参看#man syslog8种级别,这里面的日志级别要与iptables的--log-level 的日志级别要对应.
 
方法:记录 Log: 1、修改 /etc/syslog.conf 在尾部加入: … # Iptable log kern.warning /var/log/iptables.log 2、重启服务: … #/etc/init.d/iptables restart #/etc/init.d/syslog restart 3、加入规则 LOG: … #iptables -A INPUT -s 192.168.1.1 -m limit –limit 5/s –limit-burst 7 -j LOG –log-prefix “** ATTACK ** ” –log-level 4

# iptables -A INPUT -p tcp -d 192.168.0.253 –dport 22 -j LOG –log-level 5 –log-prefix “IPTABLES:”
#vi /etc/syslog.conf #cat /etc/syslog.conf |grep notice kern.=notice /var/log/firewall.log #man syslog |grep ‘<*>’ #include #include #include DEFAULT_MESSAGE_LOGLEVEL – 1 (6) unless the line starts with where ventional meaning of the loglevel is defined in as #define KERN_EMERG “<0>” /* system is unusable */ #define KERN_ALERT “<1>” /* action must be taken immediately */ #define KERN_CRIT “<2>” /* critical conditions */ #define KERN_ERR “<3>” /* error conditions */ #define KERN_WARNING “<4>” /* warning conditions */ #define KERN_NOTICE “<5>” /* normal but significant condition */ #define KERN_INFO “<6>” /* informational */ #define KERN_DEBUG “<7>” /* debug-level messages */ # service syslog restart # tail /var/log/firewall.log 注: 1)、首先确认你所要增加到LOG里面的数据包在之前没有丢弃过; 2)、然后确认在LOG前面没有ACCEPT的规则,有的话,把ACCEPT先删掉, 在加入到ACCEPT到LOG的后面(也就是先经过LOG,再经过ACCEPT,不然系统日志无法记录日志信息)。
MIRROR:
-j MIRROR
说明:镜射封包,也就是将来源 IP 与目的地 IP 对调后,将封包送回,进行完此处理动作后,将会中断过滤程序。
例子:
#iptables –A INPUT –p tcp --dport 22 -j MIRROR
 
 
QUEUE:
-j QUEUE
说明:中断过滤程序,将封包放入队列,交给其它程序处理。透过自行开发的处理程序,可以进行其它应用.
例子:计算联机费......等。
#iptables -A INPUT -p tcp --dport 80 -j QUEUE 这个规则的意思是linux将http服务的报文上送到用户层,而做这个工作的就是ip_queue。 ip_queue是一个处理QUEUE动作的一个模块。
 
 
 

五、打开路由转发功能:

——————————————————————————-
# sysctl -a |grep ip_forward
net.ipv4.ip_forward = 0
 
# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
 
# sysctl -p   立即生效
=========================================
临时开启路由转发机制:
echo 1 > /proc/sys/net/ipv4/ip_forward
 

六、丢包/延时模拟:

——————————————————————————-
丢包模拟:
模拟随机丢包率
iptables -A FORWARD -p icmp -m statistic --mode random --probability 0.31 -j REJECT //表示31%的丢包率
或者
-m random --average -j DROP 表示模拟丢掉5%比例的包
 
延时模拟:
设置延时 3s :
tc qdisc add dev eth0 root netem delay 3000ms
可以在 3000ms 后面在加上一个延时,比如 3000ms 200ms‘表示 3000ms ± 200ms ,延时范围 2800 – 3200 之间.

---恢复内容结束---

posted on 2015-12-07 15:44  roach57  阅读(971)  评论(0编辑  收藏  举报