Iptables

帶有 iptables 的 debian kvm 伺服器正在丟棄網橋數據包

  • February 19, 2018

在過去的一個月裡,我無法解決這個問題,我制定了不同的 iptables 規則,在核心上啟用和禁用了模組,但結果相同,甚至更多的數據包被 iptables 丟棄。這使得使用者在嘗試訪問虛擬機上從 192.168.1.0/24 到 192.168.3.0/28 的不同共享文件夾時有 3/5 秒的延遲。

我在日誌上看到了這個:

2 月 14 日 13:53:02 ns129115 核心:[12426815.202643] IPTables-OUTPUT-Dropped:IN= OUT=br0 SRC=192.168.1.115 DST=192.168.1.231 LEN=104 TOS=0x10 PREC=0x00 TTL=64 ID=61932 DF PROTO=TCP SPT=22115 DPT=49225 WINDOW=384 RES=0x00 ACK PSH URGP=0
2 月 14 日 13:53:02 ns129115 核心:[12426815.393379] IPTables-OUTPUT-Dropped:IN= OUT=br0 SRC=192.168.1.115 DST=192.168.1.231 LEN=40 TOS=0x10 PREC=0x00 TTL=64 ID=61933 DF PROTO=TCP SPT=22115 DPT=49225 WINDOW=384 RES=0x00 ACK URGP=0
2 月 14 日 13:53:02 ns129115 核心:[12426815.834944] IPTables-OUTPUT-Dropped:IN= OUT=br0 SRC=192.168.1.115 DST=192.168.1.231 LEN=40 TOS=0x10 PREC=0x00 TTL=64 ID=61934 DF PROTO=TCP SPT=22115 DPT=49225 WINDOW=384 RES=0x00 ACK URGP=0
2 月 14 日 13:53:02 ns129115 核心:[12426815.835219] IPTables-OUTPUT-Dropped:IN= OUT=br0 SRC=192.168.1.115 DST=192.168.1.231 LEN=136 TOS=0x10 PREC=0x00 TTL=64 ID=61935 DF PROTO=TCP SPT=22115 DPT=49225 WINDOW=384 RES=0x00 ACK PSH URGP=0
2 月 14 日 13:53:19 ns129115 核心:[12426832.829664] IPTables-FWD-Dropped:IN=br0 OUT=br0 PHYSIN=vnet0 PHYSOUT=eth2 MAC=70:85:c2:4f:14:c1:00:16:3e :ea:18:01:08:00 SRC=192.168.1.156 DST=192.168.1.125 LEN=319 TOS=0x00 PREC=0x00 TTL=128 ID=16660 DF PROTO=TCP SPT=49169 DPT=54820 WINDOW=256 RES= 0x00 確認 PSH URGP=0
2 月 14 日 13:53:39 ns129115 核心:[12426852.496117] IPTables-OUTPUT-Dropped:IN= OUT=br0 SRC=192.168.1.115 DST=192.168.1.231 LEN=104 TOS=0x10 PREC=0x00 TTL=64 ID=29023 DF PROTO=TCP SPT=22115 DPT=52214 WINDOW=263 RES=0x00 ACK PSH URGP=0
2 月 14 日 13:53:49 ns129115 核心:[12426862.856776] IPTables-FWD-Dropped:IN=br0 OUT=br0 PHYSIN=eth2 PHYSOUT=vnet0 MAC=00:16:3e:ea:18:01:90:2b:34 :b0:20:a4:08:00 SRC=192.168.1.237 DST=192.168.1.156 LEN=40 TOS=0x00 PREC=0x00 TTL=128 ID=1644 DF PROTO=TCP SPT=49244 DPT=49169 WINDOW=1879 RES= 0x00 確認 URGP=0
2 月 14 日 13:53:50 ns129115 核心:[12426863.288983] IPTables-OUTPUT-Dropped:IN= OUT=br0 SRC=192.168.1.115 DST=192.168.1.231 LEN=104 TOS=0x10 PREC=0x00 TTL=64 ID=29069 DF PROTO=TCP SPT=22115 DPT=52214 WINDOW=263 RES=0x00 ACK PSH URGP=0
2 月 14 日 13:54:19 ns129115 核心:[12426892.906806] IPTables-FWD-Dropped:IN=br0 OUT=br0 PHYSIN=eth2 PHYSOUT=vnet0 MAC=00:16:3e:ea:18:01:74:d4:35 :6a:18:7a:08:00 SRC=192.168.1.199 DST=192.168.1.156 LEN=248 TOS=0x00 PREC=0x00 TTL=128 ID=13244 DF PROTO=TCP SPT=49678 DPT=49169 WINDOW=256 RES= 0x00 確認 PSH URGP=0
2 月 14 日 13:54:42 ns129115 核心:[12426915.939242] IPTables-OUTPUT-Dropped:IN= OUT=br0 SRC=192.168.1.115 DST=192.168.1.231 LEN=136 TOS=0x10 PREC=0x00 TTL=64 ID=61969 DF PROTO=TCP SPT=22115 DPT=49225 WINDOW=384 RES=0x00 ACK PSH URGP=0

