删除规则
  • 按编号删除规则

    首先,使用 -L --line-numbers 查看规则及其编号:

    iptables -L INPUT -n --line-numbers
     class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">

    然后,根据编号删除规则:

    iptables -D INPUT 1
     class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">
  • 修改规则
    插入规则
    设置默认策略
    保存和恢复规则
    清空规则
    端口重定向和 NAT
    高级匹配和限速
    日志记录

    iptables 支持将匹配的数据包信息记录到系统日志中,这对于调试和安全监控非常有用。

    状态检查

    利用 state 模块,可以匹配数据包的连接跟踪状态,这是构建复杂防火墙规则的基础。

    时间条件匹配

    使用 time 模块可以基于时间条件匹配数据包,这可以用于实现基于时间的访问控制策略。

    接口匹配

    可以根据数据包使用的网络接口进行匹配。

    用户自定义链

    用户可以定义自己的链来组织规则,这可以使规则集更加结构化和模块化。

    保存和加载规则

    iptables 规则默认在系统重启后不会保存。你需要手动保存规则,并在系统启动时加载它们。

    清空和重置

    有时你可能需要清空所有规则,重置 iptables 到初始状态。

    三、使用场景举例

    使用 iptables 的场景非常多样,覆盖从简单的主机防火墙到复杂的网络路由和 NAT 配置。下面是一些具体的使用场景,展示如何利用 iptables 解决实际问题。

    1. 基本的主机防护

    在这个场景中,我们利用 iptables 设置基本的网络访问控制,以保护主机不受未授权访问。

    允许特定的服务访问

    假设你想在一台服务器上开放 SSH (端口 22) 和 HTTP (端口 80) 服务,同时拒绝所有其他未经授权的入站连接。

    1. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="1"> class="hljs-ln-code"> class="hljs-ln-line"># 设置默认策略
    2. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="2"> class="hljs-ln-code"> class="hljs-ln-line">iptables -P INPUT DROP
    3. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="3"> class="hljs-ln-code"> class="hljs-ln-line">iptables -P FORWARD DROP
    4. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="4"> class="hljs-ln-code"> class="hljs-ln-line">iptables -P OUTPUT ACCEPT
    5. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="5"> class="hljs-ln-code"> class="hljs-ln-line">
    6. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="6"> class="hljs-ln-code"> class="hljs-ln-line"># 允许本地回环接口
    7. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="7"> class="hljs-ln-code"> class="hljs-ln-line">iptables -A INPUT -i lo -j ACCEPT
    8. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="8"> class="hljs-ln-code"> class="hljs-ln-line">iptables -A OUTPUT -o lo -j ACCEPT
    9. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="9"> class="hljs-ln-code"> class="hljs-ln-line">
    10. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="10"> class="hljs-ln-code"> class="hljs-ln-line"># 允许已建立的和相关的连接
    11. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="11"> class="hljs-ln-code"> class="hljs-ln-line">iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    12. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="12"> class="hljs-ln-code"> class="hljs-ln-line">
    13. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="13"> class="hljs-ln-code"> class="hljs-ln-line"># 允许 SSH
    14. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="14"> class="hljs-ln-code"> class="hljs-ln-line">iptables -A INPUT -p tcp --dport 22 -j ACCEPT
    15. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="15"> class="hljs-ln-code"> class="hljs-ln-line">
    16. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="16"> class="hljs-ln-code"> class="hljs-ln-line"># 允许 HTTP
    17. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="17"> class="hljs-ln-code"> class="hljs-ln-line">iptables -A INPUT -p tcp --dport 80 -j ACCEPT
    18. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="18"> class="hljs-ln-code"> class="hljs-ln-line">
    19. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="19"> class="hljs-ln-code"> class="hljs-ln-line"># Optional: 允许 HTTPS
    20. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="20"> class="hljs-ln-code"> class="hljs-ln-line">iptables -A INPUT -p tcp --dport 443 -j ACCEPT
    class="hide-preCode-box"> class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">

    2. 防止 DDoS 攻击

    使用 iptables 限制单个源 IP 的连接频率,以防止简单的 DDoS 攻击或 SSH 爆破。

    限制 SSH 连接尝试
    1. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="1"> class="hljs-ln-code"> class="hljs-ln-line"># 允许每个 IP 每分钟最多新建 3 个 SSH 连接
    2. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="2"> class="hljs-ln-code"> class="hljs-ln-line">iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
    3. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="3"> class="hljs-ln-code"> class="hljs-ln-line">iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP
    class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">

    这种设置能够有效减少暴力破解 SSH 密码的风险。

    3. 端口转发

    在某些情况下,你可能需要将到达某个端口的流量重定向到另一个端口上,例如将 80 端口的 HTTP 流量转发到 8080 端口。

    将 80 端口转发到 8080 端口
    1. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="1"> class="hljs-ln-code"> class="hljs-ln-line"># 在 nat 表的 PREROUTING 链上添加规则
    2. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="2"> class="hljs-ln-code"> class="hljs-ln-line">iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
    class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">

    这个操作常用于服务器上运行的 Web 应用程序,该程序绑定于非标准端口,而你希望通过标准端口访问。

    4. 网络地址转换 (NAT)

    在家庭或小型办公室网络中,经常需要设置 NAT 来共享访问互联网的路径。以下是一个简单的源 NAT(SNAT)配置的例子。

    共享互联网访问

    假设 eth1 是内部网络接口,eth0 是连接到互联网的接口。

    1. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="1"> class="hljs-ln-code"> class="hljs-ln-line"># 启用 IP 转发
    2. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="2"> class="hljs-ln-code"> class="hljs-ln-line">echo 1 > /proc/sys/net/ipv4/ip_forward
    3. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="3"> class="hljs-ln-code"> class="hljs-ln-line">
    4. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="4"> class="hljs-ln-code"> class="hljs-ln-line"># 设置 MASQUERADE
    5. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="5"> class="hljs-ln-code"> class="hljs-ln-line">iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    6. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="6"> class="hljs-ln-code"> class="hljs-ln-line">
    7. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="7"> class="hljs-ln-code"> class="hljs-ln-line"># 允许内部网络访问外部
    8. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="8"> class="hljs-ln-code"> class="hljs-ln-line">iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
    9. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="9"> class="hljs-ln-code"> class="hljs-ln-line">
    10. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="10"> class="hljs-ln-code"> class="hljs-ln-line"># 允许已建立的连接回流
    11. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="11"> class="hljs-ln-code"> class="hljs-ln-line">iptables -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT
    class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">

    这个配置允许内部网络通过 eth0 接口访问外部网络。

    5. 日志和审计

    记录某些类型的网络活动对于调试和安全监控都是非常有用的。

    记录被拒绝的包
    1. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="1"> class="hljs-ln-code"> class="hljs-ln-line"># 记录被拒绝的入站连接尝试
    2. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="2"> class="hljs-ln-code"> class="hljs-ln-line">iptables -A INPUT -j LOG --log-prefix "IPTables-Input-Denied: " --log-level 4
    3. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="3"> class="hljs-ln-code"> class="hljs-ln-line"># 记录被拒绘的转发连接尝试
    4. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="4"> class="hljs-ln-code"> class="hljs-ln-line">iptables -A FORWARD -j LOG --log-prefix "IPTables-Forward-Denied: " --log-level 4
    class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">

    这些规则会将所有被 INPUT 和 FORWARD 链拒绝的尝试记录到系统日志中。

    6. 使用时间条件控制访问

    在某些环境中,你可能希望基于时间来控制网络访问。

    在工作时间外允许 SSH 访问
    1. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="1"> class="hljs-ln-code"> class="hljs-ln-line"># 工作时间外允许 SSH
    2. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="2"> class="hljs-ln-code"> class="hljs-ln-line">iptables -A INPUT -p tcp --dport 22 -m time --timestart 18:00 --timestop 09:00 -j ACCEPT
    class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">

    这条规则允许在晚上 6:00 到早上 9:00 之间进行 SSH 访问。

    7. 防火墙绕过

    在某些情况下,你可能需要临时开放或关闭防火墙的某些规则,而不是永久修改配置。

    临时开放所有访问

    如果需要临时允许所有流量(例如,进行某些特殊操作),可以设置:

    1. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="1"> class="hljs-ln-code"> class="hljs-ln-line">iptables -P INPUT ACCEPT
    2. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="2"> class="hljs-ln-code"> class="hljs-ln-line">iptables -P FORWARD ACCEPT
    3. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="3"> class="hljs-ln-code"> class="hljs-ln-line">iptables -P OUTPUT ACCEPT
    4. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="4"> class="hljs-ln-code"> class="hljs-ln-line">
    5. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="5"> class="hljs-ln-code"> class="hljs-ln-line"># 清空所有规则
    6. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="6"> class="hljs-ln-code"> class="hljs-ln-line">iptables -F
    class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">

    然后,在操作完成后,恢复原来的规则。

    8. 防止 ICMP 泛洪攻击

    ICMP 泛洪是一种常见的拒绝服务攻击方法。

    限制 ICMP 回显请求
    1. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="1"> class="hljs-ln-code"> class="hljs-ln-line"># 限制 ICMP echo-request 消息
    2. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="2"> class="hljs-ln-code"> class="hljs-ln-line">iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
    3. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="3"> class="hljs-ln-code"> class="hljs-ln-line">iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
    class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">

    这些规则限制了每秒处理的 ICMP echo 请求(ping 请求)的数量,从而减轻了泛洪的影响。

    9. 多网卡策略路由

    在拥有多个网络接口的服务器上,你可能需要根据数据包的来源或目的地来选择不同的路由。

    根据源 IP 使用特定的网络接口
    1. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="1"> class="hljs-ln-code"> class="hljs-ln-line"># 对于从特定源 IP 发出的数据包,使用特定接口
    2. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="2"> class="hljs-ln-code"> class="hljs-ln-line">iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o eth1 -j MASQUERADE
    class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">

    这个规则设置了源 NAT,允许从 192.168.100.0/24 网段出来的数据包通过 eth1 接口发送。

    10. 容器和虚拟化环境

    在使用 Docker 或其他容器技术时,经常需要配置 iptables 来管理和隔离网络流量。

    允许特定容器访问外部网络
    1. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="1"> class="hljs-ln-code"> class="hljs-ln-line"># 假设容器的虚拟网络接口是 veth1234
    2. class="hljs-ln-numbers"> class="hljs-ln-line hljs-ln-n" data-line-number="2"> class="hljs-ln-code"> class="hljs-ln-line">iptables -t nat -A POSTROUTING -s 172.17.0.2/32 -o eth0 -j MASQUERADE
    class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}" onclick="hljs.signin(event)">

    这条规则允许 IP 地址为 172.17.0.2 的容器通过 eth0 接口访问外部网络。

    通过这些场景,你可以看到 iptables 的多样性和强大功能,它能够满足从简单到复杂的多种网络需求。

    data-report-view="{"mod":"1585297308_001","spm":"1001.2101.3001.6548","dest":"https://lpoyx.blog.csdn.net/article/details/138730375","extend1":"pc","ab":"new"}">>
    注:本文转载自blog.csdn.net的上杉翔二的文章"http://blog.csdn.net/qq_39388410/article/details/78228843"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
    复制链接

    评论记录:

    未查询到任何数据!