Linux基础之防火墙

Iptables

  最初认识iptables还是在安卓手机上玩tiny的时候知道的,什么扫地僧、Jume等防跳脚本都基于iptables原理,一直觉得iptables的命令很长、难懂,等真正认识了之后发现也不过如此。

  iptables是CentOS上的防火墙软件(之所以叫软件是因为它是调用系统内核中的netfilter),虽然在CentOS 7 上使用Firewall来代替直接使用iptables,但是iptables仍然具有很广泛的应用。

  在说iptables之前,先想一下防火墙的作用。防火墙是用来干什么的呢?主要对数据进行拦截过滤转发等等,既然是拦截,那么就得规定怎么拦截、拦截什么样的数据,这种规定我们一般称之为策略

  在我们拦截到数据包之后要做什么样的动作呢?比如放行、扔掉或者转发等。这些行为我们称之为动作target)。

  除了定义怎么拦截,我们还需要定义在哪可以拦截,网络上的数据时通过网卡过来的,首先经过内核,然后才会到达用户空间,如果是一个http请求的话,用户空间的web服务器接收到请求之后开始给客户端响应,就把数据往外发送,这中间就可以设立几个拦截点,这种拦截点我们称之为chain),为什么叫做链呢?因为在一个节点上可以由有数个规则,这些规则按照顺序从上往下依次匹配,就像一个链子一样,因此称之为

  我们说防火墙除了可以拦截之外,还有转发、修改数据的作用,那我们就可以把这些相似的规则放到一块,这个用来存放一类规则的东西叫做(table)。

  那么在Linux中总共有多少条链、多少张表?

  答案是5条链,4张表

5条链:

  • PREROUTING:路由前(外到内)
  • INPUT:入
  • OUTPUT:出
  • FORWARD:转发
  • POSTROUTING:路由后(内到外)

4张表:

  • raw :高级功能,如:网址过滤。
  • mangle :数据包修改(QOS),用于实现服务质量。
  • nat :地址转换,用于网关路由器。
  • filter :包过滤,用于防火墙规则。

以及几种常用的动作:

  • ACCEPT:允许数据包通过。
  • DROP:直接丢弃数据包,不给任何回应信息,这时候客户端会感觉自己的请求泥牛入海了,过了超时时间才会有反应。
  • REJECT:拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息。
  • SNAT:源地址转换,解决内网用户用同一个公网地址上网的问题。
  • MASQUERADE:是SNAT的一种特殊形式,适用于动态的、临时会变的ip上。
  • DNAT:目标地址转换。
  • REDIRECT:在本机做端口映射。
  • LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配。

有了上面的概念,下面的图就容易理解了:

  不同的表可以作用与同一条链,标的顺序按raw -> mangle -> nat -> filter依次作用。

  不同的表可以作用到不同的链,作用范围分别是:

  • PREROUTING:

    • raw 表
    • mangle 表
    • nat 表
  • INPUT:
    • mangle 表
    • (centos7中还有nat表,centos6中没有)
    • filter 表
  • FORWARD:
    • mangle 表
    • filter 表
  • OUTPUT:
    • raw 表
    • mangle 表
    • nat 表
    • filter 表
  • POSTROUTING:
    • mangle 表
    • nat 表

  大多数情况下我们都是操作filer表来进行端口的放行和拦截,Linux中默认也是操作filter表。对于同一条链以及同一张表的的多个规则,严格按照从上到下的顺序进行作用。比如A规则在上,对某种数据包进行拦截,B规则在下,对同种数据包进行放行,那么这种数据包只会被拦截而不会被放行,即在上的A规则起作用。

iptables命令

  有了上面的知识对于下边的命令就好理解了

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