帶有 iptables 和 2 個網橋的 Debian 伺服器

  • BR0, 是到網關 192.168.1.1 的 Internet 訪問網橋,所有使用者都在這個網路上
  • VIRBR10,第二個網橋,vm1 已經連接到這個網橋,ip 為 192.168.3.12 (192.168.3.0/28),並且有 nat 和 iptables 通過 br0 到外面

這裡 »» 帶有網關和管理程序的網路圖

這是我的路由表

~ 路線清單

核心IP路由表
目標網關 Genmask 標誌 Metric Ref Use Iface
預設 192.168.1.1 0.0.0.0 UG 0 0 0 br0
192.168.1.0 * 255.255.255.0 U 0 0 0 br0
192.168.3.0 * 255.255.255.240 U 0 0 0 virbr10

~ brctl 顯示

網橋名稱 網橋 ID 啟用 STP 的介面
br0 8000.0cc47ac18d3c 是 eth2
virbr10 8000.525400c4b847 是 virbr10-dummy
網路2

~ iptables 規則

#!/bin/sh
#刷新所有規則
iptables -P 輸入接受
iptables -P 轉發接受
iptables -P 輸出接受
iptables -t nat -F
iptables -t mangle -F
iptables -F
iptables -X

# 允許基本輸入流量。
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A 輸入 -i lo -j 接受
iptables -A INPUT -p icmp --icmp-type 8 -m conntrack --ctstate NEW -j ACCEPT
iptables -A INPUT -p icmp -m conntrack --ctstate NEW -j ACCEPT

#
#MTU
iptables -t mangle -A FORWARD -o virbr1 -p tcp -m tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1361:1536 -j TCPMSS --set-mss 1460
iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

#中小企業
#埠:netbios - 445/tcp
#Port: netbios-ns – 137/udp -- NETBIOS 名稱服務
#Port: netbios-dgm – 138/udp -- NETBIOS 數據報服務
#埠:netbios-ssn – 139/tcp -- NETBIOS 會話服務
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 445 -j ACCEPT
iptables -A 輸入 -p udp -m udp --dport 445 -j 接受
iptables -A 輸入 -p udp -m udp --dport 137:138 -j 接受
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 139 -j ACCEPT
#iptables -A INPUT -p tcp -m tcp -m conntrack --ctstate NEW --sport 137 -j ACCEPT
#iptables -A INPUT -p tcp -m tcp -m conntrack --ctstate NEW --sport 138 -j ACCEPT
#iptables -A INPUT -p tcp -m tcp -m conntrack --ctstate NEW --sport 139 -j ACCEPT

