为什么访问本地端口时要经过 netfilter 后路由?

为什么访问本地端口时要经过 netfilter 后路由?

环境:

[root@VM-32-4-centos ~]# uname -r
3.10.0-514.26.2.el7.x86_64

我在以下链中设置了日志打印:

[root@VM-32-4-centos ~]# iptables -A INPUT -p tcp --dport 8000 -j LOG --log-prefix "INPUT DPORT 8000 LOGS: "
[root@VM-32-4-centos ~]# iptables -A INPUT -p tcp --sport 8000 -j LOG --log-prefix "INPUT SPORT 8000 LOGS: "
[root@VM-32-4-centos ~]# iptables -A OUTPUT -p tcp --dport 8000 -j LOG --log-prefix "OUTPUT DPORT 8000 LOGS: "
[root@VM-32-4-centos ~]# iptables -A OUTPUT -p tcp --sport 8000 -j LOG --log-prefix "OUTPUT SPORT 8000 LOGS: "
[root@VM-32-4-centos ~]# iptables -t nat -A POSTROUTING -p tcp --sport 8000 -j LOG --log-prefix "POSTROUTING SPORT 8000 LOGS: "
[root@VM-32-4-centos ~]# iptables -t nat -A POSTROUTING -p tcp --dport 8000 -j LOG --log-prefix "POSTROUTING DPORT 8000 LOGS: "

然后我执行telnet命令:

telnet 127.0.0.1 8000

tail -f /var/log/message,显示以下内容:

May  2 23:54:47 VM-32-4-centos kernel: OUTPUT DPORT 8000 LOGS: IN= OUT=lo SRC=127.0.0.1 DST=127.0.0.1 LEN=60 TOS=0x10 PREC=0x00 TTL=64 ID=6163 DF PROTO=TCP SPT=51096 DPT=8000 WINDOW=43690 RES=0x00 SYN URGP=0 
May  2 23:54:47 VM-32-4-centos kernel: POSTROUTING DPORT 8000 LOGS: IN= OUT=lo SRC=127.0.0.1 DST=127.0.0.1 LEN=60 TOS=0x10 PREC=0x00 TTL=64 ID=6163 DF PROTO=TCP SPT=51096 DPT=8000 WINDOW=43690 RES=0x00 SYN URGP=0 
May  2 23:54:47 VM-32-4-centos kernel: INPUT DPORT 8000 LOGS: IN=lo OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00 SRC=127.0.0.1 DST=127.0.0.1 LEN=60 TOS=0x10 PREC=0x00 TTL=64 ID=6163 DF PROTO=TCP SPT=51096 DPT=8000 WINDOW=43690 RES=0x00 SYN URGP=0 
May  2 23:54:47 VM-32-4-centos kernel: OUTPUT SPORT 8000 LOGS: IN= OUT=lo SRC=127.0.0.1 DST=127.0.0.1 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=TCP SPT=8000 DPT=51096 WINDOW=43690 RES=0x00 ACK SYN URGP=0 
May  2 23:54:47 VM-32-4-centos kernel: INPUT SPORT 8000 LOGS: IN=lo OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00 SRC=127.0.0.1 DST=127.0.0.1 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=TCP SPT=8000 DPT=51096 WINDOW=43690 RES=0x00 ACK SYN URGP=0 
May  2 23:54:47 VM-32-4-centos kernel: OUTPUT DPORT 8000 LOGS: IN= OUT=lo SRC=127.0.0.1 DST=127.0.0.1 LEN=52 TOS=0x10 PREC=0x00 TTL=64 ID=6164 DF PROTO=TCP SPT=51096 DPT=8000 WINDOW=342 RES=0x00 ACK URGP=0 
May  2 23:54:47 VM-32-4-centos kernel: INPUT DPORT 8000 LOGS: IN=lo OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00 SRC=127.0.0.1 DST=127.0.0.1 LEN=52 TOS=0x10 PREC=0x00 TTL=64 ID=6164 DF PROTO=TCP SPT=51096 DPT=8000 WINDOW=342 RES=0x00 ACK URGP=0 

请问,本地访问时,SYN包为什么会经过POSTROUTING呢?

后续的ACK+SYN数据包没有经过POSTROUTING,为什么?

请问为什么会这样,有相关资料吗?

谢谢。

答案1

事实上,这是一个本地端口,但这并不会改变您拥有传出连接和传入连接的事实。

NAT 表用于连接的第一个数据包,以查找应应用于该连接的转换。

在处理第一个数据包时,会创建一个内部映射表条目,用于处理连接的后续数据包。这就是为什么您会看到第一个数据包的工作量比后续数据包更大。

相关内容