centos7默认防火墙不是iptables,是firewalle,本文讲的是iptables。
需禁用自带的firewalld服务,同时安装iptables服务。

linux防火墙概述

Linux防火墙实际指的是Linux下的Netfilter/Iptables。Netfilter/Iptables是2.4.x/2.6.x版本Linux内核集成的IP信息包过滤系统。

Linux的防火墙体系主要工作在网络层,针对TCP/IP数据包实施过滤和限制。属于典型的包过滤防火墙。linux系统的防火墙体系基于内核编码实现,具有非常稳定的性能和极高的效率,因此获得广泛的应用。

# 查看Linux内核版本
uname -r

Netfilter/Iptables 信息包过滤系统可以当成一个整体,netfilter是内核的模块实现,iptables是对上层操作工具。Netfilter是Linux核心中的一个通用架构,工作于内核空间。

Netfilter支持以下方式对数据包进行分类:

  • 源IP地址
  • 目标IP地址
  • 使用接口
  • 使用协议
  • 端口号
  • 连接状态

其提供了一系列的表(tables),每个表由若干个链(chains)组成,每条链可以由一条或若干条规则(rules)组成,其规则由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。

chain的本质是Netfilter定义的不同过滤点。总共定义了5个过滤点。INPUT,FORWARDING,OUTPUT,PREROUTING,POSTROUTIONG。

Table的本质是Netfilter定义的不同功能的划分。

  • filter用于执行基本过滤。

  • nat是对数据IP进行修改。

  • mangle是对数据包进行高级修改。

不同的Table只能用于特定的Chain。

Iptables 是一个管理内核包过滤的工具,可以用来配置核心包过滤表格中的规则。运行于用户空间。

linux防火墙的应用

Linux防火墙在企业应用中非常有用,举例如下:

  • 中小企业与网吧里有iptables作为企业的NAT路由器,可以用来代替传统路由器,而节约成本。
  • IDC机房一般没有硬件防火墙,IDC机房的服务器可以用Linux防火墙代替硬件防火墙。
  • iptables可以结合squid作为企业内部上网的透明代理。传统代理需要在浏览器里配置代理服务器信息,而iptables+squid的透明代理则可以把客户端的请求重定向到代理服务器的端口。客户端不要作任何设置,而感觉不到代理的存在。
  • 将iptables作为企业NAT路由器时,可以使用iptables的扩展模块屏蔽P2P流量,还可以禁止非法网页。
  • iptables可以用于外网IP向内网IP映射。
  • iptables可以轻松防止轻量级DOS攻击,比如ping攻击及SYN洪水攻击。

综述,Iptables有两种应用模式:主机防火墙,NAT路由器。

iptables关闭开启命令

#开启服务
systemctl start iptables.service
#查看状态
systemctl status iptables.service



# iptables增加规则有两种方案

# 1. 直接修改/etc/sysconfig/iptables,然后重启
service iptables restart

# 2. 使用iptables命令直接添加规则,但只是临时生效,需要同步到/etc/sysconfig/iptables
iptables-save > /etc/sysconfig/iptables
# 如果需要恢复备份的策略,则
iptables-restore < /etc/sysconfig/iptabls_XX备份

# 若用的是 RedHat 系列用这个,centos这个是恢复(原因未知)
service iptables save

# 查看iptables设置完毕的规则
# 默认只有filter表
iptables -L -n
# 查看4表所有当前设置,不保存
iptables-save

我在服务器测试的时候有时候会发现,iptables -L -n与/etc/sysconfig/iptables文件中的规则不一致,具体原因暂时还不知道
iptables -L -n才是当前生效的,想要统一可以
iptables-save -c > /etc/sysconfig/iptables

iptables-save -c > /root/iptables

iptables的基本组件

规则

规则(rules)是管理员预定义的条件,规则一般的定义为“如果数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。配置防火墙的主要工作就是添加、修改和删除这些规则。

iptables是按照顺序读取规则,上面拒绝所有input只是形象的这么说,千万不能拒绝所有,否则没人连的上服务器了,下面接收某个ip,这个ip也是可以访问的

链(chains)是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一条或数条规则。当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定义的默认策略来处理数据包。

