文章目录
iptables 学习
iptables是Linux系统上用于设置、维护和检查IPv4数据包过滤规则的命令行工具。它允许系统管理员配置网络传输中的数据包的过滤规则,这些规则决定了数据包的去向(比如是被接受、拒绝还是转发)。
iptables基本组件:
-
表(Tables):iptables有几个内置的表,每个表包含一组特定的链。最常用的表有filter(默认)、nat和mangle。
-
filter:用于过滤数据包,如防火墙规则。
-
nat:用于网络地址转换(如端口转发)。
-
mangle:用于特殊的数据包修改(如修改TTL值)。
-
-
链(Chains):每个表中包含多个链,链是实际应用规则的地方。常见的链有INPUT、FORWARD和OUTPUT。
-
INPUT:处理进入本机的数据包。
-
FORWARD:处理经过本机转发到其他设备的数据包。
-
OUTPUT:处理由本机发出的数据包。
-
-
规则(Rules):在链中定义的具体操作,决定了匹配特定条件的数据包应当如何处理。
常用iptables命令:
- 查看规则
iptables -L
iptables -t nat -L
- 添加规则
#允许所有进入22端口(SSH)的TCP连接。
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
- 删除规则
#删除上面添加的规则
iptables -D INPUT -p tcp --dport 22 -j ACCEPT
-
修改规则
- 修改规则通常涉及删除旧规则并添加新规则。
-
保存规则
- 规则默认不会在系统重启后保留,可使用iptables-save > /path/to/your_rules.v4来保存当前的规则集合,并在系统启动时通过iptables-restore < /path/to/your_rules.v4恢复。
-
设置默认策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
iptables -L 输出及解释
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
2 ACCEPT icmp -- anywhere anywhere
3 DROP all -- anywhere anywhere
Chain FORWARD (policy DROP)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- anywhere anywhere
解释:
- Chain:显示当前的链名称(如INPUT、FORWARD、OUTPUT)以及该链的默认策略(如ACCEPT、DROP)。
- num:规则的序号,表示规则在链中的顺序。
- target:如果数据包匹配这条规则,将执行的动作(如ACCEPT、DROP、REJECT)。
- prot:匹配规则的协议类型(如tcp、udp、icmp或all)。
- opt:这一列通常为空,或者显示一些特定选项。
- source和destination:分别表示数据包的来源地址和目标地址。"anywhere"表示匹配任何地址。
- 其他列:可能会显示更多的匹配条件或者选项,比如端口号(–dport)、状态(state RELATED,ESTABLISHED)等。
iptables “奇淫巧技”
iptables的一些高级用法。
端口转发(port forwarding)
如果你想将到达某一端口的流量转发到另一个端口(甚至是另一台机器),iptables可以帮助你实现
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
流量重定向到透明代理
你可以将流量重定向到本地的透明代理服务器,进行内容过滤或缓存等操作:
此规则将所有到达80端口(HTTP)的流量重定向到本机的3128端口,假设在该端口上运行着一个透明代理服务。
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3128
防止DDoS攻击
利用iptables的限速功能,你可以防止简单的DDoS攻击:
这条规则允许每分钟最多25个连接到端口80,超过这个数目的连接会被丢弃,直到下一个时间窗口。
iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
防止SYN洪泛攻击
SYN洪泛是一种常见的DoS攻击方式。使用以下规则可以帮助缓解这种攻击:
第一条规则丢弃所有标记为NEW但不是SYN包的TCP连接请求,这是因为正常的新建连接请求应该是SYN包。第二条规则限制了SYN包的接收速率,以防止过多的SYN请求耗尽服务器资源。
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT
黑名单
如果你想阻止某个特定IP地址或IP段与你的服务器通信:
这条规则会丢弃所有从123.456.789.0/24这个IP段来的数据包。
iptables -A INPUT -s 123.456.789.0/24 -j DROP
使用状态模块跟踪连接
利用conntrack模块,iptables可以根据连接的状态(如NEW、ESTABLISHED、RELATED等)来匹配数据包:这条规则允许所有已建立或相关的连接通过。
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
状态检测
利用conntrack模块,iptables可以根据连接的状态(如ESTABLISHED,RELATED)来匹配数据包,这对于允许响应流量而不是新建连接非常有用。
这条规则允许所有已建立或相关联的连接的数据包通过,这样可以确保只允许对已经被允许的外部请求做出响应。
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
防止端口扫描
利用recent模块,可以防止恶意用户扫描你的端口:
如果在60秒内有10次或以上的尝试连接到80端口,那么这个IP地址会被暂时加入黑名单。
iptables -A INPUT -m recent --name portscan --rcheck --seconds 60 --hitcount 10 -j DROP
iptables -A INPUT -p tcp --dport 80 -m recent --name portscan --set -j ACCEPT
动态防火墙规则
利用recent模块,iptables能够动态地创建规则来防止暴力破解攻击。例如,限制SSH连接尝试:
这组规则会跟踪尝试连接到22端口的IP地址,并且如果在60秒内尝试了超过3次,则接下来的尝试会被自动丢弃。
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP
使用自定义链
日志记录
为了更好地组织和管理规则,你可以创建自定义链。例如,创建一个专门用于日志记录的链:
这里创建了一个名为LOGGING的自定义链,所有输入链的数据包都会被转发到这个自定义链。在LOGGING链中,我们限制了日志记录的频率,并在日志消息中添加了前缀,最后丢弃了这些数据包。
iptables -N LOGGING
iptables -A INPUT -j LOGGING
iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables Packet Dropped: " --log-level 4
iptables -A LOGGING -j DROP
日志集中处理
创建一个专门用于日志记录的链,可以让您更容易地管理和查看日志信息。
示例:创建一个名为LOGGING的链用于记录被拒绝的数据包信息
这些规则创建了一个名为LOGGING的自定义链,用于限制日志记录的频率并添加特定前缀。任何尝试连接到80端口的TCP流量都会被重定向到这个链,并最终被丢弃。
iptables -N LOGGING
iptables -A LOGGING -m limit --limit 5/min -j LOG --log-prefix "Dropped: " --log-level 4
iptables -A LOGGING -j DROP
iptables -A INPUT -p tcp --dport 80 -j LOGGING
动态防御
利用自定义链实现动态防御措施,如针对暴力破解攻击进行限制。
示例:创建一个名为SSH_BRUTE_FORCE的链来限制对SSH服务的暴力破解尝试。
这些规则创建了一个名为SSH_BRUTE_FORCE的自定义链,用于跟踪尝试连接到22端口的IP地址。如果在60秒内某个IP地址尝试连接超过3次,则接下来的尝试将被丢弃。
iptables -N SSH_BRUTE_FORCE
iptables -A SSH_BRUTE_FORCE -m recent --set --name SSH
iptables -A SSH_BRUTE_FORCE -m recent --update --seconds 60 --hitcount 4 --name SSH -j DROP
iptables -A INPUT -p tcp --dport 22 -j SSH_BRUTE_FORCE
分类处理特定流量
创建自定义链来处理来自特定IP地址或IP段的流量,或者处理特定类型的流量。
示例:创建一个名为BAD_IPS的链来处理来自不受欢迎的IP地址的流量。
这些规则创建了一个自定义链BAD_IPS,并在其中添加了两条规则来丢弃来自特定源地址的数据包。然后,它将所有尝试连接到22端口的流量都通过BAD_IPS链进行过滤。
iptables -N BAD_IPS
iptables -A BAD_IPS -s 192.168.1.100 -j DROP
iptables -A BAD_IPS -s 10.10.10.0/24 -j DROP
iptables -A INPUT -p tcp --dport 22 -j BAD_IPS
使用自定义链的好处
- 组织性:自定义链可以帮助您将规则按功能、服务或任何其他逻辑方式分组。
- 易于管理:更新、删除或临时禁用一组规则变得更加简单。
- 性能:通过将检查过程分解到不同的链中,可以提高处理效率,尤其是对于复杂的规则集合。
记录日志
你可以让iptables记录被拒绝的包的信息,这对于调试和安全分析非常有用:
这条规则会记录所有尝试连接到22端口(SSH)的数据包,并在日志中添加前缀"SSH attempt: "。
iptables -A INPUT -p tcp --dport 22 -j LOG --log-prefix "SSH attempt: "
动态封禁恶意流量(类似自定义链-动态防御)
使用recent模块可以帮助识别并动态封禁频繁尝试连接的IP地址,这对于抵御暴力破解攻击非常有效。
示例:封禁短时间内频繁连接到SSH端口的IP。
这组规则利用recent模块跟踪尝试连接到SSH端口的IP地址。如果一个IP地址在60秒内尝试连接超过3次,它将被自动封禁。
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH_ATTEMPTS
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 --name SSH_ATTEMPTS -j DROP
利用CONNMARK保存连接状态
在某些情况下,您可能需要跨多个链保存和恢复连接的标记状态。CONNMARK是一个有用的工具,可以用于此目的。
示例:标记并跟踪特定类型的流量,以便在不同链中进行特殊处理。
这个例子中,所有进入接口eth0并目标端口为80的TCP连接都被标记。在FORWARD链中,所有带有此标记的连接都会被记录日志。
ipset create blacklist hash:ip
ipset add blacklist 192.168.1.100
ipset add blacklist 10.10.10.0/24
iptables -A INPUT -m set --match-set blacklist src -j DROP
使用IPSet提高效率
当需要处理大量IP地址或IP范围时,使用IPSet可以显著提高iptables的效率。
示例:创建一个IPSet集合并在iptables规则中使用它来匹配多个IP地址。
这个例子创建了一个名为blacklist的IPSet集合,并添加了一些IP地址到集合中。然后,通过iptables规则使用这个集合来一次性丢弃所有在黑名单中的源地址。
ipset create blacklist hash:ip
ipset add blacklist 192.168.1.100
ipset add blacklist 10.10.10.0/24
iptables -A INPUT -m set --match-set blacklist src -j DROP
高级流量控制与QoS
利用iptables的mangle表和TC(Traffic Control)工具,可以实现复杂的流量控制和服务质量(QoS)策略。
示例:为特定服务的流量打标签,然后通过TC工具对其进行优先级控制。
这个例子通过iptables在数据包上设置一个标记,然后使用TC定义了一个基于该标记的流量控制策略,确保HTTP流量(端口80)有足够的带宽。
iptables -t mangle -A PREROUTING -p tcp --dport 80 -j MARK --set-mark 1
tc qdisc add dev eth0 root handle 1: htb
tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit
tc filter add dev eth0 protocol ip parent 1:0 prio 1 handle 1 fw flowid 1:1
TARPIT陷阱
TARPIT是一种减缓恶意连接的技术,它可以使攻击者的连接保持在开放状态,从而消耗其资源。
示例:使用TARPIT来处理扫描或攻击尝试。
TARPIT功能可能需要额外的模块支持,并不是所有系统都内置了此功能。这个规则使得所有尝试连接到80端口的TCP连接被延迟处理,从而耗费攻击者资源。
iptables -A INPUT -p tcp --dport 80 -j TARPIT