V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
Counter
V2EX  ›  Linux

关于 iptables 的问题

  •  
  •   Counter · 2016-01-04 17:59:38 +08:00 · 3861 次点击
    这是一个创建于 3271 天前的主题,其中的信息可能已经有所发展或是发生改变。

    开机成功执行脚本 iptables.sh ,脚本内容如下:
    iptables -F
    iptables -X
    iptables -Z
    iptables -P INPUT DROP
    iptables -P OUTPUT ACCEPT
    iptables -P FORWARD ACCEPT
    iptables -A INPUT -i lo -j ACCEPT
    iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

    这里并未开启 SSH 端口,为何可以 SSH 连接?哪里出问题了吗?

    第 1 条附言  ·  2016-01-04 19:04:22 +08:00
    规则来源参考《鸟哥的 Linux 私房菜》 9.3.4-7
    http://linux.vbird.org/linux_server/0250simple_firewall.php#netfilter
    29 条回复    2016-01-20 22:29:25 +08:00
    boro
        1
    boro  
       2016-01-04 18:31:34 +08:00 via iPhone
    是不是没设置重启后,规则不失效。
    ayouwei
        2
    ayouwei  
       2016-01-04 18:33:45 +08:00
    iptables-save 有什么输出?
    GNiux
        3
    GNiux  
       2016-01-04 18:49:03 +08:00 via iPhone
    INPUT ACCEPT?
    哈哈
    GNiux
        4
    GNiux  
       2016-01-04 18:51:16 +08:00 via iPhone
    @GNiux 不好意思,看错
    tinkerer
        5
    tinkerer  
       2016-01-04 18:55:10 +08:00 via iPhone
    iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
    这句决定了已建立的连接不会断开
    Counter
        6
    Counter  
    OP
       2016-01-04 19:01:23 +08:00
    @boro 有生效的,去掉下面两条,再开机执行脚本,就无法连接了
    iptables -A INPUT -i lo -j ACCEPT
    iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

    @ayouwei 执行 iptables-save -t filter 的结果如下
    *filter
    :INPUT DROP [0:0]
    :FORWARD ACCEPT [0:0]
    :OUTPUT ACCEPT [0:0]
    -A INPUT -i lo -j ACCEPT
    -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

    @tinkerer 但是默认是 DROP 的,没有开放端口,应该是无法建立连接才对
    ayouwei
        7
    ayouwei  
       2016-01-04 19:51:38 +08:00   ❤️ 1
    那么规则应该是符合预期的, 估计 iptables 模块就没有生效;
    ryd994
        8
    ryd994  
       2016-01-04 20:09:42 +08:00 via Android
    你不会是从本地连吧……
    本地连走 lo 当然不受限制
    Counter
        9
    Counter  
    OP
       2016-01-04 20:31:21 +08:00
    @ayouwei 去掉最后两条规则就连不上了。。。
    @ryd994 不是从本地连
    Mithrandir
        10
    Mithrandir  
       2016-01-04 21:26:16 +08:00   ❤️ 1
    1. 又不是路由器, FORWARD 链直接 drop 就好
    2. 如果是本机连接,直接匹配 INPUT 链的第一条规则走 lo 了
    3. 如果不是本地连接,已经连接的不会受影响,连接可能建立在 iptables 服务开启之前或者以上命令执行之前。
    4. 用开机脚本也太蛋疼了吧,最好直接修改配置文件
    ryd994
        11
    ryd994  
       2016-01-05 03:29:53 +08:00   ❤️ 1
    @Counter 那你确定一下到底是那一条的作用啊
    去掉其中一条试试看
    Counter
        12
    Counter  
    OP
       2016-01-05 06:03:56 +08:00 via iPhone
    @ryd994
    @Mithrandir
    @ayouwei
    是下面那条的 ESTABLISHED 起作用
    tempdban
        13
    tempdban  
       2016-01-05 08:59:02 +08:00 via Android
    楼上不说了吗,已建立的链接不会断开。
    gulucn
        14
    gulucn  
       2016-01-05 09:07:14 +08:00
    之前在 vps 测试过,好像去掉
    -A INPUT -i lo -j ACCEPT
    就可以生效。
    Counter
        15
    Counter  
    OP
       2016-01-05 09:56:58 +08:00
    @ryd994
    @Mithrandir
    @ayouwei
    @gulucn
    怀疑是 vps 上装的 net_speeder 有问题,但应该不是后门,跟它的发包机制有关,规则是没问题的
    具体表现为保持上面的规则不变,关闭 net_speeder , SSH 怎么也连接不上,开启 net_speeder , SSH 就连上了,有条件的请帮忙测试下
    JerningChan
        16
    JerningChan  
       2016-01-05 10:01:03 +08:00
    这不是很正常吗?
    你的 input 都 accept 了呀
    -A INPUT -j REJECT --reject-with icmp-host-prohibited
    你加上这句试试
    Counter
        17
    Counter  
    OP
       2016-01-05 10:13:34 +08:00
    @JerningChan 默认是 DROP 的, iptables -P INPUT DROP
    在主贴的规则基础上加上 16 楼这条,关闭 net_speeder,SSH 连接不上,开启 net_speeder,SSH 连上了
    ryd994
        18
    ryd994  
       2016-01-05 10:25:38 +08:00
    @Counter
    @JerningChan 说的做法可以解决你的问题,但问题不是他所说的那样。
    iptables 对 ESTABLISHED 的定义并不是连接已经完成握手,而是之前见过相同连接的包。 netspeeder 对入站的连接也会双倍。第一个包确实 drop 了,第二个包 iptable 已经见过,所以允许了。然而因为是复制包,所以两个包中都是 syn ,任何一个都可以建立连接。

    如果用 reject 的话,因为远端机器已经收到 rst 包,所以连接终止。即使你的机器返回 synack ,对方也不会处理。但是如果有人知道你是这样做的话,还是很容易绕过这个的。因为他只要 drop rst 包就行。

    靠谱的解决也很简单:不要双倍 syn 就好了
    'tcp[tcpflags] & tcp-syn == 0'
    不过这样不能过滤 ipv6 ,偷懒不想查了,你要用的话自己查一下 tcpdump 怎么 dump ipv6 的 syn ,逻辑反过来就行。
    ryd994
        19
    ryd994  
       2016-01-05 10:30:46 +08:00   ❤️ 1
    -A INPUT -m state --state RELATED,ESTABLISHED ! --syn -j ACCEPT
    这样应该也可以
    Counter
        20
    Counter  
    OP
       2016-01-05 10:55:02 +08:00
    @ryd994 命令不加-p tcp 会报错,即应该是 iptables -A INPUT -m state --state RELATED,ESTABLISHED -p tcp ! --syn -j ACCEPT ,执行后开启 net_speeder 依旧可以 SSH 连接。。。看来 net_speeder 有个很隐蔽的坑
    ayouwei
        21
    ayouwei  
       2016-01-05 11:56:36 +08:00   ❤️ 1
    以前没有接触过 net_speeder , 刚才看了一下 net_speeder 的原理, 我理解问题是出在 net_speeder 的机制上, 如果说错了请大家打脸。

    net speeder 原理就是把网卡收到或者发出去的包根据规则过滤出来复制一份再写入协议栈;

    在你这个场景下, 收到的 ssh syn 包会被复制。 原始的 syn 包经过协议栈, 而复制的包是通过了的。

    原因就是复制出来的包是本地复制的, 所以再进入协议栈时是通过 loopback 进入;

    所以先匹配到 iptables -A INPUT -i lo -j ACCEPT

    而之后的包无论是匹配 state 还是匹配 loopback interface 都会被放过;
    Counter
        22
    Counter  
    OP
       2016-01-05 12:41:11 +08:00 via iPhone
    @ayouwei 应该是这样没错,复制的包被当做本地的包处理了
    另外基于 iptables 的 UFW 也有此问题 https://www.v2ex.com/t/244523
    Counter
        23
    Counter  
    OP
       2016-01-05 14:44:08 +08:00
    @ayouwei
    @ryd994
    把 iptables -A INPUT -i lo -j ACCEPT 分拆为两条
    iptables -A INPUT -i lo -p tcp ! --syn -j ACCEPT
    iptables -A INPUT -i lo -p udp -j ACCEPT
    搞定了,哈哈
    ayouwei
        24
    ayouwei  
       2016-01-05 15:07:21 +08:00   ❤️ 1
    恭喜,但是你这样会有个问题,就是无法再访问本地服务了。拒掉前先放过本地流量
    -A INPUT -i lo -p tcp --src 127.0.0.1/8 -j ACCEPT
    -A INPUT -i lo -p tcp ! --syn -j ACCEPT
    Mithrandir
        25
    Mithrandir  
       2016-01-05 15:18:36 +08:00
    看了下 net_speeder ,感觉并没有使用这个的必要啊
    helihuo
        26
    helihuo  
       2016-01-06 01:32:07 +08:00
    @ayouwei 没用。我试过了,你这招照样能连上
    Counter
        27
    Counter  
    OP
       2016-01-06 08:51:13 +08:00 via iPhone
    @helihuo 我现在直接把这条 iptables -A INPUT -i lo -j ACCEPT 去掉,然后再配合协议( tcp/udp )或端口(--sport/--dport )开白名单,毕竟不是全部流量都需要 net_speeder
    Counter
        28
    Counter  
    OP
       2016-01-06 08:55:46 +08:00 via iPhone
    @helihuo 说错,不是所有流量都需要 lo
    Devin
        29
    Devin  
       2016-01-20 22:29:25 +08:00 via iPhone
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3919 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 05:12 · PVG 13:12 · LAX 21:12 · JFK 00:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.