#RDP
#埠:3389
# 外部連接
iptables -I FORWARD -o virbr10 -d 192.168.3.12 -j ACCEPT
iptables -t nat -I PREROUTING -p tcp --dport 3589 -j DNAT --to 192.168.3.12:3389

#偽裝本地子網
iptables -I FORWARD -o virbr10 -d 192.168.3.0/28 -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.3.0/28 -j MASQUERADE
iptables -A FORWARD -o virbr10 -m state --state RELATED,ESTABLISHED -j ACCEPT
#允許從virbr10到192.168.1.0/24網路的傳出連接
iptables -A FORWARD -i virbr10 -o br0 -j ACCEPT
iptables -A FORWARD -o virbr10 -i br0 -j ACCEPT
iptables -A FORWARD -i virbr10 -o lo -j ACCEPT

###
#KVM 路由訪客
# 發送到 VM 的 DHCP 數據包沒有校驗和(由於長期存在的錯誤)。
iptables -t mangle -A POSTROUTING -o virbr10 -p udp -m udp --dport 68 -j CHECKSUM --checksum-fil

# 不要偽裝成這些保留的地址塊。
iptables -t nat -A POSTROUTING -s 192.168.3.0/28 -d 224.0.0.0/24 -j RETURN
iptables -t nat -A POSTROUTING -s 192.168.3.0/28 -d 255.255.255.255/32 -j RETURN
# 偽裝從 VM 到 LAN/Internet 的所有數據包。
iptables -t nat -A POSTROUTING -s 192.168.3.0/28 !-d 192.168.3.0/28 -p tcp -j MASQUERADE --to-ports 1024-65535
iptables -t nat -A POSTROUTING -s 192.168.3.0/28 !-d 192.168.3.0/28 -p udp -j MASQUERADE --to-ports 1024-65535
iptables -t nat -A POSTROUTING -s 192.168.3.0/28 !-d 192.168.3.0/28 -j 偽裝

# 接受 SSH 連接。
iptables -A INPUT -p tcp -m tcp --syn -m conntrack --ctstate NEW --dport 22 -j ACCEPT

# 接受 Radmin
iptables -A INPUT -p tcp -m tcp --syn -m conntrack --ctstate NEW --dport 4899 -j ACCEPT

# 允許入站流量到私有子網。
iptables -A FORWARD -d 192.168.3.0/28 -o virbr10 -m state --state ESTABLISHED,RELATED -j ACCEPT
#7218-12_07 桌面訪問速度慢 iptables -A FORWARD -d 192.168.1.0/24 -o br0 -m state --state ESTABLISHED,RELATED -j ACCEPT
#7218-12_07 桌面訪問速度慢 iptables -A FORWARD -d 192.168.3.0/28 -o br0 -m state --state ESTABLISHED,RELATED -j ACCEPT
# 允許來自私有子網的出站流量。
iptables -A FORWARD -s 192.168.3.0/28 -i virbr10 -m state --state ESTABLISHED,RELATED -j ACCEPT
#7218-12_07 緩慢的桌面訪問 iptables -A FORWARD -s 192.168.1.0/24 -i br0 -m state --state ESTABLISHED,RELATED -j ACCEPT
#7218-12_07 桌面訪問速度慢 iptables -A FORWARD -s 192.168.3.0/28 -i br0 -m state --state ESTABLISHED,RELATED -j ACCEPT
# 允許虛擬機之間的流量。
iptables -A FORWARD -i virbr10 -o virbr10 -j ACCEPT
# 拒絕其他一切。
iptables -A FORWARD -i virbr10 -j REJECT --reject-with icmp-port-unreachable
# 接受來自VM的DNS(53埠)和DHCP(67埠)報文。
iptables -A INPUT -i virbr10 -p udp -m udp -m multiport --dports 53,67 -j ACCEPT
iptables -A INPUT -i virbr10 -p tcp -m tcp -m multiport --dports 53,67 -j ACCEPT

