zoukankan      html  css  js  c++  java
  • iptables中规则的关系——以只允许某些IP段访问为例

    最近遇到一个问题:服务器被全球的IP频繁试图通过ssh登录。

    于是想到通过iptables防火墙限制访问,达到:仅允许指定ip段访问ssh服务(22端口)。

    关于iptables添加规则的文章有很多,而鲜有介绍规则之间的顺序。因此希望通过这篇文章介绍iptables多条规则之间是如何协同工作的。

    注:作者并没有在此投入很多时间调研,因而以下仅仅是个人理解,有错误之处希望不吝指出。

    假设希望仅仅允许 111.111.0.0/16 IP段ssh登录,而禁止其他所有ip登录。

    最简单的命令是:

    iptables -I INPUT -p tcp --dport 22 -j DROP
    iptables -I INPUT -s 111.111.0.0/16 -p tcp --dport 22 -j ACCEPT

    第一句 禁止了所有对22端口的入访问,第二句允许111.111.0.0/16的访问。

    这两句命令的关键在于 “-I” 选项,这个选项表示将当前规则插入到第一条,因此上面两条执行完之后,新增的两条规则是(用iptables -L 列出所有规则):

    ACCEPT     tcp  --  111.111.0.0/16        anywhere             tcp dpt:ssh
    DROP       tcp  --  anywhere             anywhere             tcp dpt:ssh

    当有新链接请求时,iptables就使用这些规则:

    首先查看第一条:ACCEPT     tcp  --  111.111.0.0/16        anywhere             tcp dpt:ssh

    如果这个ip在地址段里,那么允许。如果不在,才查看下一条规则:

    DROP       tcp  --  anywhere             anywhere             tcp dpt:ssh

    也就是禁止访问。

    这样就实现了最初设定的目标。

    这两条命令存在一个问题,当用户以 ssh登录身份执行时,执行了第一条:iptables -I INPUT -p tcp --dport 22 -j DROP

    后,这条命令被置顶了,从而此时等价实现了“禁止一切ssh”,然后用户就被断开连接了。。。。悲剧

    所以更安全的命令应该如下:
    iptables -I INPUT -s 111.111.0.0/16 -p tcp --dport 22 -j ACCEPT

    iptables -I INPUT 2 -p tcp --dport 22 -j DROP

    即先执行允许访问,再显式的将禁止访问放在第二条。

    通过以上简单分析可以得出:

    iptables对新链接一条一条的查看,直到得出允许/禁止结论,如果在前一条就得出了结论,那么后面的规则都不会起作用。

    http://www.cnblogs.com/fydd/p/4520187.html

  • 相关阅读:
    u-boot启动流程分析(1)_平台相关部分
    Linux文件系统简介
    PHP将部分内容替换成星号
    自制jQuery焦点图切换简易插件
    一次解决页面特效问题的排查记录
    自制jQuery标签插件
    一套后台管理html模版
    自制jquery可编辑的下拉框
    注册页面的一些记录
    CSS选择器的一些记录
  • 原文地址:https://www.cnblogs.com/lixiuran/p/7603116.html
Copyright © 2011-2022 走看看