每个链上都有默认的规则

  • PREROUTING:数据包进入本机,进入路由器之前。可以用于目标地址转换(DNAT)。
  • INPUT:通过路由表后目的地为本机。
  • FORWARDING:通过路由表后,目的地不为本机。可以用于转发数据。
  • OUTPUT:由本机产生,向外转发。
  • POSTROUTIONG:通过路由表后,发送到网卡接口之前。可以用于转发数据(SNAT,MASQUERADE)

表(tables)提供特定的功能,iptables有4个表,即raw表、filter表、nat表和mangle表,分别用于实现包过滤,网络地址转换和包重构的功能。表中的规则写在链上。

filter表

主要用于数据报文过滤。该表根据系统管理员预定义的一组规则过滤符合条件的数据包。对于防火墙而言,主要利用在filter表中指定的规则来实现对数据包的过滤。filter表是默认的表,如果没有指定哪个表,iptables 就默认使用filter表来执行所有命令,filter表包含了INPUT链,RORWARD链,OUTPUT链。在filter表中只能允许对数据包进行接受,丢弃的操作,而无法对数据包进行更改。

nat表

主要用于网络地址转换NAT,该表可以实现一对一,一对多,多对多等NAT工作(SNAT,DNAT,PNAT),iptables就是使用该表实现共享上网的,NAT表包含了PREROUTING链,POSTROUTING链,OUTPUT链。

nat规则表拥有 prerouting 和 postrouting 两个规则链,主要功能为进行一对一、一对多、多对多等网址转换工作(SNAT,DNAT),由于转换的特性,需进行目的地网址转换的数据包,就不需要进行来源网址转换,反之亦然,因此为了提升改写封包的效率,在防火墙运作时,每个封包只会经过这个规则表一次。如果我们把数据包过滤的规则定义在这个数据表里,将会造成无法对同一包进行多次比对,因此这个规则表除了作网址转换外,请不要做其它用途。

todo用来修改数据包的ip地址,端口号等信息

mangle表

主要用作功能修改数据报文的属性。比如TCP报文的6个标志位。在内核版本2.4.18 后的linux版本中该表包含的链为:INPUT链(处理进入的数据包),RORWARD链(处理转发的数据包),OUTPUT链(处理本地生成的数据包)POSTROUTING链(修改即将出去的数据包),PREROUTING链(修改即将到来的数据包)

mangle表主要用于对指定数据包进行更改,在内核版本2.4.18 后的linux版本中该表包含的链为:INPUT链(处理进入的数据包),RORWARD链(处理转发的数据包),OUTPUT链(处理本地生成的数据包)POSTROUTING链(修改即将出去的数据包),PREROUTING链(修改即将到来的数据包)。

用来修改数据包的服务类型、生命周期,或者设置mark标记实现流量整形等高级应用

raw表

只使用在PREROUTING链和OUTPUT链上,优先级最高,可以对收到的数据包在连接跟踪前进行处理。一但用户使用了RAW表,在某个链上RAW表处理完后,将跳过NAT表和 ip_conntrack处理,即不再做地址转换和数据包的链接跟踪处理了。

主要用来决定是否对数据包进行状态跟踪

规则表之间的优先顺序:

raw > mangle > nat > filter
在这里插入图片描述

linux防火墙基本原理

Linux防火墙的原理主要是对数据包的控制,看下图(以下图片均来自互联网):netfilter五条链相互关系,即iptables数据包转发流程图。

在这里插入图片描述

  1. 数据包进入网卡时,先进入PREROUTING(路由前)链,之后做路由判断数据包应发往何处,本机或其他机器。
  2. 若数据包原目标地址是本机的,数据包会前往INPUT链。到达INPUT链后,任何进程都会收到它。
  3. 本机程序发送出数据包,数据包会经过OUTPUT链,然后到达POSTROUTING链输出。
  4. 若数据包原目标地址非本机,则需要转发出去的,且内核允许转发,数据包前往 FORWARD链,然后到达POSTROUTING(路由后)链输出。

Netfilter在五个链上,使用HOOK技术做规则检查。

iptables规则执行

iptables执行规则时,是从规则表中从上至下顺序执行的。

没遇到匹配的规则,就一条一条往下匹配;

完全没有匹配的规则,则执行该链上的默认规则;

