我有一組服務,我想為其中一個服務設定基於 IP 的 ACL(白名單),但不為另一個服務設定。當服務在內部相同連接埠(連接埠 80)上運行時,問題似乎就會出現,但我在網關上使用不同的連接埠來存取它們。
網關上的連接埠 8088 -> 10.0.0.A 上的連接埠 80(附 IP 白名單) 網關上的連接埠 80 -> 10.0.0.B 上的連接埠 80
我可以按照以下規則讓它與所有打開的東西一起工作:
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8088 -j DNAT --to 10.0.0.A:80 iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 10.0.0.B iptables -A 轉送 -p tcp -i eth0 --dport 80 -j 接受
問題是 FORWARD ACCEPT 規則涵蓋了這兩個 nat 規則,因為它們似乎是基於目標連接埠 (--dport 80),而不是網關上的傳入連接埠(80 與 8088)。
我不知道如何將 FORWARD 規則重寫為 2 個單獨的規則,以便我可以對 80 與 8088 上進入網關的連接有不同的行為。
附加資訊:
lsb_release -d 描述:Debian GNU/Linux 7.5(喘息) iptables--版本 iptables v1.4.14
第一次解決方案嘗試 我已經能夠分離一條鏈並在那裡執行路由,但由於以下錯誤訊息,我無法新增 ACL(拒絕)行:
x_tables: ip_tables: REJECT 目標:僅在過濾表中有效,在 nat 中無效
這是我輸入的內容:
iptables -t nat -N 白名單 iptables -t nat -A 白名單 -p tcp -j DNAT --to 10.0.0.A:80 iptables -t nat -A 白名單 -s <whatsmyip.org> -j RETURN iptables -t nat -A 白名單 -j REJECT iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8088 -j 白名單
一切正常,直到第 4 行,nat 內的 REJECT 失敗。如果我註解掉 REJECT 行,我可以確認其餘邏輯有效,並且連接埠變為開放狀態,因為沒有任何內容被拒絕。
下一個解決方案嘗試 在使用正確設定的單獨鏈時,似乎遇到了最初的問題。從頂部更改連接埠的 PREROUTING 規則似乎仍然會導致非 nat ACL 嘗試出現問題。 ACL規則無效,連接埠對外開放。
iptables -N 白名單 iptables -A 白名單 -s <whatsmyip.org> -j RETURN iptables -A 白名單 -j REJECT iptables -A INPUT -i eth0 -p tcp --dport 8088 -j 白名單 iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8088 -j DNAT --to 10.0.0.A:80
解決方案嘗試#3 我嘗試先設定白名單,然後在解析白名單後嘗試連接埠重定向。載入規則時,它不會產生預期效果,因為流量未從白名單 IP 到達其預期目的地。儘管我實際上並不能 100% 確定該行為實際上是什麼。我無法判斷流量是否在 iptables 中被拒絕,或者連接是否被接受並推送到連接埠 8088 上的目的地而無需更改連接埠?我不確定如何驗證連接埠重定向是否確實完成。以下是本次嘗試的規則:
iptables -N 白名單 iptables -A 白名單 -s <whatsmyip.org> -j RETURN iptables -A 白名單 -j REJECT iptables -A INPUT -i eth0 -p tcp --dport 8088 -j 白名單 iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8088 -j DNAT --to 10.0.0.A iptables -t nat -A 輸出 -p tcp --dport 8088 -j REDIRECT --to-ports 80
目前狀態 未解決。不確定我是否應該看看是否可以找出另一種方法來在白名單之後重定向端口,或者是否有一種簡單的方法可以確定當前解決方案失敗的位置(是通過8088 轉發而沒有80 重定向,還是只是簡單地被屏蔽了?
答案1
改變
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8088 -j DNAT --to 10.0.0.A:80
跳到實現您的 acl 的用戶-用戶定義的鏈。例如,
iptables -t nat -N foo
iptables -t nat -A foo --source 192.168.0.0/24 -j RETURN
iptables -t nat -A foo -j REJECT
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8088 -j foo
編輯:
iptables -N foo
iptables -A foo --source 192.168.0.0/24 -j RETURN
iptables -A foo -j REJECT
iptables -A INPUT -i eth0 -p tcp --dport 8088 -j foo