iptables 技巧和窍门

iptables 技巧和窍门

我相信 Linux 系统管理员一定非常熟悉iptables,用户空间接口netfilter数据包过滤框架。

现在,这个“问题”意味着社区维基用于收集各种智慧的点点滴滴iptables。没有什么是太常见或太晦涩的。发布任何你知道的可以帮助别人充分利用的东西iptables

答案1

使用 iptables 的白名单和黑名单

#!/bin/bash

WHITELIST=/whitelist.txt
BLACKLIST=/blacklist.txt

#THIS WILL CLEAR ALL EXISTING RULES!
echo 'Clearing all rules'
iptables -F

#
## Whitelist
#

for x in `grep -v ^# $WHITELIST | awk '{print $1}'`; do
        echo "Permitting $x..."
        $IPTABLES -A INPUT -t filter -s $x -j ACCEPT
done

#
## Blacklist
#

for x in `grep -v ^# $BLACKLIST | awk '{print $1}'`; do
        echo "Denying $x..."
        $IPTABLES -A INPUT -t filter -s $x -j DROP
done

打开端口的脚本

#!/bin/bash
ALLOWEDTCP="80 3128 3784"
ALLOWEDUDP="3128 3784"

#
## Permitted Ports
#

for port in $ALLOWEDTCP; do
       echo "Accepting port TCP $port..."
       $IPTABLES -A INPUT -t filter -p tcp --dport $port -j ACCEPT
done

for port in $ALLOWEDUDP; do
        echo "Accepting port UDP $port..."
        $IPTABLES -A INPUT -t filter -p udp --dport $port -j ACCEPT
done

阻止端口扫描

# Attempt to block portscans
# Anyone who tried to portscan us is locked out for an entire day.
iptables -A INPUT   -m recent --name portscan --rcheck --seconds 86400 -j DROP
iptables -A FORWARD -m recent --name portscan --rcheck --seconds 86400 -j DROP

# Once the day has passed, remove them from the portscan list
iptables -A INPUT   -m recent --name portscan --remove
iptables -A FORWARD -m recent --name portscan --remove

# These rules add scanners to the portscan list, and log the attempt.
iptables -A INPUT   -p tcp -m tcp --dport 139 -m recent --name portscan --set -j LOG --log-prefix "Portscan:"
iptables -A INPUT   -p tcp -m tcp --dport 139 -m recent --name portscan --set -j DROP

iptables -A FORWARD -p tcp -m tcp --dport 139 -m recent --name portscan --set -j LOG --log-prefix "Portscan:"
iptables -A FORWARD -p tcp -m tcp --dport 139 -m recent --name portscan --set -j DROP

欺骗/无效数据包

# Reject spoofed packets
# These adresses are mostly used for LAN's, so if these would come to a WAN-only server, drop them.
iptables -A INPUT -s 10.0.0.0/8 -j DROP
iptables -A INPUT -s 169.254.0.0/16 -j DROP
iptables -A INPUT -s 172.16.0.0/12 -j DROP
iptables -A INPUT -s 127.0.0.0/8 -j DROP

#Multicast-adresses.
iptables -A INPUT -s 224.0.0.0/4 -j DROP
iptables -A INPUT -d 224.0.0.0/4 -j DROP
iptables -A INPUT -s 240.0.0.0/5 -j DROP
iptables -A INPUT -d 240.0.0.0/5 -j DROP
iptables -A INPUT -s 0.0.0.0/8 -j DROP
iptables -A INPUT -d 0.0.0.0/8 -j DROP
iptables -A INPUT -d 239.255.255.0/24 -j DROP
iptables -A INPUT -d 255.255.255.255 -j DROP

# Drop all invalid packets
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A FORWARD -m state --state INVALID -j DROP
iptables -A OUTPUT -m state --state INVALID -j DROP

阻止 Smurf 攻击

# Stop smurf attacks
iptables -A INPUT -p icmp -m icmp --icmp-type address-mask-request -j DROP
iptables -A INPUT -p icmp -m icmp --icmp-type timestamp-request -j DROP
iptables -A INPUT -p icmp -m icmp -j DROP

# Drop excessive RST packets to avoid smurf attacks
iptables -A INPUT -p tcp -m tcp --tcp-flags RST RST -m limit --limit 2/second --limit-burst 2 -j ACCEPT

阻止 ICMP(又名 ping)

# Don't allow pings through
iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j DROP

答案2

使用以下方法优化 netfilter 的性能ipset

如果你写一个很多考虑使用基于纯 IP、端口或者两者的类似规则ipset来优化 netfilter 的性能。

例如:

iptables -s 192.168.1.11 -j ACCEPT
iptables -s 192.168.1.27 -j ACCEPT
iptables -s 192.168.1.44 -j ACCEPT
... hundreds of similar rules ...
iptables -s 192.168.251.177 -j ACCEPT

这意味着源地址为 192.168.251.177 的数据包必须首先遍历数百规则,然后才能得到“接受”的裁决。

当然,经验丰富的系统管理员会按子网划分规则。但那仍然意味着数百条规则。

ipset来救援!

首先,定义一个 IP Setipmap类型:

ipset -N Allowed_Hosts ipmap --network 192.168.0.0/16

然后,用地址填充它:

for ip in $LIST_OF_ALLOWED_IP; do ipset -A Allowed_Hosts $ip; done

最后,将上面的数百条 iptables 规则替换为规则:

iptables -m set --match-set Allowed_Hosts src -j ACCEPT

当数据包到达时,netfilter 将执行很快根据 IP 集对数据包的源 (src) IP 进行位图搜索Allowed_Hosts。来自 192.168.0.0/16 的所有数据包都将经历规则。请相信我,搜索位图至少比执行数百条 iptables 规则检查快两个数量级。

ipset不仅限于 IP 地址。它还可以根据端口、IP 端口元组、网络/子网地址、IP-MAC 元组等进行匹配。它可以将这些条件作为源或目标或两者的混合进行匹配(在元组的情况下)。

最后,ipset您可以自动将 IP 地址放入黑名单/白名单。这些黑名单/白名单也可以“老化”,从而在经过一段可配置的时间后自动删除 IP 地址。

请参阅ipset的手册页更多细节。

非常重要的提示:

一些 Linux 发行版可能不是有“开箱即用”支持(例如 Ubuntu 10.04 有此问题)。在这些系统上,一种方法是从源代码ipset安装。ipset

相反,ipset从其网站下载的源代码:http://ipset.netfilter.org/install.html

或者,如果你使用xtables-addons、ipset包含在其来源中:http://xtables-addons.sourceforge.net/

答案3

向您的规则添加注释:

-m comment --comment "Comments help to read output of iptables -nvL"

答案4

启用 NAT

  1. echo 1 > /proc/sys/net/ipv4/ip_forward
  2. /sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

步骤 1 设置内核参数以允许 ip 转发,步骤 2 设置在接口 eth0 上启用 NAT 的 iptables 规则。

相关内容