感谢支持
我们一直在努力

iptables 用法及常用模块总结

iptables传输数据包的过程:

  1. 当一个数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去。

  2. 如果数据包就是进入本机的,它就会沿着图向下移动,到达INPUT链。数据包到了INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包会经过OUTPUT链,然后到达POSTROUTING链输出。

  3. 如果数据包是要转发出去的,且内核允许转发,数据包就会如图所示向右移动,经过FORWARD链,然后到达POSTROUTING链输出。

第一部分:常用显示模块介绍

注意:本文所有实例都是在默认规则为DROP下。

# 开放ssh服务端口
iptables -A INPUT -p tcp –dport 22 -j ACCEPT
iptables -A INPUT -p tcp –sport 22 -j ACCEPT

# 修改默认规则为DROP
iptables -P INPUT DROP
iptables -P OUTPUT DROP

1. multiport: 多端口匹配

    可用于匹配非连续或连续端口;最多指定15个端口;
    实例

iptables -A INPUT -p tcp -m multiport –dport 22,80 -j ACCEPT
iptables -A OUTPUT -p tcp -m multiport –sport 22,80 -j ACCEPT

2. iprange: 匹配指定范围内的地址

    匹配一段连续的地址而非整个网络时有用
    实例:

iptables -A INPUT -p tcp -m iprange –src-range 192.168.118.0-192.168.118.60 –dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp -m iprange –dst-range 192.168.118.0-192.168.118.60 –sport 22 -j ACCEPT

3. string: 字符串匹配,能够检测报文应用层中的字符串

    字符匹配检查高效算法:kmp, bm 
    能够屏蔽非法字符
    实例:

# 注意该条规则需要添加到OUTPUT链,当服务端返回数据报文检查到有关键字”sex”时,则丢弃该报文,可用于web敏感词过滤
iptables -A OUTPUT -p tcp –dport 80 -m string –algo kmp –string “sex” -j DROP

4. connlimit: 连接数限制,对每IP所能够发起并发连接数做限制;

    实例:

# 默认INPUT 为 DROP. 每个ip对ssh服务的访问最大为3个并发连接,超过则丢弃
iptables -A INPUT -p tcp  –dport 22 -m connlimit ! –connlimit-above 3 -j ACCEPT

5. limit: 速率限制
    limit-burst: 设置默认阀值

# 默认放行10个,当到达limit-burst阀值后,平均6秒放行1个
iptables -A INPUT -p icmp -m limit –limit 10/minute –limit-burst 10 -j ACCEPT

6. state: 状态检查

    连接追踪中的状态:
        NEW: 新建立一个会话
        ESTABLISHED:已建立的连接
        RELATED: 有关联关系的连接
        INVALID: 无法识别的连接

# 放行ssh的首次连接状态
iptables -A INPUT -p tcp –dport 22 -m state –state NEW -j ACCEPT   

第二部分:编写常用规则

编写iptables注意:做默认规则drop的时候一定要先开放ssh端口,否则就杯具了。

# 清空自建规则
iptables -F
iptables -X

# 在INPUT链上,tcp为RELATED,ESTABLISHED的数据包为放行
iptables -A INPUT -p tcp -m state –state RELATED,ESTABLISHED -j ACCEPT

# 在INPUT链上,tcp为NEW而且端口为22,80的数据包放行
iptables -A INPUT -p tcp -m state –state NEW -m multiport 22,80 -j ACCEPT

# 在OUTPUT链上,tcp为ESTABLISHED都放行
iptables -A OUTPUT -p tcp -m state –state ESTABLISHED -j ACCEPT

# INPUT链和OUTPUT链默认规则都为DROP状态
iptables -P INPUT DROP
iptables -P OUTPUT DROP

# 打开本地回环地址
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# 允许服务器ping对端主机而不允许对端主机ping服务器
iptables -A OUTPUT -p icmp –icmp-type 8 -j ACCEPT
iptables -A INPUT -p icmp –icmp-type 0 -j ACCEPT

# 开放主机对dns的访问
iptables -A INPUT -p udp –sport 53 -j ACCEPT
iptables -A OUTPUT -p udp –dport 53 -j ACCEPT

第三部分:针对特定的服务定制相关规则

1. 对ssh进行管控,1小时内最多发起5个连接,防止黑客暴力破解ssh

# 清空默认规则
iptables -F
iptables -X

