csky2012 2018-01-25 05:50 采纳率: 0%
浏览 1811
已结题

用iptables对连接打MARK,但应用层为什么无法读到?

我的iptables命令如下,是期望给发到server本机的每个目的端口是6666的tcp连接都打上标记MARK=100,TTL=33,然后在server代码里面拿到这些标记。

    iptables -t mangle -F
    iptables -t mangle -A PREROUTING -p tcp --dport 6666 -j MARK --set-mark 100
    iptables -t mangle -A PREROUTING -p tcp --dport 6666 -j CONNMARK --set-mark 100
    iptables -t mangle -A PREROUTING -p tcp --dport 6666 -m mark --mark 100  -j CONNMARK --save-mark
    iptables -t mangle -A PREROUTING -p tcp --dport 6666 -m mark --mark 100  -j CONNMARK --restore-mark
    iptables -t mangle -A PREROUTING -p tcp --dport 6666 -m mark --mark 100  -j TTL --ttl-set  33
    iptables -t mangle -A INPUT -m ttl --ttl 33 -m state --state NEW  -j ACCEPT
    iptables -t mangle -A INPUT -m ttl --ttl 33 -m state --state ESTABLISHED,RELATED  -j ACCEPT

在server accept这个连接后,我获取到一个socket fd,我期望通过这个socket fd去拿到刚才的标记:MARK=100和TTL=33.

     void get_mark(int connfd, const char *info) {

            int mark = 1000;
            socklen_t marklen = 32;
            //setsockopt(connfd, SOL_SOCKET, SO_MARK, &mark, marklen);
            mark = 888;
            int n = getsockopt(connfd, SOL_SOCKET, SO_MARK, &mark, &marklen);
            if (n) {
                    printf("    get mark failed!\n");
            } else {
                    printf("    %s fd:%d MARK:%d\n", info, connfd, mark);
            }
    }

    void get_ttl(int connfd, const char *info) {

            int ttl = 0;
            socklen_t ttllen = 32;
            int n = getsockopt(connfd, IPPROTO_IP, IP_TTL, &ttl, &ttllen);
            if (n) {
                    printf("    get ttl failed!\n");
            } else {
                    printf("    %s fd:%d TTL:%d\n", info, connfd, ttl);
            }
    }

但结果并非如我预期的那样, 实际拿到的结果总是TTL=64, MARK=0.

    accept fd:4 MARK:0
    accept fd:4 TTL:64
    recv fd:4 MARK:0
    recv fd:4 TTL:64

特意翻阅了内核源码,发现getsockopt返回的是struct sock的sk_mark字段,这和netfilter-iptables设置的MARK字段应该是一脉相承的。TTL同理。不应该拿不到。

求问大神为什么?

  • 写回答

1条回答 默认 最新

  • csky2012 2018-01-25 05:54
    关注

    翻阅了内核源码,发现getsockopt返回的是struct sock的sk_mark字段,这和netfilter-iptables设置的MARK字段应该是一脉相承的。TTL同理。

    评论

报告相同问题?

悬赏问题

  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能
  • ¥15 jmeter脚本回放有的是对的有的是错的
  • ¥15 r语言蛋白组学相关问题