天天看点

iptables基本知识

1)Linux下的防火墙概念

a、一般谈到Linux下的防火墙,我们都会首先想到iptables,其实更确切的叫法应该是Netfilter/iptables,iptables和Netfilter其实是存在差别的。

b、尽管它们经常被用来相互替换使用,Netfilter是用来实现Linux内核中防火墙的Linux内核空间程序代码段,它要么被直接编译进内核,要么被包含在模块中。

c、而iptables是用来管理Netfilter防火墙的用户程序,而我这里提到的iptables是包含Netfiler和iptables。

d、Netfilter/iptables是基于包过滤的防火墙,主要是针对2-4层,另外,iptables也支持7层控制。

2)iptables的组成部分:

iptables有四个表和五个链以及一些规则组成:

四个表:filter、nat、mangle、raw

filter表(过滤规则表),nat表(地址转换规则表),mangle(修改数据标记位规则表),raw(跟踪数据表规则表)

其中最常用的是filter表以及nat表

五个链:INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING

iptables的命令语法:

iptables [-t 表名]<-A|-I|-D|-R>链名[规则编号][-i|-o 网卡名称][-p 协议类型][-s 源IP地址|源子网][--sport 源端口号][-d 目标IP地址|目标子网][--dport 目标端口号]<-j 动作>

3)参数及动作信息

-A 追加防火墙规则

-D 删除防火墙规则

-I 插入防火墙规则

-F 清空防火墙规则

-L 列出防火墙规则

-R 替换防火墙规则

-Z 清空防火墙数据表统计信息

-P 设置链默认规则

匹配参数:

-p         匹配协议

-s 匹配源地址

-d 匹配目标地址

-i   匹配入站网卡接口

-o 匹配出站网卡接口

--sport  匹配源端口

--dport 匹配目标端口

--src-range  匹配源地址范围

--dst-range  匹配目标地址范围

--limit 匹配数据表速率

--mac-source 匹配源MAC地址

--state 匹配状态(INVALID、ESTABLISHED、NEW、RELATED)

--string 匹配应用层字串

触发动作:

ACCEPT 允许数据包通过

DROP 丢弃数据包

REJECT 拒绝数据包通过,并发回封包通知对方

LOG 将数据包信息记录syslog日志

DNAT 目标地址转换

SNAT 源地址转换(适用于静态IP)

MASQUERADE 地址欺骗(只能用于ADSL拨号上网的IP伪装,也就是主机的IP是由ISP分配动态的)

REDIRECT 重定向,将数据包重定向到本机或另外主机的某一个端口,通常能实现透明代理或者对外开放内网的某些服务

4)常用的命令

a、查看filter表的所有规则:

<code>[root@localhost ~]</code><code># iptables -n -L</code>

<code>Chain INPUT (policy ACCEPT)</code>

<code>target     prot opt </code><code>source</code>               <code>destination         </code>

<code>Chain FORWARD (policy ACCEPT)</code>

<code>Chain OUTPUT (policy ACCEPT)</code>

<code>target     prot opt </code><code>source</code>               <code>destination</code>

b、清空filter表的所有规则:

<code>[root@localhost ~]</code><code># iptables -F</code>

c、查看nat表的所有规则:

<code>iptables -t nat -n -L</code>

# 记录10.10.10.1访问主机80端口的日志信息(/var/log/messages)

<code>[root@localhost ~]</code><code># iptables -I INPUT -s 10.10.10.1 -p tcp --dport 80 -j LOG</code>

<code>[root@localhost ~]</code><code># tail -10 /var/log/messages</code>

<code>Jul 13 14:44:53 localhost kernel: IN=eno16777736 OUT= MAC=00:0c:29:c5:a0:8d:00:50:56:c0:00:08:08:00 SRC=10.10.10.1 DST=10.10.10.133 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=10253 DF PROTO=TCP SPT=62700 DPT=80 WINDOW=253 RES=0x00 ACK FIN URGP=0 </code>

<code>Jul 13 14:44:55 localhost chronyd[829]: Selected </code><code>source</code> <code>202.118.1.130</code>

