Firewall : 防火墙,隔离工具;工作于主机或网络的边缘,对于进出本主机或网络的报文根据事先定义好的检测规则作匹配,对于能够被规则所匹配到的报文做出相应处理的组件;有主机防火墙和网络防火墙

Iptables: 包过滤型防火墙,对报文首部进行匹配完成过滤功能

功能:

filter: 过滤,防火墙
nat: network address translation, 网络地址转换
mangle: 拆解报文,做出修改,封装报文
raw:关闭nat表上启用的连接追踪机制

链(内置)

PREROUTTING
INPUT
FORWARD
OUTPUT
POSTROUTING

报文一般流向:

流入: PREROUTTING --> INPUT
流出: OUTPUT --> POSTROUTTING
转发: PREROUTTING --> FORWARD --> PSTROUTTING

各功能的分别实现:

filter: INPUT, FORWARD, OUTPUT
nat: PREROUTTING(DNAT), OUTPUT, POSTROUTTING(SNAT)
mangle: PREROUTTING, INPUT, FORWARD, OUTPUT,POSTROUTING
raw: PREROUTTING, OUTPUT

iptables: 四表五链
  添加规则时的考量点:

    1. 要实现哪种功能: 判断添加在哪张表上
    2. 报文流经的路径,判断添加在哪个链上

  链: 链上规则的次序,即为检查的次序,因此隐含一定的法则:

    1. 同类规则(访问同一应用),匹配范围小的放上面
    2. 不同类规则(访问不同应用),匹配到报文频率较大的放上面
    3. 将那些可由一条规则描述的多个规则合并为一个
    4. 设置默认策略

  功能的优先级次序:

    raw --> mangle --> nat --> filter

数据流向和优先级示意图如下:

iptables: 规则管理工具

可以实现添加、修改、删除、显示等功能

规则和链有计数器

pkts:  由规则或链所匹配到的报文的个数
bytes: 由规则或链匹配到的所有报文大小之和

iptables命令:

iptables [-t table] {-A|-C|-D} chain rule-specification
iptables [-t table] -I chain [rulenum] rule-specification
iptables [-t table] -R chain rulenum rule-specification
iptables [-t table] -D chain rulenum
iptables [-t table] -S [chain [rulenum]]
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
iptables [-t table] -N chain
iptables [-t table] -X [chain]
iptables [-t table] -P chain target
iptables [-t table] -E old-chain-name new-chain-name

命令详解:

  -t table:
      filter, nat, mangle, raw
链(chain)管理:
  -F: flush, 清空规则链;省略链,表示清空指定表上的素有的链
  -N: new, 创建新的自定义规则链;
  -X: drop, 删除用户自定义的空的规则链
  -Z: zero, 清零,置零规则计数器;
  -P: Policy, 为指定链设置默认策略;对filter表中的链而言,默认策略通常有ACCEPT,DROP, REJECT
  -E: rEname, 重命名自定义链,引用计数不为0的自定义链,无法改名,也无法删除   -L: list, 列出指定链上的所有规则
    -n: numberIC,以数字格式显示地址和端口号
    -v: v erbose,显示详细信息
       -vv, -vvv
    --line-numbers: 显示规则编号
    -x: exactly,显示计数器计数结果的精确值 
规则管理:
  -A: append, 将新规则追加于指定链的尾部
  -I: insert, 将新规则插入至指定链的位置
  -D: delete, 删除指定链上的指定规则
    有两种指定方式:
      1. 指定匹配条件
      2. 指定规则编号
     # iptables -D OUTPUT 1  //删除OUTPUT链上的第一条策略
  -R: replace, 替换指定链上的指定规则

规则:

匹配条件:根据协议报文特征指定
  基本匹配条件
  扩展匹配条件
处理动作:
  内建处理机制
  自定义处理机制 注意: 报文不会经过自定义链,只能在内置链上通过规则进行引用后生效

匹配条件:

