HU YUAN 的博客

导航

Linux iptables

防火墙概述:

    1、防火墙工作在主机边缘:对于进出本网络或者本主机的数据报文,根据事先设定好的检查规则对其检查,对所有的报文一律按照事先定义好的处理机制做出相应处理

    2、linux的tcp/ip协议栈是在内核当中,意味着报文的处理是在内核中处理的,也就是说防火墙必须在工作在内核中,防火墙必须在内核中完成tcp/ip报文所流进的位置,用规则去检查,才真正能工作起来

    3、在linux中真正实现防火墙功能的是处于内核空间中的netfilter,但是内核空间用户无法直接操作,所以linux上诞生了一个netfilter的管理软件,可以让用户通过这个软件在netfilter做一系列操作,这个软件就是iptables

 

Netfilter:
  Netfilter 是 Linux 操作系统内核的一个数据包处理模块, 它具有如下功能:
    网络地址转换(NAT)
    数据包内容修改
    以及数据包过滤的防火墙功能

  Netfilter 中制定了数据包的五个挂载点(Hook Point), 即 iptables 中的 "五链"
  这五个挂载点, 我们可以理解为回调函数, 数据包到达指定位置时会主动调用对应函数, 根据这些函数中定义的规则处理数据包
  这5个挂载点分别是:
    PRE_ROUTING
    INPUT
    OUTPUT
    FORWARD
    POST_ROUTING

  数据包的流入顺序:
    数据包从网络接口进入 TCP/IP 协议栈, 进行IP校验以后, 数据包被第一个钩子函数 PRE_ROUTING 处理, 然后就进入路由模块, 由其决定该数据包是转发出去还是送给本机
    若该数据包是送给本机的, 则经过 LOCAL_IN(INPUT) 处理后传递给本机的上层协议
    若该数据包应该被转发, 则将其交给 FORWARD 处理, 然后经过 POST_ROUTING 处理后传输到网络
    本机进程产生的数据包则要先经 LOCAL_OUT(OUTPUT) 处理后, 再进行路由选择处理, 然后经过 POST_ROUTING 处理后再发送到网络

    

 

iptables:
  Netfilter 设置的规则存放于内核内存之中, 而 iptables 是一个应用层的应用程序, 它通过 Netfilter 暴露的接口来对存放在内核内存中的 XXtables(Netfilter的配置表)进行操作
  XXtables 由表(tables)、链(chains)、规则(rules) 组成, iptables 在应用层负责修改这些规则, 类似的应用程序还有 firewalld(centos 7中默认的防火墙应用程序)

          

 

 

iptables 处理数据包的完整流程:

          

 

iptables 表和链:

filter:
  用于对数据包进行过滤, 内置三个链, 可以对包进行 DROP、LOG、ACCEPT 和 REJECT 等操作 
  内置的链:
    INPUT	用于对入口流量包进行检测
    FORWARD	过滤所有不是本地产生的并且目的地不是本地(即本机只是负责转发)的包
    OUTPUT	用于对出口流量包进行检测


nat:
  主要用于修改数据包的IP地址、端口号等信息, 内置三个链, 可实现 SNAT、DNAT、MASQUERADE、REDIRECT 等操作
  属于一个流的包(因为包的大小限制导致数据可能会被分成多个数据包), 只会经过这个表一次
  如果第一个包被允许做 NAT 或 MASQUERADE, 那么余下的包都会自动地被做相同的操作, 也就是说, 余下的包不会再通过这个表
  内置的链:
    PREROUTING	对入口方向到达 nat 表的数据包进行修改(可实现 DNAT 功能)
    OUTPUT	改变本地产生的包的目的地址
    POSTROUTING	对出口方向到达 nat 表的数据包进行修改(可实现 SNAT 功能)


mangle:
  用于修改数据包属性等操作, 需要相应的路由设备支持, 内置五个链
  内置的链:
    PREROUTING
    POSTROUTING
    INPUT
    OUTPUT
    FORWARD