<code>Jul 13 14:44:59 localhost kernel: IN=eno16777736 OUT= MAC=00:0c:29:c5:a0:8d:00:50:56:c0:00:08:08:00 SRC=10.10.10.1 DST=10.10.10.133 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=10256 DF PROTO=TCP SPT=62701 DPT=80 WINDOW=256 RES=0x00 ACK FIN URGP=0 </code>

<code>Jul 13 14:44:59 localhost kernel: IN=eno16777736 OUT= MAC=00:0c:29:c5:a0:8d:00:50:56:c0:00:08:08:00 SRC=10.10.10.1 DST=10.10.10.133 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=10257 DF PROTO=TCP SPT=62702 DPT=80 WINDOW=256 RES=0x00 ACK FIN URGP=0 </code>

<code>Jul 13 14:44:59 localhost kernel: IN=eno16777736 OUT= MAC=00:0c:29:c5:a0:8d:00:50:56:c0:00:08:08:00 SRC=10.10.10.1 DST=10.10.10.133 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=10258 DF PROTO=TCP SPT=62703 DPT=80 WINDOW=256 RES=0x00 ACK FIN URGP=0 </code>

<code>Jul 13 14:44:59 localhost kernel: IN=eno16777736 OUT= MAC=00:0c:29:c5:a0:8d:00:50:56:c0:00:08:08:00 SRC=10.10.10.1 DST=10.10.10.133 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=10259 DF PROTO=TCP SPT=62704 DPT=80 WINDOW=256 RES=0x00 ACK FIN URGP=0 </code>

<code>Jul 13 14:44:59 localhost kernel: IN=eno16777736 OUT= MAC=00:0c:29:c5:a0:8d:00:50:56:c0:00:08:08:00 SRC=10.10.10.1 DST=10.10.10.133 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=10260 DF PROTO=TCP SPT=62701 DPT=80 WINDOW=256 RES=0x00 ACK URGP=0 </code>

<code>Jul 13 14:44:59 localhost kernel: IN=eno16777736 OUT= MAC=00:0c:29:c5:a0:8d:00:50:56:c0:00:08:08:00 SRC=10.10.10.1 DST=10.10.10.133 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=10261 DF PROTO=TCP SPT=62702 DPT=80 WINDOW=256 RES=0x00 ACK URGP=0 </code>

<code>Jul 13 14:44:59 localhost kernel: IN=eno16777736 OUT= MAC=00:0c:29:c5:a0:8d:00:50:56:c0:00:08:08:00 SRC=10.10.10.1 DST=10.10.10.133 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=10262 DF PROTO=TCP SPT=62703 DPT=80 WINDOW=256 RES=0x00 ACK URGP=0 </code>

<code>Jul 13 14:44:59 localhost kernel: IN=eno16777736 OUT= MAC=00:0c:29:c5:a0:8d:00:50:56:c0:00:08:08:00 SRC=10.10.10.1 DST=10.10.10.133 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=10263 DF PROTO=TCP SPT=62704 DPT=80 WINDOW=256 RES=0x00 ACK URGP=0</code>

# 将来自10.10.10.0/24网段的主机并访问80端口的请求给予拒绝

<code>[root@localhost ~]</code><code># iptables -I INPUT -s 10.10.10.0/24 -p tcp --dport 80 -j DROP</code>

<code>DROP       tcp  --  10.10.10.0</code><code>/24</code>        <code>0.0.0.0</code><code>/0</code>            <code>tcp dpt:80</code>

<code>LOG        tcp  --  10.10.10.1           0.0.0.0</code><code>/0</code>            <code>tcp dpt:80 LOG flags 0 level 4</code>

# 禁止10.10.10.0/24网段内的主机ping。ICMP类型为8

<code>[root@localhost ~]</code><code># iptables -A INPUT -s 10.10.10.0/24 -p icmp --icmp-type 8 -j DROP</code>

<code>说明:禁止10.10.10.0</code><code>/24</code><code>网段内的主机</code><code>ping</code>

# 查看filter表中防火墙规则并显示规则编号:

<code>[root@localhost ~]</code><code># iptables -nL --line-number</code>

<code>num  target     prot opt </code><code>source</code>               <code>destination         </code>

<code>1    DROP       tcp  --  10.10.10.0</code><code>/24</code>        <code>0.0.0.0</code><code>/0</code>            <code>tcp dpt:80</code>