#ICMP
iptables -A OUTPUT -p icmp -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# 拒絕其他一切。
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
iptables -A INPUT -p tcp -m tcp -j REJECT --reject-with tcp-reset
iptables -A INPUT -j REJECT --reject-with icmp-port-unreachable

#記錄丟包
iptables -A INPUT -m limit --limit 2/min -j LOG --log-prefix "IPTables-INPUT-Dropped:" --log-level 4
iptables -A FORWARD -m limit --limit 2/min -j LOG --log-prefix "IPTables-FWD-Dropped:" --log-level 4
iptables -A OUTPUT -m limit --limit 2/min -j LOG --log-prefix "IPTables-OUTPUT-Dropped:" --log-level 4

更新

  1. 將日誌鏈更改為腳本末尾並粘貼新的日誌條目

在Google上搜尋後,我可以解決這個問題。

  1. 在 Windows Server 2012 R2 的域控制器上使用 SMB 訪問共享文件的速度很慢是因為文件夾重定向 GPO 在重定向過程中更改了使用者配置文件文件夾中的權限,而該文件夾在目標中不存在。基於來自 Microsfot Technet (連結) 的 iamrafic,我們需要將文件夾權限更改為:

在所需位置創建文件夾 禁用從父級繼承權限並通過點擊相應按鈕刪除所有繼承的權限。DACL 中已經有一個條目:本地管理員。

更改本地管理員:完全控制:此文件夾、子文件夾和文件

添加系統:完全控制:此文件夾、子文件夾和文件。

添加 CREATOR OWNER:完全控制:此文件夾、子文件夾和文件。

添加經過身份驗證的使用者:列出文件夾/讀取數據,創建文件夾/附加數據:僅此文件夾

添加域管理員:完全控制:此文件夾、子文件夾和文件。

點擊確定。

  1. 另一個問題是我的 iptables 規則,我需要執行一個全新的鏈並修復每個 FORWARD 規則的順序,因為這會在分析數據包時改變性能。這裡是新的。
#!/bin/sh
   
#刷新所有規則
iptables -P 輸入接受
iptables -P 轉發接受
iptables -P 輸出接受
iptables -t nat -F
iptables -t mangle -F
iptables -F
iptables -X
iptables -t 原始 -F
   
# 基本表
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A 輸入 -i lo -j 接受
   
#
   
iptables -A FORWARD -o virbr32 -s 192.168.1.0/24 -d 192.168.100.0/28 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i virbr32 -s 192.168.100.0/28 -d 192.168.1.0/24 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -o virbr32 -i br0 -j ACCEPT
iptables -A FORWARD -i virbr32 -s 192.168.100.0/2 -j ACCEPT
iptables -A FORWARD -i virbr32 -o virbr32 -j ACCEPT
iptables -A FORWARD -i virbr32 -j LOG --log-prefix "iptables-FORWARD-REJECT:"
iptables -A FORWARD -i virbr32 -j REJECT --reject-with icmp-port-unreachable
   
#偽裝本地子網
iptables -t nat -A POSTROUTING -s 192.168.100.0/28 -j MASQUERADE
# 不要偽裝成這些保留的地址塊。
iptables -t nat -A POSTROUTING -s 192.168.100.0/28 -d 224.0.0.0/24 -j RETURN
iptables -t nat -A POSTROUTING -s 192.168.100.0/28 -d 255.255.255.255/32 -j RETURN
   
#中小企業
# RPC EPM TCP 135
# RPC over HTTPS TCP 593
# SMB(用於命名管道)TCP 445
# 短暫範圍,動態 *
iptables -I FORWARD 6 -o virbr32 -i br0 -m conntrack --ctstate NEW -p tcp -d 192.168.100.12 --dport 445 -j ACCEPT
iptables -I FORWARD 7 -o virbr32 -i br0 -m conntrack --ctstate NEW -p tcp -d 192.168.100.12 --dport 139 -j ACCEPT
   