遇到匹配的规则,则执行规则,执行后根据本规则的动作(accept,reject,log,drop等),决定下一步执行的情况,后续执行一般有三种情况:

  • 继续执行当前规则队列内的下一条规则。比如执行过Filter队列内的LOG后,还会执行Filter队列内的下一条规则。
  • 中止当前规则队列的执行,转到下一条规则队列。比如从执行过accept后就中断Filter队列内其它规则,跳到nat队列规则去执行。
  • 中止所有规则队列的执行。
    在这里插入图片描述

透过这种机制所带来的好处是,可以进行复杂、多重的封包过滤,简单的说,iptables可以进行纵横交错式的过滤(tables)而非链状过滤(chains)。

数据包的状态

包的状态依据IP所包含的协议不同而不同,但在内核外部,也就是用户空间里,只有4种 状态:NEW,ESTABLISHED,RELATED 和INVALID。它们主要是和状态匹配一起使用。

数据包在用户空间的状态:

  • NEW:表示信息包已经或将启动新的连接,或者它与尚未用于发送和接收信息包的连接相关联。若主机向远程机器发送一个连接请求,这个数据包的状态是NEW。
  • ESTABLISHED:状态指出该信息包属于已建立的连接,该连接一直用于发送和接收信息包并且完全有效。在连接建立之后(完成TCP的三次握手之后),远程主机和主机通信数据状态为ESTABLISHED。
  • RELATED:和现有联机相关的新联机封包。像FTP这样的服务,用21端口传送命令,而用20端口(port模式)或其他端口(PASV模式)传送数据。在已有的21端口上建立好连接后发送命令,用20或其他端口传送的数据(FTP-DATA),其状态是RELATED。
  • INVALID:状态指出该信息包与任何已知的流或连接都不相关联,它可能包含错误的数据或头。即无效的数据包,不能被识别属于哪个连接或没有任何状态,通常这种状态的数据包会被丢弃。

这些状态可以一起使用,以便匹配数据包。这可以使防火墙非常强壮和有效。

iptables命令基本语法

基本语法