raw:
  对数据包进行状态跟踪, 内置二个链
  内置的链:
    OUTPUT
    PREROUTING

 

iptables 处理数据包的动作:

ACCEPT			允许数据包通过
DROP			直接丢弃数据包, 不给任何回应信息
REJECT			拒绝数据包通过, 必要时会给数据发送端一个响应的信息
SNAT			源地址转换, 主要用于实现多个内网用户用同一个公网地址上网的问题
MASQUERADE		地址伪装, 在 iptables 中有着和 SNAT 相近的效果
	区别:
		SNAT 是指定数据包从网卡发送出去的时候, 把数据包中的源地址部分替换为指定的IP, 这样接收方就认为数据包的来源是被替换的那个IP的主机
		MASQUERADE 是用发送数据的网卡上的IP来替换源IP, 因此对于 IP 不固定的场合, 比如拨号网络或者通过 dhcp 分配 IP 的情况下, 必须用 MASQUERADE

DNAT			目标地址转换, 主要用于服务发布
REDIRECT		是 DNAT 的一种特殊形式, 将封包重新导向到另一个端口(PNAT), 主要用于实现端口转发
LOG				在 /var/log/messages 文件中记录日志信息, 然后将数据包传递给下一条规则

注意: 除 LOG 动作以外, 其他的动作只有匹配到相应的规则之, 该数据包就不会再往下继续匹配了, 所以规则顺序极其关键

 

iptables 命令:

-t					指定操作的表, 默认为filter
-A					新增一条规则到该规则链列表的最后一行
-I					插入一条规则原本该位置上的规则会往后顺序移动, 默认插入在第一条规则前面
-D					从规则链中删除一条规则, 可以输入完整的规则或者指定规则编号
-R					修改指定规则
-P					设置指定规则链的默认动作
-F					清空指定表的规则链
-N					在指定表上新建规则链(iptables 支持自定义规则链)
-X					删除用户自定义的空链, 如果链不为空需要清空之后才能删除
-E					重命名自定义链
-Z					清空链和规则计数器
-L					查看指定表上正在运行的 iptables 规则
-n					禁止对 IP 地址或端口进行反解(通常和 -L 参数一起使用)
-v					显示规则的详细信息
-vv					相对与 -v 更加详细
--line-numbers		显示规则在链上的规则编号
-i					数据包从那个网卡进入
-o					数据包从那个网卡出去
-s					数据包的原地址
--sport				数据包的原端口
-d					数据包的目的地址
--dport				数据包的目的端口
-j					处理数据包的动作, ACCEPT、DROP、REJECT 等
-m					用于提供更多的匹配参数
	例如:
		-m state –state ESTABLISHED,RELATED
		-m tcp –dport 22
		-m multiport –dports 80,8080
		-m tcp -p tcp --dport 40001:40030

 

iptables 规则编写示例:

# 清空 filter 表的规则
iptables -F

# 设置 filter 表的 INPUT 链的默认动作为 DROP
iptables -P INPUT DROP

# 只允许 192.168.0.0/24 网段的 IP 访问 22 端口
iptables -A INPUT -s 192.168.0.0/24 -p tcp --dport 22 -j ACCEPT

# 修改 filter 表的第一条 INPUT 规则, 将允许192.168.0.0/24 访问 22 端口改为允许 192.168.1.0/24 访问
iptables -R INPUT 1 -s 192.168.1.0/24

# 运行所有地址访问 80 端口(-s 和 -d 省略都表示 0.0.0.0)
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

# 允许 ping
iptables -A INPUT -p ICMP  -j ACCEPT

# 删除 filter 表中  INPUT 链上的第 3 条规则
iptables -D INPUT 3

# 屏蔽 mac 为 00:00:00:00:00:00 的数据包
iptables -A INPUT -m mac --mac-source 00:00:00:00:00:00 -j DROP