其中:

  • -t 表名可以省略,默认操作filter表。
  • -A/I/D/R 规则链名 [规则号]为操作的链:
    • -A, --append chain rule-specification 在指定链 chain 的末尾插入指定的规则,也就是说,这条规则会被放到最后,最后才会被执行。规则是由后面的匹配来指定。
    • -I, --insert chain [rulenum] rule-specification 在链 chain 中的指定位置插入一条或多条规则。默认规则号为1,即在头部插入。
    • -D, --delete chain rule-specification / rulenum 在指定的链 chain 中删除一个或多个指定规则。
    • -R --replace rulenum:替换/修改第几条规则
  • -i/o 网卡名可以指定网络接口
    • -i 网络接口:指定数据包进入本机的网络接口
    • -o 网络接口:指定数据包要离开本机所使用的网络接口
  • -p 协议名可以指定协议,比如TCPUDP、SCTP等
  • -s 源IP/源子网 --sport 源端口这里指的是其他机器的IP和端口
  • -d 目标IP/目标子网 --dport这里指的是本机的IP和端口
  • -j 动作匹配到数据包之后要做什么

  其中-开头为简洁指令,--为全指令,他们是等价的,部分指令没有简洁模式(比如--dport)。

常用参数

  下面这些其实用iptables -h就全都出来了……

链管理

  简洁模式和完整命令(chain代表链,target代表策略):

  • -P, --policy chain target:为指定的链设置默认策略。(注意,只有内置的链才允许有策略,用户自定义的是不允许的)。
  • -F, --flush [chain] 清空指定链上面的所有规则。如果没有指定链,清空该表上所有链的所有规则。
  • -N, --new-chain chain_name 用指定的名字创建一个新的链。(new后面的 -chain 可以省略)
  • -X, --delete-chain [chain] :删除指定的链,这个链必须没有被其它任何规则引用,而且这条上必须没有任何规则。如果没有指定链名,则会删除该表中所有非内置的链。
  • -E, --rename-chain old_chain new_chain :用指定的新名字去重命名指定的链。这并不会对链内部照成任何影响。
  • -Z, --zero [chain] :把指定链,或者表中的所有链上的所有计数器清零。

规则管理

  • -A, --append chain rule-specification 在指定链 chain 的末尾插入指定的规则,也就是说,这条规则会被放到最后,最后才会被执行。规则是由后面的匹配来指定。
  • -I, --insert chain [rulenum] rule-specification 在链 chain 中的指定位置插入一条或多条规则。默认为1,也就是在头部插入。(rulenum为行号,可以加入--line来显示行号)
    • -D, --delete chain rule-specification
    • -D, --delete chain rulenum 在指定的链 chain 中删除一个或多个指定规则。
  • -R --replace chain rulenum:替换/修改第几条规则

数据匹配

  • -p:指定要匹配的数据包协议类型(一般为TCP、UDP)
  • -s--source [!] address[/mask] :把指定的一个/一组地址作为源地址,按此规则进行过滤。当后面没有 mask 时,address 是一个地址,比如:192.168.1.1;当 mask 指定时,可以表示一组范围内的地址,比如:192.168.1.0/255.255.255.0。
  • -d--destination [!] address[/mask] :地址格式同上,但这里是指定地址为目的地址,按此进行过滤。
  • -i--in-interface [!] <网络接口> :指定数据包的来自来自网络接口,比如最常见的 eth0 。注意:它只对 INPUT,FORWARD,PREROUTING 这三个链起作用。如果没有指定此选项, 说明可以来自任何一个网络接口。同前面类似,"!" 表示取反。
  • -o--out-interface [!] <网络接口> :指定数据包出去的网络接口。只对 OUTPUT,FORWARD,POSTROUTING 三个链起作用。

其他

  • -t--table table选择要操作的表,可以省略,默认filter
  • -L--list [chain [rulenum]]查看规则
    • -v:详细模式
    • -n:取消解析,直接显示IP
    • -x:精确数值
    • --line--line-numbers显示行号

CentOS 6 & 7

  我们修改的命令都是为保存的,下次开机就没有了,那么如何保存呢?

  在CentOS 6 中可以直接service iptables save来保存。

  但是在CentOS 7 中移除了大部分Service iptables命令,但是并没有完全去除iptables,而是和firewalld共存。

  我们可以使用下面的命令来吧firewalld更改为iptables:

# 检查firewalld是否运行,
firewall-cmd --state
#停止firewalld
systemctl stop firewalld
#禁止firewalld自动启动
systemctl disable firewalld
#安装iptables-service
yum install -y iptables-services
#启动iptables
systemctl start iptables
#将iptables设置为开机自动启动,以后即可通过iptables-service控制iptables服务
systemctl enable iptables

