我的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- 100
iptables -t mangle -A PREROUTING -p tcp --dport 6666 -j CONNMARK --set- 100
iptables -t mangle -A PREROUTING -p tcp --dport 6666 -m -- 100 -j CONNMARK --save-
iptables -t mangle -A PREROUTING -p tcp --dport 6666 -m -- 100 -j CONNMARK --restore-
iptables -t mangle -A PREROUTING -p tcp --dport 6666 -m -- 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_(int connfd, const char *info) { int = 1000;
socklen_t len = 32;
//setsockopt(connfd, SOL_SOCKET, SO_MARK, &, len);
= 888;
int n = getsockopt(connfd, SOL_SOCKET, SO_MARK, &, &len);
if (n) {
printf(" get failed!\n");
} else {
printf(" %s fd:%d MARK:%d\n", info, connfd, );
}
} 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_字段,这和netfilter-iptables设置的MARK字段应该是一脉相承的。TTL同理。不应该拿不到。
求问大神为什么?
iptables -t mangle -F
iptables -t mangle -A PREROUTING -p tcp --dport 6666 -j MARK --set- 100
iptables -t mangle -A PREROUTING -p tcp --dport 6666 -j CONNMARK --set- 100
iptables -t mangle -A PREROUTING -p tcp --dport 6666 -m -- 100 -j CONNMARK --save-
iptables -t mangle -A PREROUTING -p tcp --dport 6666 -m -- 100 -j CONNMARK --restore-
iptables -t mangle -A PREROUTING -p tcp --dport 6666 -m -- 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_(int connfd, const char *info) { int = 1000;
socklen_t len = 32;
//setsockopt(connfd, SOL_SOCKET, SO_MARK, &, len);
= 888;
int n = getsockopt(connfd, SOL_SOCKET, SO_MARK, &, &len);
if (n) {
printf(" get failed!\n");
} else {
printf(" %s fd:%d MARK:%d\n", info, connfd, );
}
} 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_字段,这和netfilter-iptables设置的MARK字段应该是一脉相承的。TTL同理。不应该拿不到。
求问大神为什么?
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货