# 丢弃无效数据包
iptables -A INPUT -m state --state INVALID -j DROP

# 禁止所有数据包发往 eth0
iptables -A INPUT -i eth0 -j DROP

# 允许访问回环网卡
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# 限制 80 端口的并发连接数为 2000, 需要 iptables v1.4.19 以上版本
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 2000 -j REJECT

# 记录日志, 限制日志记录频率 3 分钟记录 8 次 
iptables -R INPUT 1 -p tcp --dport 22 -m limit --limit 3/minute --limit-burst 8 -j LOG


地址转换:
  SNAT:
    需求: 目前只有一台服务器拥有外网 IP 但是内网的其他服务器都需要访问外网
      A 服务器: 拥有外网 IP 的服务器
	    外网IP: 123.123.124.125
	    内网IP: 192.168.0.104
	  B 服务器: 需要访问外网的服务器
	    内网IP: 192.168.0.105

	  A 服务器配置:
	     # 打开路由转发(临时生效, 永久生效请修改 /etc/sysctl.conf 文件)
	    sysctl -w net.ipv4.ip_forward=1

	    # 允许 192.168.0.0/24 进行原地址转换, eth1 为外网 IP 所在的网卡, 123.123.124.125 为外网 IP
	   iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth1 -j SNAT --to-source 123.123.124.125

	 B 服务器配置:
	    # 将默认路由指向 SNAT 服务器
	    route add default gw 192.168.0.104


  DNAT:
    需求: 使外网主机可以通过特定端口 ssh 内网的服务器
      A 服务器: 拥有外网 IP 的服务器
	    外网IP: 123.123.124.125
	    内网IP: 192.168.0.104
	 B 服务器: 需要访问外网的服务器
	    内网IP: 192.168.0.105

	 A 服务器配置:
	    # 打开路由转发(临时生效, 永久生效请修改 /etc/sysctl.conf 文件)
	    sysctl -w net.ipv4.ip_forward=1

	    # 将访问 2183 端口的数据包转发到 192.168.0.183 的 22 端口, eth1 为外网 IP 所在的网卡, 123.123.124.125 为外网 IP
	   iptables -t nat -A PREROUTING -i eth1 -d 123.123.124.125 -p tcp --dport 2183 -j DNAT --to-destination 192.168.0.183:22

	  B 服务器配置:
	    # 将默认路由指向 SNAT 服务器
	    route add default gw 192.168.0.104


  防止轻微的攻击:
	# 防止 SYN 攻击
	iptables -N syn-flood
	iptables -A INPUT -p tcp --syn -j syn-flood   
	iptables -I syn-flood -p tcp -m limit --limit 2/s --limit-burst 5 -j RETURN   
	iptables -A syn-flood -j REJECT


	# 防止 DOS 太多连接进来, 允许外网网卡每个 IP 最多15个初始连接, 需要 iptables v1.4.19以上版本
	iptables -A INPUT -i eth0 -p tcp --syn-m connlimit --connlimit-above 15 -j DROP   
	iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT


	#防止 DDOS   
	iptables -A INPUT -p tcp --syn -m limit --limit 5/s --limit-burst 10 -j ACCEPT  
	iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT 

	iptables -A FORWARD -p icmp -m limit --limit 2/s --limit-burst 10 -j ACCEPT
	iptables -A INPUT -p icmp --icmp-type 0 -s ! 172.29.73.0/24 -j DROP

  

iptables规则持久化和备份:

# 持久化, 将规则写入到 /etc/sysconfig/iptables 文件
service iptables save

# 将 iptables 规则备份到 /root/iptables.bak 文件
iptables-save > /root/iptables.bak

# 还原 iptables 规则
iptables-restore < /root/iptables.bak	 

 

 

posted on 2018-11-12 17:44  HuYuanBlog  阅读(451)  评论(0编辑  收藏  举报