然后就可以使用service iptables save来保存规则了。

命令保存之后需要重启服务来使之生效


这里放几条常用的命令:

#允许所有本机向外的访问
iptables -A OUTPUT -j ACCEPT
#允许访问22端口
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
#允许访问80端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
#允许ftp服务的21端口
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
#允许FTP服务的20端口
iptables -A INPUT -p tcp --dport 20 -j ACCEPT
# 保存
service iptables save
# 备份
iptables-save > filename
# 恢复
iptables-restore < filename

FirewallD

  既然提到了CentOS 7 那就不得不说它的新防火墙FirewallD。

  为什么红帽子要替换掉Iptables呢?也不能说是替换吧,firewalld是iptables的前端控制器,只能说为什么推荐使用FirewallD。FirewallD最明显的一个好处就是比Iptables简单,Iptables的4张表5条链是有点麻烦的,并且FirewallD有一些新的特点,比如规则动态生效、加入区域(区域其实就是一些配置好的规则集。)等。

  如果使用FirewallD的话推荐只使用FirewallD命令。

  需要注意的是FirewallD默认为拒绝,iptables默认为接收,并且启动过FirewallD之后,会在iptables表中留下规则,可以使用iptables -F来清楚规则。

  下面列出一些常用命令:

# firewalld开/关/(守护进程)状态/重启
systemctl start|stop|status|restart firewalld
# 开机自启/禁止自启
systemctl enable|disable firewalld

FirewallD使用firewall-cmd的方式来进行操作:

# 帮助
firewall-cmd --help
# 版本
firewall-cmd --version
# 状态
firewall-cmd --state
# 重新加载配置
firewall-cmd --reload
===========================================
#添加端口/协议(tcp/udp)端口可以填2000-3000来作为一个范围
firewall-cmd --add-port=<port>/<protocol>
#移除端口/协议(tcp/udp)这里tcp和udp是小写
firewall-cmd --remove-port=<port>/<protocol>
#查看开放的端口
firewall-cmd --list-ports
===========================================
# 允许协议 (例:icmp,即允许ping)
firewall-cmd --add-protocol=<protocol>
# 取消协议
firewall-cmd --remove-protocol=<protocol>
# 查看允许的协议
firewall-cmd --list-protocols
===========================================
# 拒绝所有流量,远程连接会立即断开,只有本地能登陆
firewall-cmd --panic-on
# 取消应急模式,但需要重启firewalld后才可以远程ssh
firewall-cmd --panic-off
# 查看是否为应急模式
firewall-cmd --query-panic
===========================================
# 查看当前区域
firewall-cmd --get-default-zone
# 查看所有区域
firewall-cmd --get-zones
# 设置默认区域为public(这也是默认的区域)
firewall-cmd --set-default-zone=public
===========================================
# 列出所有服务(服务即为定义好的端口和协议)
firewall-cmd --get-services
# 列出当前zone下加载的service
firewall-cmd --list-services
# 给指定zone添加service
firewall-cmd --zone=public --add-service=http
# 指定区域移除服务
firewall-cmd --zone=public --remove-service=http

  以上命令均为临时操作,重启服务器之后规则消失。可以添加--permanent参数来将规则添加到配置文件,然后重新加载配置即可生效。


参考:Iptables详解