# 接受來自VM的DNS(53埠)和DHCP(67埠)報文。
iptables -I FORWARD 8 -o virbr32 -i br0 -m conntrack --ctstate NEW -p tcp -m tcp -m multiport --dports 53,67 -j ACCEPT
iptables -I FORWARD 9 -i virbr32 -o br0 -m conntrack --ctstate NEW -p udp -m udp -m multiport --dports 53,67 -j ACCEPT
   
#
   
#
   
# 下面的兩條規則確保只檢查 TCP 數據包。所有其他人
# 繼續進入 *filter 表。
iptables -t raw -N TCPFLAGS
iptables -t raw -A PREROUTING -p tcp -j TCPFLAGS
iptables -t raw -A PREROUTING -j ACCEPT
   
# 快速接受標準握手
# 允許 ACK 或 ACK/SYN
#-A TCPFLAGS -j 接受
iptables -t raw -A TCPFLAGS -p tcp --tcp-flags FIN,ACK,URG,PSH,RST ACK -j ACCEPT
   
# 允許 ACK/FIN 帶有 URG 或 PSH,或兩者,或兩者都不
# 但是不能設置SYN和RST
iptables -t raw -A TCPFLAGS -p tcp --tcp-flags FIN,SYN,ACK,RST ACK,FIN -j ACCEPT
   
# 允許 SYN 或 ACK/SYN
iptables -t raw -A TCPFLAGS -p tcp --tcp-flags FIN,SYN,URG,PSH,RST SYN -j ACCEPT
   
# 允許 RST 或 ACK/RST
iptables -t raw -A TCPFLAGS -p tcp --tcp-flags FIN,SYN,URG,PSH,RST RST -j ACCEPT
   
# 此規則擷取 xmas-tree 和 fin 攻擊
iptables -t raw -A TCPFLAGS -p tcp --tcp-flags FIN FIN -j DROP
# 此規則擷取 xmas-tree 和 syn/rst 攻擊
iptables -t raw -A TCPFLAGS -p tcp --tcp-flags SYN SYN -j DROP
   
# 此規則擷取空攻擊
iptables -t raw -A TCPFLAGS -p tcp --tcp-flags ALL NONE -j DROP
   
#-A TCPFLAGS -p tcp -ecn-tcp-cwr -j DROP
# 這些規則擷取錯誤的 ack 組合
#-A TCPFLAGS -p tcp --tcp-flags ACK ACK -j ACC
#iptables -t raw -A TCPFLAGS -j ACCEPT
   
# 那麼,我們對 tcp 接受什麼?
# 握手 (ACK/FIN), (ACK/SYN), (SYN), (ACK), (RST), (ACK/RST),
# 和帶有 PSH 或 URG 或 FIN 或 ACK 的數據包
   
#
   
#記錄丟包
iptables -A INPUT -m limit --limit 2/min -j LOG --log-prefix "IPTables-INPUT-Dropped:" --log-level 4
iptables -A FORWARD -m limit --limit 2/min -j LOG --log-prefix "IPTables-FWD-Dropped:" --log-level 4
iptables -A OUTPUT -m limit --limit 2/min -j LOG --log-prefix "IPTables-OUTPUT-Dropped:" --log-level 4
  • 如您所見,我使用 iptables -I FORWARD 而不是 iptables -A FORWARD 因為這樣可以在我的過濾表上執行有序規則,首先放置更重要的規則,然後在 DROP 或拒絕其餘規則後更深入。所有 FORWARD 規則都在此行之前
iptables -A INPUT -p icmp --icmp-type 8 -m conntrack --ctstate NEW -j ACCEPT

編輯:我只需要在將文件從 vm 複製到區域網路 192.168.1.0/24 的外部時進行一些更改以提高傳輸速率,我不能超過 4Mb/s。任何建議將不勝感激!!

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