我用iptables设置socket MARK和TTL,但我无法从getsockopt读取它?

时间:2018-01-24 14:08:47

标签: linux tcp iptables

我在我的linux服务器上运行iptables-command。

iptables -t mangle -F
iptables -t mangle -A PREROUTING -m state --state NEW -j MARK --set-mark 100
iptables -t mangle -A PREROUTING -j CONNMARK --save-mark
iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -j TTL --ttl-set 33

这是我的服务器代码的一部分,使用iptables策略,我期望从我的socket-fd获得正确的TTL = 33和MARK = 100。

void get_mark(int connfd) {
    int mark;
    socklen_t marklen = sizeof(mark);
    int n = getsockopt(connfd, SOL_SOCKET, SO_MARK, &mark, &marklen);
    if (n) {
        printf("get mark failed!\n");
    } else {
        printf("fd:%d MARK:%d\n", connfd, mark);
    }
}

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

但是我失败了,给出MARK = 0和TTL = 64的实际结果。

fd:4 MARK:0
fd:4 TTL:64

是什么原因?

1 个答案:

答案 0 :(得分:0)

检查 net.ipv4.tcp_fwmark_accept net.ipv4.tcp_fwmark_accept应该设置为1