Linux基础之防火墙的更多相关文章

  1. Linux基础命令---防火墙iptables

    iptables iptables指令用来设置Linux内核的ip过滤规则以及管理nat功能.iptables用于在Linux内核中设置.维护和检查IPv4数据包过滤规则表.可以定义几个不同的表.每个 ...

  2. Linux基础精华

    Linux基础精华 (继续跟新中...) 常用命令: Linux shell 环境 让你提升命令行效 率的 Bash 快捷键 [完整版] 设置你自己的liux alias Linux的Find使用 L ...

  3. 《OD学hadoop》Linux基础

    一.Linux基本环境 1. Linux常见版本及VMware虚拟机安装Linux系统 2. 虚拟机网络配置(IP地址.主机名.防火墙) 3. 文件基本命令操作 4. 四大远程连接工具使用 二.Lin ...

  4. Linux基础(4)

    Linux基础(四) 通过前面的知识的学习,来现学现卖咯! 1.题目:集群搭建 1.1.部署nginx反向代理三个web服务,调度算法使用加权轮询: 1.2.所有web服务使用共享存储nfs,保证所有 ...

  5. linux基础简答(1)

    linux基础简答题 扇区及其4个主分区的原因 在第一个扇区中,保存着引导记录和分区信息,容量为512bytes,主引导记录(相当于MBR)446 bytes,分区表64bytes,记录每个分区信息要 ...

  6. Linux基础-最基础

    Linux基础 为了更好的学习知识,开通此博客,以前博客丢了...记录一下知识点,希望能在这里与大家互相学习交流. 20171113 14:00 Linux基础-基本知识 Linux树状文件系统结构 ...

  7. Linux基础知识梳理

    Linux基础知识梳理 Linux内核最初只是由芬兰人林纳斯?托瓦兹(Linus Torvalds)在赫尔辛基大学上学时出于个人爱好而编写的.Linux是一套免费使用和自由传播的类Unix操作系统,是 ...

  8. Linux基础 - 系统优化及常用命令

    目录 Linux基础系统优化及常用命令 Linux基础系统优化 网卡配置文件详解 ifup,ifdown命令 ifconfig命令 ifup,ifdown命令 ip命令 用户管理与文件权限篇 创建普通 ...

  9. Linux基础系统优化及常用命令

    # Linux基础系统优化及常用命令 [TOC] ## Linux基础系统优化 Linux的网络功能相当强悍,一时之间我们无法了解所有的网络命令,在配置服务器基础环境时,先了解下网络参数设定命令. - ...

随机推荐

  1. Thymeleaf基本知识(推荐)

    原文: http://blog.csdn.net/pdw2009/article/details/44700897 Thymeleaf是个XML/XHTML/HTML5模板引擎,可以用于Web与非We ...

  2. SWD学习笔记

    SWD其实和JTAG类似,是一种调试串口. JTAG大致了解了一下.JTAG(Joint Test Action Group)主要4 lines:TMS(模式选择),TCK(时钟),TDI(数据输入) ...

  3. redis5.0版本集群搭建

    模式简介 Redis 集群是一个可以在多个 Redis 节点之间进行数据共享的设施(installation). Redis 集群不支持那些需要同时处理多个键的 Redis 命令,比如:mget, 因 ...

  4. Python正则表达式就是这么简单【新手必学】

    一前言本篇文章带大家快速入门正则表达式的使用,正则表达式的规则不仅适用python语言,基本大多数编程语言都适用,在日常使用中极为广泛,读者们有必要学好正则表达式.看完这篇文章,读者们要理解什么是正则 ...

  5. 《Interest Rate Risk Modeling》阅读笔记——第九章:关键利率久期和 VaR 分析

    目录 第九章:关键利率久期和 VaR 分析 思维导图 一些想法 有关现金流映射技术的推导 第九章:关键利率久期和 VaR 分析 思维导图 一些想法 在解关键方程的时候施加 \(L^1\) 约束也许可以 ...

  6. [转]简单总结一下解决 添加 inline-block 后多出来的空隙

    添加 inline-block 后: 查询.借鉴的原网址:http://www.zhangxinxu.com/wordpress/?p=2357 html 结构: <ul class=" ...

  7. 2016 黑客必备的Android应用都有哪些?

    免责声明:本站所发布的此份清单仅供学习之用.我们不支持读者利用其中的任何工具进行任何不道德的恶意攻击行为. 根据业界的一系列评测以及亲身经验,我们整理出了这份最佳Android黑客应用清单.除了对应用 ...

  8. C# 中的委托和事件 转载张子阳的

        C# 中的委托和事件 引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人 ...

  9. JavaSwing标准对话框

    package test001; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import jav ...

  10. wdcp升级php5.8到php7.1.12后安装gitlab

    .安装依赖包 sudo yum install -y curl policycoreutils-python openssh-server cronie .使用清华大学开源软件镜像源安装 vim /e ...