Debian

如何在一個乙太網設備上提供“訪客 LAN”

  • August 23, 2012

我有一台執行 Debian/Squeeze 的永遠線上的機器,它有幾個乙太網埠(它正在做各種伺服器工作,包括 DHCP)和一個 LAN。

eth0 位於 192.168.7.* 上,並且可以通過位於 192.168.7.1 的 LAN 上的網關(NAT 轉換 DSL 路由器)訪問網際網路(以及“辦公室 LAN”的其餘部分)。

eth1 在 192.168.1.* 上。我正在尋找一種快速、簡單且對 Debian 友好的方式來配置機器,以便 192.168.1.* LAN 上的任何人都只能訪問外部網際網路、DHCP,而不能訪問其他任何東西192.168.7.*。

我確信使用一組適當的 iptables 規則可以做到這一點。懷疑我正在尋找以下之一:

  • 關於如何設置 iptables 以實現上述目的的簡單指南(我不能成為第一個想要這樣做的人)。
  • 指向可以執行此操作的一些使用者友好的防火牆配置軟體的指針(儘管請注意,我根本不想鎖定 eth0 端和 192.168.7.* 網路)。
  • 一些專門為此而設計的軟體的建議;我有一個想法,有一些包旨在實現與我想要的網吧等類似的功能,但我不確定從哪裡開始尋找,或者這些包是否可能是矯枉過正。

Debian Squeeze(或 Wheezy)中的任何工具已經是一大優勢。

使用 iptables 很容易做到這一點。在下面,“wan-iface”是您的 WAN 連接所在的介面。根據其連接方式,可能是 eth2、ppp0 等。另外,請注意,您可以通過編輯重命名乙太網介面/etc/udev/rules.d/70-persistent-net.rules——當您有多個介面時強烈推薦。-i lan比 清楚得多-i eth0

您可以編寫一個 init.d 腳本以在啟動時應用這些規則或使用 iptables-persistent 包。或者封裝了各種防火牆規則生成器(我個人是直接寫iptables規則,因為我經常想做一些奇怪的事情)。

如果您現有的規則尚未涵蓋它,您將需要一個 NAT 規則:

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o wan-iface -j SNAT --to-source external-ip

External-ip 是您的實際 IP 地址。如果你有一個動態的,將該行更改為:

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o wan-iface -j MASQUERADE

然後你需要一個防火牆規則來允許流量。我在這裡給出兩個,這取決於您的轉發預設值是否為 DROP。它應該是下降,但…

iptables -A FORWARD -i eth1 -o wan-iface -j ACCEPT # default is drop
iptables -A FORWARD -i eth1 ! -o wan-iface -j DROP # default is accept

現在,您只需要允許 DHCP。假設您的防火牆正在執行 DHCP,並且 DNS 在 WAN 上(否則,您需要允許它們與 DNS 伺服器通信):

iptables -A INPUT -i eth1 -p udp --dport bootps -j ACCEPT
iptables -A INPUT -i eth0 -j DROP # only if your default isn't drop

這就是我相信的最小配置。您還可以限制發送到 Internet 的流量。例如,如果您只想瀏覽網頁,而不是上面的 FORWARD 規則,您可以這樣做(再次假設 WAN 上的 DNS):

iptables -A FORWARD -i eth1 -o wan-iface -p tcp --dport domain -j ACCEPT
iptables -A FORWARD -i eth1 -o wan-iface -p udp --dport domain -j ACCEPT
iptables -A FORWARD -i eth1 -o wan-iface -p tcp --dport http -j ACCEPT
iptables -A FORWARD -i eth1 -o wan-iface -p tcp --dport https -j ACCEPT
iptables -A FORWARD -i eth1 -j DROP # only if default is accept

請注意,上面允許三個埠,域(TCP 和 UDP,用於 DNS)、http (TCP) 和 https (TCP)。

編輯:

回應您的澄清:

聽起來這個盒子上目前沒有發生 NAT。此外,沒有 WAN 介面,流量通過 LAN 流出。不是最好的設置,但可行。

我將使用“lan-ip”來表示您 LAN (eth0) 上 Debian 機器的 IP 地址。我將使用“guest-ip”來表示您的來賓網路(eth1)上同一個盒子的 IP 地址。

我在寫這篇文章時對你的介面命名感到困惑,所以我假設你接受我的建議並將介面重命名為“lan”(eth0)和“guest”(eth1)。如果沒有,您可以進行查找和替換。

聽起來您目前沒有在此框上設置路由或防火牆,所以我將給出完整的規則,而不僅僅是要添加的規則。當然,您可能還需要添加更多內容。

您需要打開 IP 轉發(編輯 /etc/sysctl.conf 以執行此操作)。並在同一文件中打開反向路徑過濾器。

您需要配置 DHCP 以在您的 eth1 網路上提供服務。請注意,它提供伺服器的預設網關(僅適用於 eth1 訪客網路)需要是訪客 IP,而不是192.168.7.1。

您的 NAT 規則看起來會有些不同。最好不要這樣做,而是在 192.168.7.1 上執行此操作,但我猜這是不可能的。如果可能,跳過這條 nat 規則,改為在 7.1 上添加,並通過 lan-ip 添加到 192.168.1.0/24 的路由。

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o lan -j SNAT --to-source lan-ip

現在,由於您目前沒有設置防火牆,因此預設拒絕。通常,這是最安全的做事方式。

iptables -P INPUT DROP    # default for traffic to firewall (this box)
iptables -P FORWARD DROP  # default for forwarded traffic
iptables -F               # clear rules
iptables -X               # delete custom chains
iptables -t nat -F        # same, but for nat table
iptables -t nat -X

iptables -A INPUT -i lo -j ACCEPT  # let the box talk to itself. Important.

此時,您的盒子將完全無法訪問。不是你想要的。接下來的幾條規則解決了這個問題。前兩個設置連接跟踪,允許屬於現有連接(或與之密切相關)的數據包

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

然後我們現在假設您信任辦公室 LAN 上的機器,並允許來自它們的所有流量。如果您願意,可以將其更改為更受限制的規則。請注意,FORWARD 規則將允許您從辦公室 LAN訪問訪客網路上的機器。如果不需要,請忽略它。

iptables -A INPUT   -i lan          -j ACCEPT
iptables -A FORWARD -i lan -o guest -j ACCEPT

現在,允許來自訪客網路的一些流量。首先,您需要允許 DHCP。

iptables -A INPUT -i guest -p udp --dport bootps -j ACCEPT # dhcp

接下來,我假設您不想允許訪客訪問您的任何私有網路。因此,我們只需將所有訪客流量丟棄到 RFC1918(私有)空間。

iptables -A FORWARD -i guest -d 10.0.0.0/8      -j DROP  
iptables -A FORWARD -i guest -d 172.16.0.0/12   -j DROP
iptables -A FORWARD -i guest -d 192.168.0.0/16  -j DROP

由於我們已經刪除了所有私有地址空間,其餘的都是公共的。所以允許它。這條線有點嚇人,好像前面的一條線不見了,就麻煩了。

iptables -A FORWARD -i guest -o lan -j ACCEPT

您當然可以將其限制為特定的協議和埠(如僅在 Web 瀏覽範例中)。

您還可以添加規則以記錄丟棄的數據包等。

引用自:https://unix.stackexchange.com/questions/46104