基本匹配:

  [!] -s, --src, --source IP|Netaddr: 检查报文中源IP地址是否符合此处指定的地址范围
  [!] -d, --dst, --destination IP|Netaddr:检查报文中源IP地址是否符合此处指定的地址范围
  -p, --protocol {tcp|udp|icmp}:检查报文中的协议,即ip首部中protocols所标识的协议
  -i,--in-interface IFACE: 数据报文的流入接口;仅能用于PREROUTTING,INPUT,FORWARD
  -o, --out-interface IFACE: 数据报文的流出接口,仅能用于FORWARD,OUTPUT及POSTROUTTING 

基本匹配条件的示例:

1.访问本机的报文属于tcp协议都放行,从本机出去的tcp报文也要放行
  # iptables -t filter -A INPUT -d 192.168.1.3 -p tcp -j ACCEPT
  # iptables -t filter -A OUTPUT -s 192.168.1.3 -p tcp -j ACCEPT
2. 允许别的电脑ping自己的主机
  # iptables -A INPUT -d 192.168.1.3 -p icmp -j ACCEPT
  # iptables -A OUTPUT -s 192.168.1.3 -p icmp -j ACCEPT
3. 假设有三块网卡,对第一块网卡eth0进行流控制
  # iptables -t filter -A INPUT -d 192.168.1.3 -i eth0 -j ACCEPT
  # iptables -t filter -A OUTPUT -s 192.168.1.3 -o eth0 -j ACCEPT

扩展匹配:

-m match_name --spec_options
  例如: -m tcp --dport 22
隐式扩展:   对 -p protocol指明的协议进行的扩展,可省略-m选项
-p tcp
  --dport PORT[-PORT]: 目标端口,可以是单个端口或连续多个端口
  --sport PORT[-PORT]:源端口
  --tcp-flags LIST1 LIST2: 检查LIST1所指明的所有标志位,且这其中,LIST2所表示出的所有标记位必须为1。而余下的必须为0;没有LIST1中指明的,不作检查
      常用标志位:SYN,ACK,FIN,RST,PSH,URG
      示例:--tcp-flags SYN,ACK,FIN,RST SYN:意为标志位SYN为1,ACK,FIN,RST全为0,三次握手第一次连接
  --syn: 效果和上面--tcp-flags示例一样
-p udp
  --dport
  --sport -p icmp
  --icmp-type
    可用数字表示其类型
      0: echo-reply,回送应答(ping应答)
      8: echo-request,请求回送(ping请求)

隐式扩展示例:

1. 来自tcp协议22号端口的报文允许访问
  # iptables -I INPUT -d 192.168.1.3 -p tcp --dport 22 -j ACCEPT
  # iptables -I OUTPUT -s 192.168.1.3 -p tcp --sport 22 -j ACCEPT
2. 比如让主机可以ping别人,别人不能ping自己
  # iptables -A OUTPUT -s 192.168.1.3 -p icmp --icmp-type 8 -j ACCEPT
  # iptables -A INPUT -d 192.168.1.3 -p icmp --icmp-type 0 -j ACCEPT
显式扩展:必须使用-m选项指定使用扩展,还要指明使用的扩展模块(rpm -ql iptables  | grep "\.so")
获取显示扩展帮助文档:
  CentOS 6: man iptables
  CentOS 7: man iptables-extensions

1. multiport扩展
  以离散方式定义多端口匹配,最多指定15个端口

[!] --source-ports,--sports port[,port|,port:port]... :指明多个源端口
[!] --destination-ports,--dports port[,port|,port:port]... :指明多个目标端口
[!] --ports port[,port|,port:port]...
示例:
  # iptables -I INPUT -s 172.16.0.0/16 -d 172.16.100.9 -p tcp -m multiport --dports 22,80 -j ACCEPT
  # iptables -I OUTPUT -d 172.16.0.0/16 -s 172.16.100.9 -p tcp -m multiport --sports 22,80 -j ACCEPT

2. iprange扩展
  指明连续的(但一般是不能扩展为整个网络)ip地址范围时使用

[!] --src-range from[-to]: 指明连续的源IP地址
[!] --dst-range from[-to]: 指明连续的目标ip地址范围
示例:
  # iptables -t filter -I INPUT -d 192.168.1.3 -p tcp -m multiport --dports 22:23,80 -m iprange --src-range 192.168.1.2-192.168.1.200 -j ACCEPT
  # iptables -t filter -I OUTPUT -s 192.168.1.3 -p tcp -m multiport --sports 22:23,80 -m iprange --dst-range 192.168.1.2-192.168.1.200 -j ACCEPT

