筆記 : OpenVPN Bridge 模式下防止 Netbios 廣播

OpenVPN Bridge 橋接模式下最大的優點也是最大的缺點就是 VPN 用戶的電腦可以看到遠端 VPN Server 同一網段的網芳 ~

這為何說是缺點呢 ??? 因為在 Bridge 模式中 , Client 與 Server 等於是同一網段 , 不管甚麼封包都會互通有無 , 尤其是 NetBios 封包 , 試想 ~ 若遠端的辦公室有 20 台電腦 ... 大家都在搶網芳的 Master Browser 主控權 , 這樣封包一直廣播 , 自然對 VPN 頻寬消耗更多 , 因此最好還是阻擋 NetBios 廣播的封包


在這裡先提一下 Linux Bridge 的概念 , Linux 是使用 bridge-utils 這套件去做橋街裝置的 , 我們用下面的指令來看看橋接裝置是甚麼

proxmox:/# brctl show
bridge name     bridge id               STP enabled     interfaces
vmbr0           8000.485b3925ef25       no              eth0
                                                        tap0
                                                        veth101.0
                                                        veth101.1
                                                        vmtab102i0
vmbr1           8000.485b3925effd       no              eth1
                                                        vmtab102i1

brctl show 列出的 bridge name 就是橋接名稱 , 可以看出有 vmbr0 , vmbr1 , 而 vmbr0 有 eth0/tap0/veth ... 等裝置加入 vmbr0 , 可能會納悶 , 那 vmbr0 和 vmbr1 又是甚麼 ?????

其實用一個最簡單的講法 , vmbr0 和 vmbr1 可看作虛擬的 Hub , 也可以看做是 VLAN 的概念 , 就是 Linux 在內部自己模擬出 Hub 的意思 , 而這些 Hub 又接了許多裝置 , 在同一個橋接名稱下的裝置是互通的 , 反正就是和真的 Hub 差不多嘛 .... 如果以 VLAN 角度去看 , 可以弄出好多個橋接裝置 , 然後某些裝置是通的 , 某些裝置不通 , 這在虛擬化的應用上很常用到就是了 , 請注意喔 vmbr0 和 vmbr1 同時也算一張網卡是可以指定 IP 的 , 但加入 vmbr0 及 vmbr1 的裝置不指定 IP 的 , 因為是要給其他應用程式使用的 , 例如虛擬化下的OS需要網卡 , 例如上面列的 veth101.0 veth101.1 是給虛擬 OS 用的 , 由虛擬的 OS 內自己指定 IP , 這樣其實有點混亂吧 ... 剛好橋接模式下的裝置也是要設定為混亂模式... 就給他亂吧 ...

上述混亂的廢話不管了 , 現在重點來了 , 由於 OpenVPN 在 Bridge 模式下會用到 tap 裝置 , 大部分若一台機器只跑一個 OpenVPN Server 可能會用 tap0 , 若有特殊需求可能會多開不同的 OpenVPN port 用到 tap1 tap2 ... 等 , 所以我們要檔 NetBios 廣播出來的封包 , 只要去檔 tap 裝置即可 , 其實作法很簡單 , 下面的指令就可以擋了

iptables -A FORWARD -p tcp -m physdev --physdev-out tap+ --sport 137:139 -j DROP
iptables -A FORWARD -p udp -m physdev --physdev-out tap+ --sport 137:139 -j DROP

注意一下 , 上面有個 tap+ , 這個加號可以代表任何數字 , 因此 tap0 tap1 tap2 .... 都受用啦

雖然這兩道指令看起來簡單 , 但花了我不少時間去找資料 , 原因是我一開始以為下以下兩道指令就可以

iptables -A FORWARD -p tcp -o tap+ --sport 137:139 -j DROP
iptables -A FORWARD -p udp -o tap+ --sport 137:139 -j DROP

結果是沒作用 , 後來找了好久的資料才知道 Bridge 模式下要用 iptables 指定裝置要使用 -m physdev --physdev-out --physdev-in 的參數

好了 , 當 iptables 指令下完後 , 應該網芳不會再出現所有遠端的電腦名稱了 , 但仍可以用 \\xxx.xxx.xxx.xxx 的方式去存取電腦分享的目錄 , 因為我這個範例只檔 137 和 139 port , 而 138 port 沒檔 , 所以仍可以去存取遠端電腦的檔案

介紹完畢了 ~ 以上範例雖然簡單 , 但仍花了我不少時間研究 , 所以筆記下來

發佈留言