iptables防火牆轉發

iptables防火牆轉發

我目前正在研究 Linux 路由器,但我無法按照我想要的方式對其進行防火牆設定。

路由器有三個介面 - WAN,這是保存的行動寬頻專用子網,172.18.15.0/24並且具有我不信任的設備172.18.15.2專用子網路。 10.0.0.0/24WAN 用於透過 OpenVPN 存取它,並且是路由器的預設閘道。

路由器 IP 是172.18.15.110.0.0.1。在 iptables 中,我有 DNAT 規則,用於在返回時將連接埠80流量轉10.0.0.1送到女巫 MASQUERADE。172.18.15.2

這部分工作正常。

我擔心的是,當私有子網路中的任何人選擇10.0.0.1作為其預設閘道或建立到172.18.15.0/24via的路由時10.0.0.1,它172.18.15.2也會暴露。我想停止這種行為,因此訪問172.18.15.2網路的唯一方法是透過位址10.0.0.1

如果我取消轉發,我也會取消DNAT,這是個問題。

我想到的一種方法是安裝 apache 並建立反向代理。但是我不確定這是否是正確的方法和正確的方法。

感謝您的建議!

編輯:

172.18.15.2是簡單的設備。在本例中,它只能有自己的位址和網關位址172.18.15.1。它正在響應,因為我已經設定了/etc/sysctl.conf net.ipv4.ip_forwarf=1

這是iptables-save -c
enp1s0 的轉儲,是 10.0.0.0/24 的介面
enp2s0 是 172.18.15.0/24 的介面
wwx582c80139263 是行動寬頻閘道的介面

# Generated by iptables-save v1.6.0 on Mon Apr 16 08:27:45 2018
*filter
:INPUT ACCEPT [840:388180]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [643:92809]
[0:0] -A INPUT -d 10.0.0.0/24 -p tcp -m tcp --dport 80 -j ACCEPT
[0:0] -A INPUT -d 10.0.0.0/24 -p tcp -j DROP
COMMIT
# Completed on Mon Apr 16 08:27:45 2018
# Generated by iptables-save v1.6.0 on Mon Apr 16 08:27:45 2018
*nat
:PREROUTING ACCEPT [10:648]
:INPUT ACCEPT [10:648]
:OUTPUT ACCEPT [11:770]
:POSTROUTING ACCEPT [11:770]
[0:0] -A PREROUTING -i enp1s0 -p tcp -m tcp --dport 80 -j DNAT --to- 
destination 172.18.15.2:80
[0:0] -A POSTROUTING -s 172.18.15.0/24 -j MASQUERADE
[0:0] -A POSTROUTING -o wwx582c80139263 -j MASQUERADE
COMMIT
# Completed on Mon Apr 16 08:27:45 2018

答案1

使用反向代理(應插入X-Forwarded-For標頭用於記錄目的)並刪除網路轉送將是一個乾淨的解決方案。應清楚地理解下面的解決方案,以避免進一步更改 iptables 規則產生意外影響。

那是說...

問題

  • LAN10.0.0.0/24的節點絕對不能使用Router當路由器,至少不能到達172.18.15.0/24。無論如何,有些人確實會這樣做。
  • 路由器透過DNAT和轉送為節點提供位於172.18.15.0/24( 172.18.15.2:80)的服務。10.0.0.0/24
  • 一旦資料包到達過濾器/轉發鏈,就無法區分它們是最初的目的地10.0.0.1然後DNATed還是直接發送到172.18.15.2(這應該被禁止)。

解決方案

因此,分類必須在 NAT 發生之前完成:在 mangle 表中,如下所示Netfilter 和通用網路中的封包流示意圖。這個獨特的規則足以處理它:

iptables -t mangle -A PREROUTING -s 10.0.0.0/24 -d 172.18.15.0/24 -j DROP

但通常,為了更好的管理,應該有角色的分離:mangle 來改變(而不是刪除)或此處標記,以及過濾表(預設)來過濾和刪除。透過在 mangle 步驟中使用標記,並在過濾步驟中匹配該標記以進行丟棄,可以實現這一點。所以這是等價的:

iptables -t mangle -A PREROUTING -s 10.0.0.0/24 -d 172.18.15.0/24 -j MARK --set-mark 1
iptables -A FORWARD -m mark --mark 1 -j DROP

(並且要真正完整:iptables -A INPUT -m mark --mark 1 -j DROP防止訪問172.18.15.1

任何一種方法都是等效的。當然,如果確實只有設備172.18.15.2需要保護,則替換-d 172.18.15.0/24-d 172.18.15.2.

更新:可以使用依賴 conntrack(由於 NAT 已在使用)的更簡單方法:查詢連線了解資料包是否確實經過 DNA 鑑定,如果沒有則丟棄它。所以這簡化了事情,因為這只是一個規則,並且只是在過濾器/轉發鏈中。因此,作為第三種方法,代替上面的規則:

iptables -A FORWARD -s 10.0.0.0/24 -d 172.18.15.0/24 -m conntrack ! --ctstate DNAT -j DROP

另外,以下行無用,可以刪除。 PREROUTING 使用 DNAT 更改了目的地,因此流永遠不會到達 INPUT,而是透過 FORWARD 鏈:

[0:0] -A INPUT -d 10.0.0.0/24 -p tcp -m tcp --dport 80 -j ACCEPT

相關內容