3. string扩展
  检查报文中出现的字符串

--algo {bm|kmp}
    bm = Boyer-Moore
    kmp = Kunth-Pratt-morris
[!] --string pattern 
# iptables -I OUTPUT -m string --algo bm --string 'movie' -j REJECT

4. time扩展
  根据报文到达的时间与指定的时间范围进行匹配

  --datestart YYYY[-MM][-DD[Thh[:mm[:ss]]]]
  --datestop YYYY[-MM][-DD[Thh[:mm[:ss]]]]
  --timestart hh:mm[:ss]
  --timestop hh:mm[:ss]
  --monthdays day[,day...]
  --weekdays day[,day...]
# iptables -I INPUT -d 192.168.1.3 -p tcp --dport 80 -m time --timestart 23:00 --timestop 23:30 -j REJECT

5. connlimit扩展
  根据每客户端IP(也可以是地址块)做并发数数量匹配

--connlimit-above n: 连接的数量大于n
--connlimit-upto n: 连接的数量小于等于n
# iptables -I INPUT -d 192.168.1.3 -p tcp --dport 22 -m connlimit --connlimit-above 3 -j REJECT

6. limit扩展
  基于收发报文的速率做检查

 --limit rate[/second|/minute|/hour|/day]  //速率
  --limit-burst number  //峰值
# iptables -A OUTPUT -s 192.168.1.3 -p icmp --icmp-type 0 -m limit --limit-burst 5 --limit 30/minute -j ACCEPT
# iptables -A OUTPUT -s 192.168.1.3 -p icmp --icmp-type 0 -j ACCEPT

7. state扩展
根据连接追踪机制检查连接的状态

--state STATE1,STATE2,...

 调整连接追踪功能所能够容纳的最大连接数量

     /proc/sys/net/nf_contrack_max

 已经追踪到并记录下的连接

     /proc/net/nf_conntrack

 不同协议或连接类型追踪时长

    /proc/sys/net/netfiler/

 可追踪的连接状态:

    NEW: 新发出的请求:连接追踪模板中不存在此连接相关的信息条目,因此,将其识别为第一次发出的请求
    ESTABLISHED:NEW状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的通信的状态
    RELATED:相关的连接:如ftp协议的命令连接与数据连接之间的关系
    INVALIED:无法识别的连接

示例:

1.出去的已建立的连接都放行,进来的新连接是tcp协议22,80端口的也放行
  # iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
  # iptables -I INPUT -m state --state ESTABLISHED -j ACCEPT
  # iptables -I INPUT -p tcp -m multiport --dports 22,80 -m state --state NEW -j ACCEPT

目标:

-j TARGET: jump至指定的TARGET
  ACCEPT:接受
  DROP:丢弃
  REJECT: 拒绝
  RETURN: 返回调用链
  REDIRECT: 端口重定向
  LOG: 记录日志
  MARK: 做防火墙标记
  DNAT:目标地址转换
  SNAT: 原地址转换
  MASQUERADE: 地址伪装
  。。
  自定义链: 由自定义链上的规则进行匹配检查

问题:如何开放被动模式的ftp服务?

(1)装载ftp追踪时的专用的模块(路径为/lib/modules/2.6.32-754.el6.x86_64/kernel/net/netfilter)

# modprobe nf_conntrack_ftp

(2)  放行请求报文
  命令连接: NEW, ESTABLISHED
  数据连接: RELATED, ESTABLISHED

修改上面的规则:
# iptables -R INPUT 1 -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -R INPUT 2 -d 192.168.1.3 -p tcp -m multiport --dports 21,22,80 -m state --state NEW -j ACCEPT
为ftp写的专用规则:
# iptables -A INPUT -d localIP -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
# iptables -A INPUT -d localIP -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT

(3) 放行响应报文
  ESTABLISHED

# iptables -A OUTPUT -s localIP -p tcp -m state --state ESTEALISHED -j ACCEPT

如何保存及重载规则:

保存规则至指定文件:
iptables-save > /PATH/TO/SOMEFILE 从指定文件重载规则:
iptables-restore < /PATH/FROM/SOMEFILE

CentOS 6:

service iptables save
  相当于 iptables-save > /etc/sysconfig/iptables service iptables restart
  相当于 iptables-restore < /etc/sysconfig/iptables

CentOS 7:

引入了新的iptables前端管理服务工具: firewalld
  firewalld-cmd
  firewalld-config 关于firewalld:
  参考文档: http://www.ibm.com/developerworks/cn/linux/1507_caojh/index.html

网络防火墙

首先搭建一个环境,架构如下

中间一台主机当做连接内网和外网的接口,添加两块网卡,192.168.20.1作为内网网关,192.168.1.1位外网网关,内网中有台主(192.168.20.2)机指向内网网关(192.168.20.1)

具体步骤:
  中间主机: 添加一块自定义网卡,添加ip: # ip addr add 192.168.20.1/24
        打开转发功能: # vim /etc/sysctl.conf ==> net.ipv4.ip_forward=1 ==> sysctl -p
  内网主机: 添加ip并且指向内网网关: # ifconfig eth1 192.168.20.2/24 up; # route add default gw 192.168.20.1
  外网主机: 添加网络路由: # route add -net 192.168.20.0/24 gw 192.168.1.101
现在内外网主机可以互相ping通

给内网添加web服务,写一个简单的测试html;

下面添加iptables规则,让外网能够访问内网web服务,但ping不通

# iptables -A FORWARD -d 192.168.20.2 -p tcp --dport 80 -j ACCEPT  //访问80端口的都放行
# iptables -A FORWARD -s 192.168.20.2 -p tcp --sport 80 -j ACCEPT  //从80端口出去的也都放行

添加规则,让外网可以访问内网80端口和22端口,内网不能访问外网,但能响应外网

# iptables -A FORWARD -m state --state  ESTABLISHED -j ACCEPT  //不管进还是出,只要是已建立的连接都放行
# iptables -A FROWARD -d 192.168.20.2 -p tcp -m multiport --dports 22,80 -m state --state NEW -j ACCEPT  //外网新建立的访问22,80的连接都放行

内网主机拥有ftp服务器,怎么开放?

装载模块:# modprobe nf_contrack_ftp
可以修改上面的规则:
  # iptables -R FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
  # iptables -R FORWARD -d 192.168.20.2 -p tcp -m multiport --dports 21,22,80 -m state --state NEW -j ACCEPT



iptables (一) 主机防火墙和网络防火墙的更多相关文章

  1. iptables详解(11):iptables之网络防火墙

    我们一起来回顾一下之前的知识,在第一篇介绍iptables的文章中,我们就描述过防火墙的概念,我们说过,防火墙从逻辑上讲,可以分为主机防火墙与网络防火墙. 主机防火墙:针对于单个主机进行防护. 网络防 ...

  2. 4.iptables 网络防火墙

    [1] #如果想要iptables作为网络防火墙,iptables所在主机开启核心转发功能,以便能够转发报文. [2] #使用如下命令查看当前主机是否已经开启了核心转发,0表示为开启,1表示已开启 c ...

  3. 【操作系统之十五】iptables黑白名单、自定义链、网络防火墙、常用动作

    1.黑白名单当链的默认策略为ACCEPT时,链中的规则对应的动作应该为DROP或者REJECT,表示只有匹配到规则的报文才会被拒绝,没有被规则匹配到的报文都会被默认接受,这就是"黑名单&qu ...

  4. iptables实现网络防火墙及地址转换

    iptables主机防火墙功能及常用命令 FSM:Finite State Machine 有限状态机 客户端:closed -->syn_sent -->established --&g ...

  5. centos6中iptables单机网络防火墙的使用

    概述: iptables:基于软件的形式实现的一种防火墙的软件程序 Firewall:工作在主机或网络边缘,对进出的报文按事先定义的规则进行检查,并且由匹配到的规则进行处理的一组硬件或软件,甚至可能是 ...

  6. 【iptables】linux网络防火墙-iptables基础详解(重要)

    一:前言   防火墙,其实说白了讲,就是用于实现Linux下访问控制的功能的,它分为硬件的或者软件的防火墙两种.无论是在哪个网络中,防火墙工作的地方一定是在网络的边缘.而我们的任务就是需要去定义到底防 ...

  7. iptables防火墙以及网络协议基本原理

    一. Linux 网络安全模型 1. 防火墙: 工作在主机或者网络边缘,对进出报文使用实现定义的规则进行检测,并且由匹配的规则进行处理的一组硬件或者软件.也可能两者结合. 1) 通常使用的防火墙设备 ...

  8. Linux之iptables(四、网络防火墙及NAT)

    网络防火墙 iptables/netfilter网络防火墙: (1) 充当网关 (2) 使用filter表的FORWARD链 注意的问题: (1) 请求-响应报文均会经由FORWARD链,要注意规则的 ...

  9. linux网络防火墙-iptables基础详解

    一:前言 防火墙,其实说白了讲,就是用于实现Linux下访问控制的功能的,它分为硬件的或者软件的防火墙两种.无论是在哪个网络中,防火墙工作的地方一定是在网络的边缘.而我们的任务就是需要去定义到底防火墙 ...

