我相信 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
echo 1 > /proc/sys/net/ipv4/ip_forward
/sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
步骤 1 设置内核参数以允许 ip 转发,步骤 2 设置在接口 eth0 上启用 NAT 的 iptables 规则。