语法格式:
iptables 【-t 表名】 管理选项{【链名】【匹配条件】 【-j 控制类型】
【-t 表名】如果不指定表名,默认是filter表

管理选项

# 指定默认规则
-P	iptables -P
# 查看iptables列表
-L	iptables -L -t nat
# 在指定链末尾追加一条
-A	iptables -A INPUT
# 在指定链中插入一条新的,未指定序号默认作为第一
-I	iptables -I INPUT 5
# 从规则列表中删除规则
-D	iptables -t nat -D INPUT
# 修改、替换某一条规则
-R	iptables -t nat -R INPUT
# 清除所有规则
-F	iptables -F
# 将指定链(如未指定,则认为是所有链)的所有计数器归零。
-Z	iptables –Z
# 删除指定用户自定义链。
-X	iptables -X
# 以数字形式显示
-n	iptables -L -n’,iptables -nL
# 规则带编号
-n --line-number	iptables -L -n --line-number -t nat

说明:以数字形式显示规则。如果没有-n,规则中可能会出现anywhere,有了-n,它会变成0.0.0.0/0

matches 匹配

匹配选项指定数据包与规则匹配所具有的特征,包括源地址,目的地址,传输协议和端口号,如下所示:

[-i|o 网卡名称]
# 指定数据包从哪个网络接口进入。
-i --in-interface    网络接口名     
# 指定数据包从哪个网络接口输出。
-o --out-interface   网络接口名     

[-p 协议类型]
# 指定数据包匹配的协议,如TCP、UDP和ICMP等
-p --proto		协议类型        

[-s 源IP地址|源子网]
# 指定数据包匹配的源地址
-s --source		源地址或子网   

[--sport 源端口号]
# 指定数据包匹配的源端口号
--sport		源端口号       

[-d 目标IP地址|目标子网]
# 目标地址或子网   指定数据包匹配的目标地址
-d --source          

[--dport 目标端口号]
# 指定数据包匹配的目的端口号
--dport		目的端口号    

[-m 模块]
# 指定数据包规则所使用的过滤模块
-m --match		匹配的模块      

Targets/Jumps(控制选项)

target/jump决定符合条件的包到何处去,语法是<–jump target或-j target。

target可以被细分为两类,Target和Jump。

  • jump的目标是一个在同一个表内的链。
  • target的目标是具体的操作。

target指定要对包做的操作,比如DROP和ACCEPT。不同的target有不同的结果。一些target会使包停止前进,也就是不再继续比较当前链中的其他规则或父链中的其他规则。而另外一些target在对包做完操作之后,包还会继续和其他的规则比较,如LOG,ULOG和TOS。它们会对包进行记录,然后让包通过,以便匹配这条链中的其他规则。有了这样的target,就可以对同一个包既改变它的TTL又改变它的TOS。有些target必须要有准确的参数(如TOS需要确定的数值),有些就不是必须的,但如果我们想指定也可以(如日志的前缀,伪装使用的端口,等等)。

常用Target简述

  • ACCEPT
    当包满足了指定的匹配条件,就会被ACCEPT,允许包前往下一个目的地。不会再去匹配当前链中的其他规则或同一个表内的其他规则,但包还要通过其他表中的链,可能会被DROP。

  • DROP
    当信息包与具有DROP目标的规则完全匹配时,会阻塞该信息包,并且不对它做进一步处理。该目标被指定为-j DROP。

    若包符合条件,该target就会将target丢掉,也就是说包的生命到此结束,效果就是包被阻塞了。

    在某些情况下,这个target会引起意外的结果,因为它不会向发送者返回任何信 息,也不会向路由器返回信息,这就可能会使连接的另一方的sockets因苦等回音而亡:) 解决这个问题的较 好的办法是使用REJECT target,(译者注:因为它在丢弃包的同时还会向发送者返 回一个错误信息,这样另一方就能正常结束),尤其是在阻止端口扫描工具获得更多的信息时,可以隐蔽被 过滤掉的端口等等(译者注:因为扫描工具扫描一个端口时,如果没有返回信息,一般会认为端口未打开或 被防火墙等设备过滤掉了)。还要注意如果包在子链中被DROP了,那么它在主链里也不会再继续前进,不管 是在当前的表还是在其他表里。总之,包死翘翘了

  • REJECT
    REJECT和DROP基本一样,区别在于它除了阻塞包之外, 还向发送者返回错误信息。target还只能用在INPUT、FORWARD、OUTPUT和它们的子链里,而且包含 REJECT的链也只能被它们调用,否则不能发挥作用。它只有一个选项,是用来控制 返回的错误信息的种类的。虽然有很多种类,但如果你有TCP/IP方面的基础知识,就很容易理解它们。

    拦阻该数据包,并返回数据包通知对方,可以返回的数据包有几个选择:ICMP port-unreachable、ICMP echo-reply 或是tcp-reset(这个数据包包会要求对方关闭联机),进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。 范例如下:

iptables -A  INPUT -p TCP --dport 22 -j REJECT --reject-with ICMP echo-reply
  • RETURN
    在规则中设置的RETURN目标让与该规则匹配的信息包停止遍历包含该规则的链。如果链是如INPUT之类的主链,则使用该链的默认策略处理信息包。它被指定为-jump RETURN。

    结束在目前规则链中的过滤程序,返回主规则链继续过滤,如果把自订规则炼看成是一个子程序,那么这个动作,就相当于提早结束子程序并返回到主程序中。

  • REDIRECT
    将封包重新导向到另一个端口(PNAT),进行完此处理动作后,将会继续比对其它规则。这个功能可以用来实作透明代理或用来保护web服务器。

例如:

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT--to-ports 8081
  • LOG
    将数据包相关信息纪录在 /var/log 中,详细位置请查阅 /etc/syslog.conf 配置文件,进行完此处理动作后,将会继续比对其它规则。

例如:

iptables -A INPUT -p tcp -j LOG --log-prefix "input packet"
  • MASQUERADE

改写封包来源IP为防火墙的IP,可以指定port 对应的范围,进行完此处理动作后,直接跳往下一个规则链(mangle:postrouting)。这个功能与 SNAT 略有不同,当进行IP 伪装时,不需指定要伪装成哪个 IP,IP 会从网卡直接读取,当使用拨接连线时,IP 通常是由 ISP 公司的 DHCP服务器指派的,这个时候 MASQUERADE 特别有用。

例如:

iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 21000-31000
  • SNAT

改写封包来源 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将直接跳往下一个规则炼(mangle:postrouting)。

例如:

iptables -t nat -A POSTROUTING -p tcp-o eth0 -j SNAT --to-source 192.168.10.15-192.168.10.160:2100-3200
  • DNAT

    改写数据包包目的地 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将会直接跳往下一个规则链(filter:input 或 filter:forward)。

例如:

iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination 192.168.10.1-192.168.10.10:80-100
  • MIRROR

    镜像数据包,也就是将来源 IP与目的地IP对调后,将数据包返回,进行完此处理动作后,将会中断过滤程序。

  • QUEUE

    中断过滤程序,将封包放入队列,交给其它程序处理。透过自行开发的处理程序,可以进行其它应用,例如:计算联机费用…等。

  • MARK

    将封包标上某个代号,以便提供作为后续过滤的条件判断依据,进行完此处理动作后,将会继续比对其它规则。

    例如:

iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 22

配置实例

针对IP,端口的过滤规则

# sshd的端口为22,若系统直接开放22端口,那么Internet上所有主机都可以连接Linux,这样不安全
# 更好的方法是,仅允许某个范围的IP或某个指定ip,且某范围的端口的主机可以连接主机,其他IP全部拒绝
# 1024:65535 表示端口范围是1024至65535,包括两端的端口在内。
iptables –A INPUT –i ppp0 –p tcp –s 222.91.99.0/28 –-sport 1024:65536 –dport 22 –j ACCEPT
iptables –A INPUT –i ppp0 –p tcp –dport 22 –j DROP

# 以上做法保证了一定的安全性。但由于非法的数据包会被阻塞,因此某些端口扫描工具会提示“该计算机处于防火墙保护状态“,
# 这也是不安全的。要欺骗这些工具,可以使用如下规则:
iptables –A INPUT –i ppp0 –p tcp –s 222.91.99.0/28 –-sport 1024:65536 –dport 22 –j ACCEPT
iptables –A INPUT –i ppp0 –p tcp –dport 22 –j REJECT –reject-with tcp-reset
# 这样的规则,当非法连接服务器时,会发出tcp-reset的请求,这个封包会要求对方关闭连接。这样,服务器会更加安全

# 只允许192.168.0.3的机器进行SSH连接
iptables -A INPUT -s 192.168.0.3 -p tcp --dport 22 -j ACCEPT
# 若要允许,或限制一段IP地址可用 192.168.0.0/24 表示192.168.0.1-255端的所有IP。
# 要记得把 /etc/sysconfig/iptables 里的这一行删了.
# -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
# 这一行表示所有地址都可以登陆。

# ip范围匹配
# 编写ip地址范围匹配时使用“-m iprange --src-range IP范围” 
# “-m iprange --dst-range IP范围” 的形式
# 例1:不允许192.168.100.110-192.168.100.150范围的主机经过防火墙转发数据包
iptables -A FORWARD -p tcp -m iprange --src-range 192.168.100.110-192.168.100.150 -j REJECT

# 若把OUTPUT设置成DROP,则需要使用如下规则:
# 不连续多端口用,   连续多端口用: 包头尾
iptables -A OUTPUT -p tcp --sport 22 -j DROP

# WEB服务器,开启80端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT


# FTP服务器,开启21端口
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 20 -j ACCEPT

# DNS服务器,开启53端口
iptables -A INPUT -p tcp --dport 53 -j ACCEPT

# 允许ping,即允许icmp包通过
iptables -A INPUT -p icmp -j ACCEPT
iptables -A OUTPUT -p icmp -j ACCEPT

# 允许loopback,一般系统都需要允许回环。否则可能导致一些问题。如DNS无法正常关闭。
IPTABLES -A INPUT -i lo -p all -j ACCEPT

# 减少不安全的端口连接
# 有些木马会扫描端口31337到31340(即黑客语言中的 elite 端口)上的服务。既
# 然合法服务都不使用这些非标准端口来通信,
# 阻塞这些端口能够有效地减少网络上可能被感染的机器和它们的远程主服务器进行独立通信的机会。
iptables -A OUTPUT -p tcp --sport 31337 -j DROP

网卡的过滤(网络接口)

# 例:某Linux系统,作为ADSL上网的代理服务器,同时运行WWW服务,有两个网络接口,
# eth0连接局域网,ppp0是ADSL上网的Internet网络接口,添加如下规则。
# 允许局域网内192.168.60.24/24的所有主机访问代理服务器,除了192.168.60.3这台主机:

