Linux安全之iptables高级特性


纸上得来终觉浅,绝知此事要躬行。

iptables 是运行在用户空间的应用软件,通过控制 Linux 内核 netfilter 模块,来管理网络数据包的处理和转发。在大部分 Linux 发行版中,可以通过手册页 或 man iptables 获取用户手册。通常 iptables 需要内核模块支持才能运行,此处相应的内核模块通常是 Xtables

Linux安全之iptables高级特性


1. recent 模块

利用iptablesrecent模块来抵御DOS攻击(CC 攻击

  • 建立一个列表,保存有所有访问过指定的服务的客户端 IP 地址
# 1
# 利用connlimit模块将单IP地址ssh远程连接的并发设置为3
# 会误杀使用NAT上网的用户,可以根据实际情况增大该值
$ sudo iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP
# 2
# 利用recent和state模块限制单IP在300s内只能与本机建立2个新连接,被限制五分钟后即可恢复访问
$ sudo iptables -I INPUT -p tcp --dport 22 -m state \
    --state NEW -m recent --set --name SSH

$ sudo iptables -I INPUT -p tcp --dport 22 -m state \
    --state NEW -m recent --update --seconds 300 --hitcount 3 \
    --name SSH -j LOG --log-prefix "SSH Attach: "

$ sudo iptables -I INPUT -p tcp --dport 22 -m state \
    --state NEW -m recent --update --seconds 300 --hitcount 3 \
    --name SSH -j DROP
  • 下面对最后两句做一个说明
# 1.第二句是记录访问tcp 22端口的新连接,记录名称为SSH
--set 记录数据包的来源IP,如果IP已经存在将更新已经存在的条目

# 2.第三句是指SSH记录中的IP,300s内发起超过3次连接则拒绝此IP的连接。
--update 是指每次建立连接都更新列表;
--seconds必须与--rcheck或者--update同时使用
--hitcount必须与--rcheck或者--update同时使用

# 3.iptables的记录:/proc/net/xt_recent/SSH,也可以使用下面的这句记录日志
$ sudo iptables -A INPUT -p tcp --dport 22 -m state \
    --state NEW -m recent --update --name SSH --second 300 \
    --hitcount 3 -j LOG --log-prefix "SSH Attack"

2. layer7 模块

利用iptableslayer7模块能够识别应用层协议,实现七层访问过滤:对应用层协议进行限制,如微信等。

  • 使用需求

    • 对内核中的**netfilter,打补丁layer7**,重新编译内核
    • 对**iptables打补丁,补上layer7模块,重新iptables**
  • 编译内核方法

$ sudo make menuconfig
$ sudo make -j xxx
$ sudo make modules_install
$ sudo make install
  • 总结操作步骤
# 1、获取并编译内核
$ sudo useradd mockbuild
$ sudo rpm -ivh kernel-2.6.32-431.5.1.x86_64.el6.src.rpm
$ sudo cd rpmbuild/SOURCES
$ sudo tar linux-2.6.32-*.tar.gz -C /usr/src
$ sudo cd /usr/src
$ sudo ln -sv

# 2、给内核打补丁
$ sudo tar xf netfilter-layer7-v2.23.tar.bz2
$ sudo cd /usr/src/linux
$ sudo patch -p1 < /root/netfilter-layer7-v2.23/kernel-2.6.32-layer7-2.23.patch
$ sudo cp /boot/config-*  .config
$ sudo make menuconfig

# 3、按如下步骤启用layer7模块
Networking support → Networking Options →Network packet filtering framework → Core Netfilter Configuration
<M>  “layer7” match support

# 4、编译并安装内核
$ sudo make
$ sudo make modules_install
$ sudo make install

# 5、重启系统,启用新内核
$ sudo reboot

# 6、编译iptables
$ sudo tar xf iptables-1.4.20.tar.gz
$ sudo cp /root/netfilter-layer7-v2.23/iptables-1.4.3forward-for-kernel-2.6.20forward/* /root/iptables-1.4.20/extensions/
$ sudo cp /etc/rc.d/init.d/iptales /root
$ sudo cp /etc/sysconfig/iptables-config /root
$ sudo rpm -e iptables iptables-ipv6 --nodeps
$ sudo ./configure  --prefix=/usr  --with-ksource=/usr/src/linux
$ sudo make && make install
$ sudo cp /root/iptables /etc/rc.d/init.d
$ sudo cp /root/iptables-config /etc/sysconfig

# 7、为layer7模块提供其所识别的协议的特征码
$ sudo tar zxvf l7-protocols-2009-05-28.tar.gz
$ sudo cd l7-protocols-2009-05-28
$ sudo make install

# 8、如何使用layer7模块
# ACCT的功能已经可以在内核参数中按需启用或禁用。此参数需要装载nf_conntrack模块后方能生效。
net.netfilter.nf_conntrack_acct = 1
l7-filter uses the standard iptables extension syntax

$ sudo iptables [specify table & chain] -m layer7 --l7proto [protocol name] -j [action]
$ sudo iptables -A FORWARD -m layer7 --l7proto qq -j REJECT

提示:xt_layer7.ko 依赖于 nf_conntrack.ko 模块


文章作者: Escape
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Escape !
  目录