physdev-in、physdev-out 不起作用

當開啓時:sysctl -w net.bridge.bridge-nf-call-iptables=1

skb中存在physin和physout的接口信息,此時iptables規則可以使用-m physdev --physdev-in 和-m physdev --physdev-out去匹配物理接口。

PREROUTING-MANGLE-SSH-71: IN=br-lan0 OUT= PHY-m physdev --physdev-in=eth1MAC=70:f1:a1:aa:bd:60:00:23:cd:9c:e7:0a:08:00 SRC=192.168.1.254 DST=192.168.1.130 LEN=92 TOS=0x00 PREC=0x00 TTL=64 ID=25901 DF PROTO=TCP SPT=55377 DPT=22 WINDOW=16395 RES=0x00 ACK PSH URGP=0 


當關閉時:sysctl -w net.bridge.bridge-nf-call-iptables=0

skb中沒有physin和physout的接口信息,此時iptables規則無法使用-m physdev --physdev-in 和-m physdev --physdev-out去匹配物理接口。

PREROUTING-MANGLE-SSH-71: IN=br-lan0 OUT= MAC=70:f1:a1:aa:bd:60:00:23:cd:9c:e7:0a:08:00 SRC=192.168.1.254 DST=192.168.1.130 LEN=52 TOS=0x00 PREC=0x00 TTL=64 ID=26088 DF PROTO=TCP SPT=55757 DPT=22 WINDOW=8192 RES=0x00 SYN URGP=0 


其原因是:

在內核代碼中net/bridge/br_netfilter.c --> br_nf_pre_routing()函數(對應Netfilter/Iptables中的PREROUTING hook之前)有一段代碼用來控制2層數據是否發送到3層中:

#ifdef CONFIG_SYSCTL
if (!brnf_call_iptables)
return NF_ACCEPT;//該ACCEPT動作將該數據直接從2層轉發,不經過三層處理,即該數據包skb
不會經過iptables的chains(PREROUTING)處理。

#endif

skb和物理接口有關的數據結構是skb->nf_bridge,該數據結構是在net/bridge/br_netfilter.c --> br_nf_pre_routing()函數的代碼nf_bridge_alloc(skb)進行分配,並在同文件下的setup_pre_routing()函數進行初始化。


-->配置該參數:


當在linux命令行執行sysctl -w net.bridge.bridge-nf-call-iptables=x命令的時候,會通過系統調用執行net/bridge/br_netfilter.c 中的brnf_sysctl_call_tables()函數將變量static int brnf_call_iptables __read_mostly = 1;設置爲x值。相關結構定義如下:

{
.procname = "bridge-nf-call-iptables",
.data = &brnf_call_iptables,
.maxlen = sizeof(int),
.mode = 0644,
.proc_handler = brnf_sysctl_call_tables,
},

原文:https://blog.csdn.net/zxygww/article/details/45028731

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章