Iptables

為什麼我的 IPTables 規則不適用於埠 445 (SMB)?

  • October 25, 2017

考慮在我的路由器上執行的以下規則192.168.1.1(是的,它們是非正常的):

iptables -t filter -I       INPUT 1 -p tcp --source 192.168.0.0/16 --destination-port "$PORT" --jump ACCEPT
iptables -t nat    -I       INPUT 1 -p tcp --source 192.168.0.0/16 --destination-port "$PORT" --jump SNAT --to-source      192.168.2.1
iptables -t nat    -I  PREROUTING 1 -p tcp --source 192.168.0.0/16 --destination-port "$PORT" --jump DNAT --to-destination 192.168.1.1

什麼時候$PORT不是(比如說,什麼時候是),這些規則可以正常工作。 但是,何時是(SMB),這些規則不起作用。 445``444
$PORT``445

請注意,我沒有在路由器上執行 Samba(或其他任何關心埠 445 的東西),儘管您應該能夠從socat下面沒有監聽衝突的事實中推斷出這一點。

(不,我沒有任何其他iptables關於 port 的規則445。)

例如,我在路由器上觀察到以下內容

$ socat -d -d tcp-listen:444 -     # this is on the router
socat[29117] N listening on AF=2 0.0.0.0:444
socat[29117] N accepting connection from AF=2 192.168.2.1:42339 on AF=2 192.168.1.1:444
socat[29117] N reading from and writing to stdio
socat[29117] N starting data transfer loop with FDs [6,6] and [0,1]
socat[29117] N socket 1 (fd 6) is at EOF
socat[29117] N exiting with status 0

當我在本地機器上執行以下命令時:

netcat -w 1 -t -n -z "$(dig +short myip.opendns.com @resolver1.opendns.com)" 444 <<<"" && echo Success || echo Failed

但是,如果我使用 port而不是執行上述完全相同的操作,則會永遠保持並在短暫暫停後列印。445``444``socat``listening on AF=2 0.0.0.0:445``netcat``Failed

因此,我懷疑路由器核心中的某些東西正在過濾到 port 的公共流量445,可能是出於安全原因(是的,我很清楚安全問題)。

但是,這顯然只是一個猜測,我不知道如何檢查/禁用正在發生的事情。

這怎麼可能發生,我該如何驗證呢?


這裡有一些可能會有所幫助的更多資訊。假設我啟用了日誌記錄

iptables -v -t nat -I       INPUT -d "$MACHINE_IP" -j LOG
iptables -v -t nat -I      OUTPUT -d "$MACHINE_IP" -j LOG
iptables -v -t nat -I  PREROUTING -d "$MACHINE_IP" -j LOG
iptables -v -t nat -I POSTROUTING -d "$MACHINE_IP" -j LOG
iptables -v -t nat -I       INPUT -s "$MACHINE_IP" -j LOG
iptables -v -t nat -I      OUTPUT -s "$MACHINE_IP" -j LOG
iptables -v -t nat -I  PREROUTING -s "$MACHINE_IP" -j LOG
iptables -v -t nat -I POSTROUTING -s "$MACHINE_IP" -j LOG

$MACHINE_IP我的本地機器的 IP 在哪裡。現在如果我跑

netcat -w 1 -t -n -z "$PUBLIC_IP" 444 <<<"Test" && echo Success || echo Failed

我得到以下內容(我已根據需要進行格式化和編輯):

kernel:        IN=br0 OUT= MAC="$MAC" SRC="$MACHINE_IP" DST="$PUBLIC_IP" LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=51334 DF PROTO=TCP SPT=42366 DPT=444                     WINDOW=29200 RES=0x00 SYN URGP=0
kernel: ACCEPT IN=br0 OUT= MAC="$MAC" SRC="$MACHINE_IP" DST=192.168.1.1  LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=51334 DF PROTO=TCP SPT=42366 DPT=444 SEQ=496897934 ACK=0 WINDOW=29200 RES=0x00 SYN URGP=0 OPT (<redacted>)
kernel:        IN=br0 OUT= MAC="$MAC" SRC="$MACHINE_IP" DST=192.168.1.1  LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=51334 DF PROTO=TCP SPT=42366 DPT=444                     WINDOW=29200 RES=0x00 SYN URGP=0
kernel: ACCEPT IN=br0 OUT= MAC="$MAC" SRC="$MACHINE_IP" DST=192.168.1.1  LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=51335 DF PROTO=TCP SPT=42366 DPT=444 SEQ=496897934 ACK=0 WINDOW=29200 RES=0x00 SYN URGP=0 OPT (<redacted>)

但是,如果我跑

netcat -w 1 -t -n -z "$PUBLIC_IP" 445 <<<"Test" && echo Success || echo Failed

然後我才回來:

kernel:        IN=br0 OUT= MAC="$MAC" SRC="$MACHINE_IP" DST="$PUBLIC_IP" LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=40192 DF PROTO=TCP SPT=39617 DPT=445                     WINDOW=29200 RES=0x00 SYN URGP=0
kernel:        IN=br0 OUT= MAC="$MAC" SRC="$MACHINE_IP" DST="$PUBLIC_IP" LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=40193 DF PROTO=TCP SPT=39617 DPT=445                     WINDOW=29200 RES=0x00 SYN URGP=0

奇怪的是$PUBLIC_IP,在第二個中根本沒有被翻譯。為什麼會這樣?等等

我終於自己弄清楚了。它是一個核心模組。echo 0 > /proc/net/lfpctrl解決了這個問題。

引用自:https://serverfault.com/questions/880133