iptables 学习


在这里插入图片描述

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

相关推荐

  1. <span style='color:red;'>iptables</span>

    iptables

    2024-04-22 00:20:08      23 阅读
  2. iptables使用

    2024-04-22 00:20:08       41 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-22 00:20:08       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-22 00:20:08       101 阅读
  3. 在Django里面运行非项目文件

    2024-04-22 00:20:08       82 阅读
  4. Python语言-面向对象

    2024-04-22 00:20:08       91 阅读

热门阅读

  1. Leetcode 104. 二叉树的最大深度

    2024-04-22 00:20:08       34 阅读
  2. 突破编程_C++_网络编程(Boost.Asio(简介))

    2024-04-22 00:20:08       26 阅读
  3. 【C++刷题】优选算法——动态规划第四辑

    2024-04-22 00:20:08       35 阅读
  4. 【LeetCode热题100】【动态规划】最长递增子序列

    2024-04-22 00:20:08       37 阅读
  5. 2015NOIP普及组真题 2. 扫雷游戏

    2024-04-22 00:20:08       32 阅读