<code>2    LOG        tcp  --  10.10.10.1           0.0.0.0</code><code>/0</code>            <code>tcp dpt:80 LOG flags 0 level 4</code>

<code>3    DROP       icmp --  10.10.10.0</code><code>/24</code>        <code>0.0.0.0</code><code>/0</code>            <code>icmptype 8</code>

<code>num  target     prot opt </code><code>source</code>               <code>destination</code>

# -D参数,删除INPUT链的第三条规则:  

<code>[root@localhost ~]</code><code># iptables -D INPUT 3</code>

# -R参数,替换第二条规则       

<code>[root@localhost ~]</code><code># iptables -R INPUT 2 ! -s 10.10.10.1 -p tcp --dport 80 -j ACCEPT</code>

<code>2    ACCEPT     tcp  -- !10.10.10.1           0.0.0.0</code><code>/0</code>            <code>tcp dpt:80</code>

# 查看iptables的版本号:

<code>[root@localhost ~]</code><code># iptables -V</code>

<code>iptables v1.4.21</code>

<code>[root@localhost ~]</code><code># iptables -A INPUT -i lo -j ACCEPT</code>

<code>[root@localhost ~]</code><code># iptables -nL</code>

<code>ACCEPT     all  --  0.0.0.0</code><code>/0</code>            <code>0.0.0.0</code><code>/0</code>           

# CentOS7下iptables的安装:

<code>CentOS 7 默认使用firewalld来管理iptables规则,由于防火墙规则变动的情况很少,动不动态变得无所谓了。但是总是感觉不太习惯。</code>

<code>使用下面的办法来恢复原来的习惯,同时解决iptables开机启动的问题。</code>

<code># yum install iptables-services -y</code>

<code># systemctl enable iptables</code>

<code>这样的话,iptables服务会开机启动,自动从</code><code>/etc/sysconfig/iptables</code> <code>文件导入规则。</code>

<code>为了让</code><code>/etc/init</code><code>.d</code><code>/iptables</code> <code>save 这条命令生效,需要这么做</code>

<code># cp /usr/libexec/iptables/iptables.init /etc/init.d/iptables</code>

<code># /etc/init.d/iptables save</code>

<code>而chkconfig iptables 命令会自动重定向到sytemctl </code><code>enable</code> <code>iptables</code>

# 定义iptables默认策略

<code>默认策略的定义格式为:</code>

<code>iptables [-t 表名] &lt;-P&gt; &lt;链名&gt; &lt;动作&gt;</code>

<code>查看iptables的状态</code>

<code>[root@ip-172-31-22-8 ~]</code><code># /etc/init.d/iptables status</code>

<code>Table: filter</code>

<code>[root@localhost ~]</code><code># iptables -I INPUT -s 10.10.10.0/24 -p tcp --dport 80 -j ACCEPT</code>

<code>[root@localhost ~]</code><code># iptables -I INPUT -s 10.10.10.0/24 -p tcp --dport 22 -j ACCEPT</code>

<code>ACCEPT     tcp  --  10.10.10.0</code><code>/24</code>        <code>0.0.0.0</code><code>/0</code>            <code>tcp dpt:22</code>

<code>ACCEPT     tcp  --  10.10.10.0</code><code>/24</code>        <code>0.0.0.0</code><code>/0</code>            <code>tcp dpt:80</code>

5)iptables的状态state

下面解释iptables的几种状态:

NEW:如果你的主机向远程主机发出一个请求连接,这个数据包的状态就是NEW

ESTABLISHED:已建立的连接(完成TCP的三次握手后),远程主机和你的主机通信数据状态为ESTABLISHED

RELATED:正在启动新连接,比如FTP服务传输,21端口负责传送命令,20端口负责传输数据,在已有的21端口建立好连接后发生命令,这时候20端口或其他端口传送FTP-DATA,状态就是RELEATED

INVALID:非法或无法识别的数据包,不能被识别属于哪个连接或者没有任何状态,通常这种状态包会被丢弃

iptables脚本的基本模板:

<code>#!/bin/bash</code>

<code>#created by molewan 2016/07/16</code>

<code>#email:[email protected]</code>