iptables –A INPUT –i eth0 –s 192.168.60.3 –j DROP
iptables –A INPUT –i eth0 –s 192.168.0/24 –j ACCEPT

注意:两个规则的顺序不能反。

# 例:让Linux代理服务器接受所有的来源不是网络接口ppp0的数据,即仅允许了局域网的访问,局域网的所有主机不能访问Internet
iptables –A input –i !ppp0 –j ACCEPT

邮件服务器端口配置

#smtp:  
iptables -A FORWARD -p tcp --dport 25 -j ACCEPT


#pop3: 
iptables -A FORWARD -p tcp --dport 110 -j ACCEPT  
iptables -A FORWARD -p udp --dport 110 -j ACCEPT


#imap: 
iptables -A FORWARD -p tcp --dport 143 -j ACCEPT
iptables -A FORWARD -p udp --dport 143 -j ACCEPT


#imaps:  
iptables -A FORWARD -p tcp --dport 993 -j ACCEPT  
iptables -A FORWARD -p udp --dport 993 -j ACCEPT


#pop3s:
iptables -A FORWARD -p tcp --dport 995 -j ACCEPT
iptables -A FORWARD -p udp --dport 995 -j ACCEPT

根据数据状态模块的修改

# 允许所有已经建立的和相关的连接 
iptables-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 
iptables-A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
 
# DROP非法连接
iptables -A INPUT -m state --state INVALID -j DROP  
iptables -A OUTPUT -m state --state INVALID -j DROP  
iptables-A FORWARD -m state --state INVALID -j DROP
 

# 丢弃坏的TCP包
iptables -A FORWARD -p TCP ! --syn -m state --state NEW -j DROP
 

# 处理IP碎片数量,防止攻击,允许每秒100个
iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT
 

# 设置ICMP包过滤,允许每秒1个包,限制触发条件是10个包.
iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT

设置NAT表

如图显示外网映射原理:
在这里插入图片描述

# 清除nat表中的规则
iptables -F -t nat
iptables -X -t nat
iptables -Z -t nat
 

# 例:将代理服务器80端口重定向到8009端口,设置规则如下:
iptable –t nat –A PREROUTING –p tcp –dport 80 –j REDIRECT –to-ports 8009
 

# 例:内网机器对外发布WEB网站 
# 内网WEB服务器IP地址为192.168.0.3,当公网客户端访问服务器时,防火墙将请求映射到内网的192.168.0.3的80端口
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.3:80
 

# 例:禁止与211.101.46.253的所有连接
iptables -t nat -A PREROUTING   -d 211.101.46.253 -j DROP
 

# 例:禁用FTP端口
iptables -t nat -A PREROUTING -p tcp --dport 21 -j DROP
 

# 只禁用211.101.46.253地址的FTP连接,其他连接还可以.如web(80端口)连接。
iptables -t nat -A PREROUTING   -p tcp --dport 21 -d 211.101.46.253 -j DROP

配置docker网络

docker与linux的iptables的网络是互相隔离的,如果需要屏蔽一些ip的话可以直接在DOCKER-USER链中配置,具体配置如下,可以配置单个ip、网段和ip范围

如果有不连续的多个ip需要被禁止访问的话,就需要用到ipset,下面的脚本可以直接使用。

Docker与iptables (在DOCKER-USER链中处理)
Docker至少会在iptables规则中自动安装两个新链,一个是DOCKER,一个是DOCKER-USER,可以通过如下方式查看
iptables -S -t nat 查看DOCKER链规则
iptables -S 查看DOCKER-USER链规则
随着docker版本不同,可能还会有其他链,但一般来说,我们应该只修改DOCKER-USER链即可。
如果想要对docker端口做访问限制,可以参考如下规则:

#只允许192.168.1.1访问docker的服务,其中ext_if是你机器上的实际网卡名
iptables -I DOCKER-USER -i ext_if ! -s 192.168.1.1 -j DROP

#只允许网段192.168.1.0/24
iptables -I DOCKER-USER -i ext_if ! -s 192.168.1.0/24 -j DROP

#只允许ip范围
iptables -I DOCKER-USER -m iprange -i ext_if ! --src-range 192.168.1.1-192.168.1.3 -j DROP