# 添加已建立的连接规则
iptables -A INPUT -p tcp -m state –state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -m state –state ESTABLISHED -j ACCEPT

# 设置默认规则
iptables -P INPUT DROP
iptables -P OUTPUT DROP

# 设置iptables记录匹配ssh规则
iptables -I INPUT  2 -p tcp –syn -m state –state NEW -j LOG –log-level 5 –log-prefix “[SSH Login]:”

# 使用recent显示模块限定每小时最多匹配到5次,超过则丢弃。
iptables -A INPUT -p tcp –syn -m state –state NEW -m recent –name OPENSSH –update –seconds 3600 –hitcount 5 -j DROP
iptables -A INPUT -p tcp –syn -m state –state NEW -m recent –name OPENSSH –set -j ACCEPT

2. 对web服务进行并发管控,防止Ddos

# 清空默认规则
iptables -F
iptables -X

# 添加已建立的连接规则
iptables -A INPUT -p tcp -m state –state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -m state –state ESTABLISHED -j ACCEPT

# 设置默认规则
iptables -P INPUT DROP
iptables -P OUTPUT DROP

# 每个ip的并发连接请求最大50,超过则丢弃,建议调大值,容易误伤nat上网用户
iptables -A INPUT -p tcp –syn –dport 80 -m state –state NEW -m connlimit ! –connlimit-above 50 -j DROP

3. 对icmp进行流控,防止icmp攻击

# 清空默认规则
iptables -F
iptables -X

# 添加已建立的连接规则
iptables -A INPUT -p tcp -m state –state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -m state –state ESTABLISHED -j ACCEPT

# 设置默认规则
iptables -P INPUT DROP
iptables -P OUTPUT DROP

# 利用limit模块限制icmp速率,阀值为10个,当到达10个后,限速每秒钟1个
iptables -A INPUT -p icmp –icmp-type 0 -m limit –limit 1/s –limit-burst 10 -j ACCEPT

第四部分:NAT 常用规则

站在服务器的角度:

  当内网服务器要访问外网时,需要做源地址转换;

# 打开转发功能
sysctl -w net.ipv4.ip_forward=1

# 把 192.168.1.0 网段流出的数据的 source ip address 修改成为 10.0.0.11:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT –to-source 10.0.0.11

  当外网主机要访问内网服务器服务时,需要做目标地址转换;

# 打开转发功能
sysctl -w net.ipv4.ip_forward=1

# 把访问 10.0.0.11:2222 的访问转发到 192.168.1.11:22 上::
iptables -t nat -A PREROUTING -d 10.0.0.11 -p tcp –dport 2222 -j DNAT –to-destination 192.168.1.11:22

  单纯的将访问本机80端口的请求转发到8080上

iptables -t nat -A PREROUTING -p tcp –dport 80 -j REDIRECT –to-port 8080

补充:

iptables 独立日志配置:

  当在iptables中启用日志记录时,会被当做系统日志记录到/var/log/message里面,如果想要独立日志配置如下:

grep -r ‘iptables’ /etc/rsyslog.conf
kern.*                            /var/log/iptables.log

systemctl restart rsyslog

在 /etc/rsyslog.conf 中添加一条规则,并重启服务。

更多iptables相关教程见以下内容

CentOS 7.0关闭默认防火墙启用iptables防火墙  http://www.linuxidc.com/Linux/2015-05/117473.htm

Iptables工作原理使用详解 http://www.linuxidc.com/Linux/2016-09/134945.htm

Ubuntu 14.04 配置iptables防火墙 http://www.linuxidc.com/Linux/2017-02/140556.htm

Linux下编译安装iptables  http://www.linuxidc.com/Linux/2017-04/142615.htm

iptables的备份、恢复及防火墙脚本的基本使用 http://www.linuxidc.com/Linux/2013-08/88535.htm

Iptables工作原理使用详解  http://www.linuxidc.com/Linux/2016-09/134945.htm

CentOS7下iptables配置过程 http://www.linuxidc.com/Linux/2017-01/139622.htm

Linux下iptables防火墙设置 http://www.linuxidc.com/Linux/2015-10/123843.htm

Linux防火墙iptables详解  http://www.linuxidc.com/Linux/2016-12/138474.htm

本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-10/147347.htm

赞(0) 打赏
转载请注明出处:服务器评测 » iptables 用法及常用模块总结
分享到: 更多 (0)

听说打赏我的人,都进福布斯排行榜啦!

支付宝扫一扫打赏

微信扫一扫打赏