<code>iptables -F</code>

<code>iptables -F -t nat</code>

<code>iptables -X</code>

<code>iptables -Z</code>

<code>iptables -P INPUT DROP</code>

<code>iptables -A INPUT -m state --state NEW -j DROP</code>

<code>iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT</code>

6)生产环境中我们如何维护我们的iptables

系统运维人员在维护iptables的时候,经常会发现误操作了iptables导致无法进入了系统,这个时候只有去机房重启iptables,其实这个也是有办法解决的,可以通过配置

计划任务的方式来处理:

<code>[root@ip-172-31-22-8 ~]</code><code># crontab -l</code>

<code>*</code><code>/5</code> <code>* * * * </code><code>/etc/init</code><code>.d</code><code>/iptables</code> <code>stop</code>

这样,我们每5分钟会停止下iptables服务,调试人员也可以放心大胆的操作了

7)iptables防火墙应用案例:

案例1:允许任意客户端访问主机的日常服务(HTTP、HTTPS、DNS、NTP、SMTP、POPS3、SSH)

[

<code>root@localhost ~]</code><code># iptables -A INPUT -p tcp --dport 22 -j ACCEPT</code>

<code>[root@localhost ~]</code><code># iptables -A INPUT -p udp --dport 25 -j ACCEPT</code>

<code>[root@localhost ~]</code><code># iptables -A INPUT -P tcp --dport 53 -j ACCEPT</code>

<code>[root@localhost ~]</code><code># iptables -A INPUT -p udp --dport 53 -j ACCEPT</code>

<code>[root@localhost ~]</code><code># iptables -A INPUT -p tcp --dport 80 -j ACCEPT</code>

<code>[root@localhost ~]</code><code># iptables -A INPUT -p tcp --dport 110 -j ACCEPT</code>

<code>[root@localhost ~]</code><code># iptables -A INPUT -p tcp --dport 143 -j ACCEPT</code>

<code>[root@localhost ~]</code><code># iptables -P INPUT DROP</code>

<code>[root@localhost ~]</code><code># iptables -P OUTPUT ACCEPT</code>

<code>[root@localhost ~]</code><code># iptables -P FORWARD DROP</code>

<code>Chain INPUT (policy DROP)</code>

<code>ACCEPT     tcp  --  0.0.0.0</code><code>/0</code>            <code>0.0.0.0</code><code>/0</code>            <code>tcp dpt:22</code>

<code>ACCEPT     udp  --  0.0.0.0</code><code>/0</code>            <code>0.0.0.0</code><code>/0</code>            <code>udp dpt:25</code>

<code>ACCEPT     tcp  --  0.0.0.0</code><code>/0</code>            <code>0.0.0.0</code><code>/0</code>            <code>tcp dpt:53</code>

<code>ACCEPT     udp  --  0.0.0.0</code><code>/0</code>            <code>0.0.0.0</code><code>/0</code>            <code>udp dpt:53</code>

<code>ACCEPT     tcp  --  0.0.0.0</code><code>/0</code>            <code>0.0.0.0</code><code>/0</code>            <code>tcp dpt:80</code>

<code>ACCEPT     tcp  --  0.0.0.0</code><code>/0</code>            <code>0.0.0.0</code><code>/0</code>            <code>tcp dpt:110</code>

<code>ACCEPT     tcp  --  0.0.0.0</code><code>/0</code>            <code>0.0.0.0</code><code>/0</code>            <code>tcp dpt:143</code>

<code>Chain FORWARD (policy DROP)</code>

<code>[root@localhost ~]</code><code># cat /etc/services #可以在此文件中查看服务的名称</code>

案例2:公司拥有一个公有IP,使用防火墙实现局域网中所有主机通过SNAT共享上网。

<code>原理:使用CentOS7作为公司软路由,将内网192.168.0.0</code><code>/24</code><code>的数据包源地址修改为路由器上的公有IP 124.126.199.84</code>

<code>,使用SNAT规则,以及NAT表的POSTROUTING链</code>

<code>先开启系统上的路由转发:</code>

<code># vim /etc/sysctl.conf</code>

<code>net.ipv4.ip_forward = 1</code>

<code># sysctl -p</code>