# cat << "EOF" > 将以下命令写入到该文件中
cat << "EOF" > /usr/local/shell/add-iptables.sh
#!/bin/bash
# type命令用于显示命令的类型信息
# 它显示命令是别名、shell函数、shell内置函数、磁盘文件还是shell保留字
# 只有安装了命令 或者可执行文件存在,“type”命令才会显示输出
# >/dev/null 2>&1 将标准错误喝标准输出重定向到空设备文件
# 2>&1表示将标准错误输出重定向到标准输出,这样,程序或者命令的正常输出和错误输出就可以在标准输出输出
# || 上一条命令执行失败后,才执行下一条命令
type -P ipset >/dev/null 2>&1 || yum install ipset -y
iptables -F DOCKER-USER
# 休眠1s
sleep 1
# 删除white_docker_ports集合
ipset destroy white_docker_ports
# 创建white_docker_ports集合,以 hash 方式存储,
# hashsize,maxelem,这两个参数分别指定了创建集合时初始的 hash 大小,和最大存储的条目数量。
# family inet 指定ip地址的协议族,inet是ipv4,inet6是ipv6
# -exist 设置超时时间
ipset create -exist white_docker_ports hash:net family inet hashsize 1024 maxelem 100000 timeout 0 comment
ipset add -exist white_docker_ports 192.168.1.100 timeout 0 comment "server01"
ipset add -exist white_docker_ports 192.168.1.102 timeout 0 comment "server02"
iptables -I DOCKER-USER  -m state --state RELATED,ESTABLISHED -j ACCEPT
# eth0 本机网卡
iptables -A DOCKER-USER -i eth0 -p tcp -m set ! --match-set white_docker_ports src -m comment --comment "default whitelist for docker ports" -j DROP
iptables -A DOCKER-USER -j RETURN
EOF
bash /usr/local/shell/add-iptables.sh

自定义链

一般的linux系统iptables配置文件filter表前面都带下面三行,但是具体是什么意思呢!
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]

INPUT:是链名
ACCEPT:是这个链的默认动作
第一个0:匹配默认动作的包的个数
第二个0:匹配默认动作的包的总字节数

[0:0]像这样,中括号内都是0,表示没有限制包的个数和总字节数,匹配的动作可以无限制的流入流出。

# 创建自定义链
# 创建后会有个这个 :IN_WEB - [0:0]
iptables -t filter -N IN_WEB
#示例:在INPUT链中引用刚才创建的自定义链,不引用自定义链不生效
iptables -t filter -I INPUT -p tcp --dport 80 -j IN_WEB

todo 下面的没仔细看

iptables的应用(SNAT和DNAT)

实验环境

内网web服务器:192.168.100.200(CentOS7.6系统)
内网出口防火墙:192.168.100.200,12.0.0.1(CentOS7.6系统两块网卡分别做内网和外网的网关)
外网web服务器:12.0.0.2(CentOS7.6系统)

实验要求

1、内网web服务器经过防火墙nat地址转换之后可以访问外网服务器的web服务
2、外网web服务器经过防火墙nat地址转换之后可以访问内网服务器的web服务

实验准备

关闭所有主机的Firewalld服务,安装iptables-server,开启iptables防火墙,清空所有规则,内网和外网web服务器安装httpd服务并开启

实验步骤

要让内网服务器可以访问外网,第一步需要开启防火墙这台服务器的路由转发功能,相当于把这台linux服务器当做是一个路由器来使用,第二步需要在防火墙的出接口做nat地址转换,将内网的ip转换成出接口的ip地址,这样,访问外网网页的时候其实外网服务器并不感知内网ip
开启防火墙服务器的路由转发功能:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
配置防火墙规则(SNAT):

[root@firewall ~]# iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o ens36 -j SNAT --to-source 12.0.0.1

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
apache的访问日志路径:/var/log/httpd/access_log

apache的错误日志路径:/var/log/httpd/error_log

再配置一条外网经过防火墙的规则(DNAT):

[root@firewall ~]# iptables -t nat -A PREROUTING -d 12.0.0.1 -i ens36 -j DNAT --to-destination 192.168.100.200

在这里插入图片描述
在这里插入图片描述

centos7安装、开启防火墙

注意

