作者 主題: 請教有關squid multi wan 與iptables  (閱讀 11210 次)

0 會員 與 1 訪客 正在閱讀本文。

seye586

  • 懷疑的國中生
  • **
  • 文章數: 35
    • 檢視個人資料
請教有關squid multi wan 與iptables
« 於: 2010-03-01 14:40 »
大家好

我在linux上架設了 squid proxy(transparent)
有兩個wan

eth0 wan1
eth1 wan2
eth2 lan 192.168.1.254

剛開始我想要讓 192.168.1.0/24走wan2 上網
所以我建了一個table t1
wan1's gateway dev eth0  scope link
192.168.1.0/24 dev eth3  scope link
default via wan1's  dev eth0

iptables -t nat -A -PREROUTING -A -p tcp --dport 80 -s 192.168.1.0/24 -j REDIRECT --to-port 3128
iptables -t mangle -PREROUTING -A -s 192.168.1.0/24 -j MARK --set-mark 1

實際測試結果http request封包有時跑eth0 有時跑eth1
之前的想法是想說封包經過squid 後會走default 的route table
我的default route table
wan1's geteway dev eth0  scope link
wan2's gateway dev eth1  scope link
default
         nexthop via  wan1's geteway dev eth0 weight 1 onlink
         nexthop via  wan2's geteway dev eth1 weight 1 onlink

又在mangle OUTPUT 再下了一次mark
iptables -t mangle -OUTPUT -A -s 192.168.1.0/24 -j MARK --set-mark 1

上網搜尋了一下
在squid.conf 加入了
tcp_outgoing_address  wan1's gateway
封包就變正常了

我想要問的是
當192.168.1.x 發出http reqest
封包的流向     iptables nat redirect 3128 => iptables mangle set mark 1=> 依照table 1 傳送封包
在redirect 3128後 squid proxy 收到封包為什麼不會按照 mangle所設定的走

為什麼加了tcp_outgoing_address  wan1's gateway 就ok了 squid做了什麼特別的嗎
請各位前輩指教

謝謝
« 上次編輯: 2010-03-01 15:46 由 kenduest »

seye586

  • 懷疑的國中生
  • **
  • 文章數: 35
    • 檢視個人資料
回覆: 請教有關squid multi wan 與iptables
« 回覆 #1 於: 2010-03-02 14:35 »
大家好

去看了一下souce code
有加tcp_outgoing_address  wan1's gateway
會在squid 的socket 上 bind tcp_outgoing_address  的IP
若無則是bind  INADDR_ANY 0.0.0.0

如果有多個ip就會變成random嗎
還是試不出來如何在這種情況用iptables 讓封包走我預設的route table

kenduest

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 3673
    • 檢視個人資料
    • http://kenduest.sayya.org
回覆: 請教有關squid multi wan 與iptables
« 回覆 #2 於: 2010-03-02 23:18 »

1. 您的 -j MARK 這類規則設定很怪... 因為後續你沒有使用任何 mark 功能,所以 iptables 的 MARK 設定等於沒設定。另外連 POSTROUTING 的 nat table 的上網設定都沒看到.... 倒是多了 transparent proxy 設定無直接關係的項目。

2. 關於這行
代碼: [選擇]
iptables -t mangle -OUTPUT -A -s 192.168.1.0/24 -j MARK --set-mark 1 這個設定沒有意義,因為 OUTPUT 部份是自己主動連外的 rule,你加上 -s 192.168.1.0/24 根本與內部這段透過 nat 上網的 client 沒有任何連結關係。

3. 你應該於 POSTROUTING 這類設定如下 nat,指定只有使用某個介面出去,要不然依據你的 multipath 設定當然隨機決定。

代碼: [選擇]
iptables -A POSTROUTING -t nat -s 192.168.1.0/24 -j SNAT --to <WAN2_eth1_IP>
I am kenduest - 小州

my website: http://kenduest.sayya.org/

dark

  • 俺是博士!
  • *****
  • 文章數: 1533
    • 檢視個人資料
回覆: 請教有關squid multi wan 與iptables
« 回覆 #3 於: 2010-03-03 16:20 »
除了上面 kenduest 大所提的
iptables -t mangle -PREROUTING -A -s 192.168.1.0/24 -j MARK --set-mark 1
還有這行 , 其實您想用 , 但也無法用到
若 squid 需出去抓 ... 這 client 封包已經不是內部來的 , 沒 mark 了

您的需求應該無法 "只用" iptables + routing table 達成

另外
代碼: [選擇]
iptables -A POSTROUTING -t nat -s 192.168.1.0/24 -j SNAT --to <WAN2_eth1_IP>
因為妳的系統有兩個身分
routing table 允許兩者 , 所以會有在 eth0 出現 wan1 的機會
有了這行 , 仍會強制將準備丟出 eth0 的封包改成 wan2 ip
(但 postrouting 已經過了 routing table , 所以無法改變丟的介面)

iptables 是 routing 前後動作的工具 (pre , post)
所以可以想成 routing table 根本不知道 iptables 的存在

至於您設定 squid bind 某 ip , 會不會在另一個介面出現
那就要收封包看看了

您做了不少 lab 呢 ...
若您的架構允許 , 有個多此一舉的無聊 lab
1. 在前端多加一台 linux
2. 將 squid 的程式 chmod suid 給 uid=123
3. mangle OUTPUT 找出 uid=123 的封包做 set-tos xx (在 tos 欄位做 mark)
4. 前端那台 linux 便可在 PREROUTING 應用這個 mark 了

因為不確定 mangle 的 mark 到下一台能不能看到
印象中 tos 只有 5 種等級 , 確有 8 bit ... 仍有未用到的
不過到這裡 , 不用 lab 應該知道 iptables 怎麼搭配使用了吧 ...