<code># iptables -t nat -I POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source 124.126.199.84</code>

案例3:公司对外有一个公网IP,公司内部有HTTP、MAIL两台核心服务器,通过防火墙实现客户可以从互联网的任意位置访问公司内部的两台服务器资源

<code>拓扑;</code>

<code>Internet &lt;--124.126.199.84(防火墙)--&gt;192.168.0.0</code><code>/24</code>

<code>http:192.168.0.100</code>

<code>postfix:192.168.0.101</code>

<code>处理过程:</code>

<code>开启路由转发:</code>

<code>针对80端口的</code>

<code># iptables -t nat -I PREROUTING -d 124.126.199.84 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.100</code>

<code>针对25端口和110端口</code>

<code># iptables -t nat -I PREROUTING -d 124.126.199.84 -p tcp --dport 25 -j DNAT --to-destination 192.168.0.101</code>

<code># iptables -t nat -I PREROUTING -d 124.126.199.84 -p tcp --dport 110 -j DNAT --to-destination 192.168.0.101</code>

案例4:目前网络的攻击手法层出不穷,很多攻击会采用发生大量无效的数据包给服务器,造成服务器无法响应正常的请求包,iptables提供了一个limit扩展功能,可以限制单位时间内数据包的个数。下面的规则是当每秒钟数据包个数为500接受入站连接,负责拒绝连接。

<code>[root@localhost ~]</code><code># iptables -I INPUT -m limit --limit 500/sec -j ACCEPT</code>

<code>ACCEPT     all  --  0.0.0.0</code><code>/0</code>            <code>0.0.0.0</code><code>/0</code>            <code>limit: avg 500</code><code>/sec</code> <code>burst 5</code>

案例5:根据数据连接状态设置防火墙规则,放行所有出站数据包,拒绝入站的新连接请求和无效连接,放行入站的回应请求

<code>[root@localhost ~]</code><code># iptables -X</code>

<code>[root@localhost ~]</code><code># iptables -Z</code>

<code>[root@localhost ~]</code><code># iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT</code>

<code>[root@localhost ~]</code><code># iptables -I INPUT -m state --state NEW -j DROP</code>

<code>DROP       all  --  0.0.0.0</code><code>/0</code>            <code>0.0.0.0</code><code>/0</code>            <code>state NEW</code>

<code>ACCEPT     all  --  0.0.0.0</code><code>/0</code>            <code>0.0.0.0</code><code>/0</code>            <code>state RELATED,ESTABLISHED</code>

案例6:公司采用基于Linux的软路由设备,要求在路由设备上设置防火墙规格,记录10.0.0.1至10.0.0.128地址段内所有的主机发送给路由要求转发的数据包,并允许转发这些数据包

<code>[root@localhost ~]</code><code># iptables -A FORWARD -m iprange --src-range 10.0.0.1-10.10.0.11 -p tcp --dport 80 -j LOG</code>

<code>[root@localhost ~]</code><code># iptables -A FORWARD -m iprange --src-range 10.0.0.1-10.10.0.11 -p tcp --dport 80 -j ACCEPT[root@localhost ~]# iptables -n -L</code>

<code>LOG        tcp  --  0.0.0.0</code><code>/0</code>            <code>0.0.0.0</code><code>/0</code>            <code>source</code> <code>IP range 10.0.0.1-10.10.0.11 tcp dpt:80 LOG flags 0 level 4</code>

<code>ACCEPT     tcp  --  0.0.0.0</code><code>/0</code>            <code>0.0.0.0</code><code>/0</code>            <code>source</code> <code>IP range 10.0.0.1-10.10.0.11 tcp dpt:80</code>

一次性允许多端口通过:

<code>[root@localhost ~]</code><code># iptables -I INPUT -s 10.10.10.0/24 -p tcp -m multiport --dport 21,22,23,80 -j ACCEPT</code>

<code>ACCEPT     tcp  --  10.10.10.0</code><code>/24</code>        <code>0.0.0.0</code><code>/0</code>            <code>multiport dports 21,22,23,80</code>

本文转自 冰冻vs西瓜 51CTO博客,原文链接:http://blog.51cto.com/molewan/1826946,如需转载请自行联系原作者

继续阅读