背景
我按照下面的执行完之后,由于一些原因,iptables始终开启失败,于是我鬼迷心窍的执行了iptables -F,我的想法是iptables没有开启,那无论执行它的什么命令都不会生效,结果是,与服务器的连接中断了,也就是彻底连不上服务器了,只能重启服务器

下面是网上找的稍微靠谱的答案,供参考:
服务归服务,命令归命令 你在命令行里边使用iptables,那是命令。而服务也是使用的命令,只不过就是长期运行而已。 你在命令行使用drop,他当然会直接把包丢掉啦,这样会话就断开了,和服务没关系的。

CentOS7默认的防火墙不是iptables,而是firewalle.

#先检查是否安装了iptables
service iptables status
#安装iptables
yum install -y iptables
#升级iptables
yum update iptables 
#安装iptables-services
yum install iptables-services
#停止firewalld服务
systemctl stop firewalld
#禁用firewalld服务
systemctl mask firewalld
##########
# 对防火墙不是很了解的,严格执行以下命令就行了,小心导致服务器连不上
##########
#查看iptables现有规则
iptables -L -n
#先允许所有,不然有可能会杯具
iptables -P INPUT ACCEPT
#清空所有默认规则
#########################
# 这条命令一定要在上面那条命令之后执行,
# 且不要单独使用这条命令,否则将导致服务器连不上
#########################
iptables -F
#清空所有自定义规则
iptables -X
#所有计数器归0
iptables -Z
#允许来自于lo接口的数据包(本地访问)
iptables -A INPUT -i lo -j ACCEPT
#开放22端口
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
#开放21端口(FTP)
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
#开放80端口(HTTP)
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
#开放443端口(HTTPS)
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
#允许ping
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
#允许接受本机请求之后的返回数据 RELATED,是为FTP设置的
iptables -A INPUT -m state --state  RELATED,ESTABLISHED -j ACCEPT
#其他入站一律丢弃
iptables -P INPUT DROP
#所有出站一律绿灯
iptables -P OUTPUT ACCEPT
#所有转发一律丢弃
iptables -P FORWARD DROP
service iptables save

#注册iptables服务
#相当于以前的chkconfig iptables on
systemctl enable iptables.service
#开启服务
systemctl start iptables.service
#查看状态
systemctl status iptables.service

启用iptables后,连接速度很慢

# 有时候确实有用,但不知道为什么
iptables -I INPUT -p udp --sport 53 -j ACCEPT
iptables -I INPUT -p tcp --sport 53 -j ACCEPT

firewalld的几条命令

指定端口可以访问
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="111.44.228.246" port protocol="tcp" port="2181" accept"

//
firewall-cmd --zone=public --add-port=9200/tcp --permanent  
firewall-cmd --zone=public --add-port=9300/tcp --permanent  
firewall-cmd --zone=public --add-port=5601/tcp --permanent  
firewall-cmd --zone=public --add-port=9092/tcp --permanent  



systemctl stop firewalld  #禁用
systemctl status firewalld  #查状态
firewall-cmd --reload     # 重新加载后才能生效
netstat -tunlp|grep 5601
查看所有打开的端口: firewall-cmd --zone=public --list-ports



firewall-cmd --list-all


# 配置文件路径
/etc/firewalld/zones

转载自:
https://blog.csdn.net/shengjie87/article/details/107698108
https://zhidao.baidu.com/question/535778419.html
https://www.cnblogs.com/alimac/p/5848372.html
https://blog.csdn.net/weixin_33963189/article/details/85729948
https://www.zsythink.net/archives/1625
https://www.cnblogs.com/sixloop/p/iptables-save-help.html
https://www.cnblogs.com/shijiaqi1066/p/3812510.html#2.1.1%20%E5%BC%80%E5%90%AFiptables%E6%9C%8D%E5%8A%A1
https://bbs.csdn.net/topics/320116590
https://www.cnblogs.com/faberbeta/p/16331841.html#!comments

脱口秀可能更多的还是陪伴吧,也就是观众对于某个问题,他觉得是只有自己,有这方面的问题,他觉得这个问题只困扰到他,
然后当有一天,他看到演员在台上讲的时候,就觉得,哇,原来你也有啊,而且你这个居然还能做成段子,
他会得到一种确认,给他很大的安慰,有的时候,人就是要这种安慰。

脱口秀演员
周奇墨

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