Iptables
為什麼我的 IPTables 規則不適用於埠 445 (SMB)?
考慮在我的路由器上執行的以下規則
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
解決了這個問題。