随机推荐

  1. postman批量接口测试/批量导入/批量参数化简要全过程及遇到问题处理方法

    简单说明下postman批量接口调用的过程及注意事项: 1.报文调试(建议先调通再批量执行,统筹安排时间) 2.参数化,例如: "address": "{{address ...

  2. 自定义属性的访问 - Customizing attribute access

    自定义属性的访问 - Customizing attribute access 在 python 中, 下列方法可以实现类实例属性 instance.attribute 的 使用,设置,删除. obj ...

  3. JVM解毒——类加载子系统

    带着问题,尤其是面试问题的学习才是最高效的.加油,奥利给! 点赞+收藏 就学会系列,文章收录在 GitHub JavaEgg ,N线互联网开发必备技能兵器谱 直击面试 看你简历写得熟悉JVM,那你说说 ...

  4. 08-JavaScript基础

    今日知识 1. JavaScript基础 2. 案例 3.总结 JavaScript介绍: * 概念:一门客户端脚本语言 * 运行在客户端浏览器中的,每一个浏览器都有JavaScript的解析引擎 * ...

  5. 使用Unicode(宽字节字符集);多字节字符集中定义宽字节变量

    2012-03-25 14:54 (分类:计算机程序) 2.2 宽字符和C 宽字符不一定是Unicode.Unicode是宽字符集的一种.然而,因为本书的焦点是Windows而不是C执行的理论,所以书 ...

  6. 一文彻底搞懂 TCP三次握手、四次挥手过程及原理

    原创文章出自公众号:「码农富哥」,欢迎收藏和关注,如转载请注明出处! TCP 协议简述 TCP 提供面向有连接的通信传输,面向有连接是指在传送数据之前必须先建立连接,数据传送完成后要释放连接. 无论哪 ...

  7. jdk升级后Eclipse无法启动问题

    overview: 今日安装jdk11,设置好环境变量后,eclipse无法运行,由于项目依赖原因,不想更新eclipse的版本. 我的jdk是1.8,在将环境变量设回1.8后依然无法运行.在多次尝试 ...

  8. 解决MySql客户端秒退(找不到my.ini)

    问题说明(环境:windows7,MySql8.0) 今天安装好MySql后启动MySql服务-->启动服务都失败的就不要往下看了,自行百度解决. 打开客户端秒退,但在cmd中是可以使用数据库的 ...

  9. mysql必知必会--使用数据处理函数

    函数 与其他大多数计算机语言一样,SQL支持利用函数来处理数据.函数 一般是在数据上执行的,它给数据的转换和处理提供了方便. 在前一章中用来去掉串尾空格的 RTrim() 就是一个函数的例子 函数没有 ...

  10. 何时使用异步或同步AJAX

    通常最好使用异步调用 通过优锐课核心java学习笔记中,我们可以看到,码了很多专业的相关知识, 分享给大家参考学习. AJAX代表异步JavaScript和XML,是一项允许异步更新网页的技术,这意味 ...