作者: kenduest (小州) 站內: LinuxNetwork
標題: [文件]使用 iptables 設定使用 NAT 分享網路頻寬
時間: Tue May 15 19:09:03 2001

   Linux 上使用 IP-Masquerade 所謂的 IP 儰裝以便於達成該功能。

   Linux 上的 IPMASQ 因為 kernel 一些核心功能有調整過,所以相關的設定工具
   因為不同的核心版本所以不同.

   kernel 2.0.x 時代,是使用 ipfwadm 程式。(這個說法不算是完全正確)

   kernel 2.1.x/2.2.x 時代,則是使用 ipchains 程式

   kernel 2.3.x/2.4.x 時代,使用 netfilter 過濾機制, 是使用
   iptables 程式。

   演進來看,目前 kernel 2.4 配合使用 netfilter 核心過濾機制,
   可以達到的功能相當棒.... 那 netfilter 提供那些機制呢?
   比方:

      1. 傳統 ipchains 的任何功能(基本來源與目的封包過濾、導向、偽裝)
      2. 提供 Source NAT 與 Destination NAT 的功能
      3. 可以針對特定使用者、群組、PID 等限制網路連結的過濾存取
      4. 可以設定封包在 Routing Table 進出前時先預先處理
      5. 提供可以讓 UserSpace 的程式處理 filter 部分。
      6. 可以針對外面自動建立、與現有連線有關這類連線過濾處理...
      7. 可以針對 Mac 卡號處理。

   ipmasq 的文件,那邊可以閱讀呢? linux 本身提供的 howto 很足夠了...

   使用 ipfwadm/ipchains 等程式的 kernel 環境,可以參考:

   http://www.linux.org.tw/CLDP/IP-Masquerade-HOWTO.html

   不過該版文件中文翻譯已經太久沒有更新了,建議找原文的
   IP-Masquerade-HOWTO 文件。那邊找呢?可以上這裡找找:

   http://www.linuxdoc.org

   裡面提到了包含 port forward 等相關重要的資訊。比方
   ipmasqadm 等程式的使用。

   若是您目前使用 kernel 2.3/2.4,可以參考這給篇中譯文:

   http://www.linux.org.tw/CLDP/NAT-HOWTO.html

   http://www.linux.org.tw/CLDP/Packet-Filtering-HOWTO.html

   相同的,原文部份,上 http://www.linuxdoc.org 也有喔..

   當然,若是您的 linux dist 版本是最近的,那系統安裝好的
   HOWTO 文件應該也可以找到..

   ok.. 若是您目前要使用 nat 功能的話,首先就是確定您的核心是支援
   linux firewall 與 ip masquerade 功能... 不過目前許多 Linux
   Distribution 都已經把 IP Masquerade 支援編入到 kernel 內了,
   所以重編 kernel 的部份可以略過....

   當然啦,目前 kernel 2.4.0 正式 release 出沒有多久,所以若是
   您打算使用 netfilter 提供的一些先進的機制,那您需要先更新
   核心到 2.4,編譯核心時要選擇把 netfilter 提供的一些功能打開..
   (可以選擇編入核心 或者是編譯成為 module)

   這裡環境,假設:

   對外 internet 連結的 ip 是: 210.1.1.1
   對內的部份,使用 192.168.1.1

   當然,您需要兩張網路卡,一張就是設定 210.1.1.1,另外一張
   就是設定 192.168.1.1 (netmask: 255.255.255.0)

   另外提到,有人會說到也許可以使用 ip aliases 達到一張網路卡
   就可以有兩個 ip .. 當然,這是可行的.. 不過弟不建議使用在
   nat 的環境下.. 一者是因為一般 nat 多半充當 firewall,而
   若是使用 ip aliases 後對外與對內的封包都跑在同一個 interface
   上,那就失去封包過濾功能了... 而不同區段的封包跑在一起,網路
   效能也是會變差的...

   OK.. 目前要啟動 nat/ipmasq 功能的話,首先就是只要 Linux 主機把
   IP Forwarding 打開 (ip 轉送),並使用 ipchains/iptables 等這類程式
   設定好後,Client 端就可以透過 Linux 這台 gateway 主機的協助而上網了。

   kernel 2.2.x :

    echo "1" >  /proc/sys/net/ipv4/ip_forward
    ipchains -P forward DENY
    ipchains -A forward -i eth0 -j MASQ -s 192.168.1.0/24
    ipchains -M -S 86400 86400 360  <-- 這是讓 timeout 拉長一點
    modprobe ip_masq_ftp <-- 掛入 ftp 等 module 處理 ftp 相關連結問題

    當然,我想另外的一些 ipmasq module 一起掛入也許比較完整一點...

    ip_masq_cuseeme、ip_masq_irc、ip_masq_mfw、ip_masq_pptp、
    ip_masq_quake、ip_masq_raudio、ip_masq_user、ip_masq_vdolive ..

   kernel 2.3.x/2.4.x :

    echo "1" >  /proc/sys/net/ipv4/ip_forward
    modprobe ip_tables  # 這是編譯核心是選擇 module 才需要
    modprobe ip_nat_ftp # 同上,處理 ftp 等連結問題
    modprobe ip_conntrack
    modprobe ip_conntrack_ftp
    modprobn ip_conntrack_irc
    iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.0/24 -j MASQUERADE

  上面等使用上,請先注意各位系統目前預設每個 INPUT、OUTPUT、FORWARD CHAIN
  是不是為 ACCEPT ,而不是 DROP/DENY 或者是 REJECT。

  for kernel 2.2 :

  ipchains -P input ACCEPT
  ipchains -P output ACCEPT
  ipchains -P forward ACCEPT

  若是要把就有規則清除,可以補上:

  ipchains -F
  ipchains -X

  for kernel 2.4 :

  iptables -P INPUT ACCEPT
  iptables -P OUTPUT ACCEPT
  iptables -P FORWARD ACCEPT

  若是要把就有規則清除,可以補上:

  iptables -F
  iptables -X
  iptables -F -t nat
  iptables -X -t nat

  上面很單純的提供 nat/ipmasq 服務,沒有針對一些安全性考量,比方
  聲稱來自內部網路的 ip 範圍,是由 eth0 這個對外 interface 進入的話那就
  應該拒絕.... 比方像是位於 eth1 上 192.168.1.x 這段虛擬 ip 區段就
  是一個例子。所以這裡要說的是,若是要嚴謹一點的話,額外的設定是很需要的...

  另外補充的,就是 port forward 部份,kernel 2.2.x 內是使用
  ipmasqadm 達成:

  ipmasqadm portfw -a -P tcp -L 210.1.1.1 25 -R 192.168.1.100 25

  該 ipmasqadm 敘述,提供讓 nat 對外主機,可以讓他人使用
  210.1.1.1 port 25 進行 tcp 服務連結,而該連結請求會轉給內部主機
  192.168.1.100 port 25 .. 簡單說,這行敘述是給有一台 mail server
  是放在 nat 架構內使用虛擬 ip,然後透過 nat 主機設定 port 重導
  到內部的真實主機。

  若是使用 kernel 2.4 的話,iptables 指令則是:

   iptables -A PREROUTING -t nat -p tcp -d 210.1.1.1 \
        --dport 25  -j DNAT --to 192.168.1.100:25

   當然,以前有人提到,外面使用 telnet 210.1.1.1 25 的確是可以 work,
   不過內部 192.168.1.x 的電腦若是 telnet 210.1.1.1 25 就不行..
   那補上下面的敘述:

   iptables -A OUTPUT -t nat -p tcp -d 210.1.1.1 \
        --dport 25 -j DNAT --to 192.168.1.100:25

   上面說的是單一 port 重導.. 若是需要的功能是全部 port 都
   重導的話,比方就是使用:

  iptables -A PREROUTING -t nat -p all -d 210.1.1.1  \
             -j DNAT --to 192.168.1.1

  ok.. 此外幾點要說明的是:

  1. 目前許多人都使用 adsl 寬頻,若是使用計時制的話要注意的是,
     因為透過 pppoe 這類程式撥接後,會產生一個 ppp0 的 interface,
     然後再透過一個網路卡介面作封包的傳輸,所以先前的指令有指定
     eth0 的敘述要改成 ppp0 才正確....

  2. 使用 nat 後,使用虛擬 ip 連上網路的電腦,一般使用上應該是
     不大會有問題的... 不過若是想與 internet 上的電腦玩網路
     遊戲對戰的話,可能會發生一些問題.... 因為許多 game 的網路連線
     的運作方式在 nat 架構下多半無法工作.... 一般解決方式,找看看
     是否有專人寫出了 ipmasq 的 module,掛入後就可以解決了...
     或者是找出相關的 game 是有那些 port 的連結,然後設定好 port
     forwarding 的動作即可。

     關於 port forwarding 部份,這裡有個連結提供很好的資訊:

     http://www.tsmservices.com/masq

     許多 ap 程式、game 等等都有提供相關解決設定,不過都是針對
     kernel 2.2.x 內配合使用 ipmasqadm 程式.. 若是是使用 kernel 2.4
     的話,研究一下 iptables 指令的用法後,同樣也是可以完成的。

  3. 有人無法使用 icq 傳檔案,甚至無法正確傳訊息?我建議更新
     icq 到 2000 等版本,然後把連結設定改成在 firewall 後面
     使用,那就沒有問題了...

  4. 要觀察目前設定規則,請使用 iptables -L 。若是當初有使用 -t xxxx
     的話,請使用 iptables -L -t xxx 。ex: iptables -L -t nat

  5. 先前 netfilter 核心機制有一些 bug (Connection State,Related state
     bug) 會導致一些安全性的問題,see:

     http://www.tempest.com.br/advisories/01-2001.html

     http://netfilter.samba.org/security-fix/

     (Mandrake 8.0 , the kernel is ok )

  6. 若是遇到先前使用 kernel 2.2 都可以正常連線到一些站台,但是用了
     kernel 2.4 後卻不行得情況... 實際例子可能就是,可以 ping 到對方,
     不過卻連不上對方主機。

     echo 0 > /proc/sys/net/ipv4/tcp_ecn

     see: http://www.tux.org/lkml for more information

  7. 該篇文章省略設定網路卡的步驟...

  大概就是這樣子了,有問題請告知,也歡迎大家討論。


----------


> 作者: kenduest (小州) 站內: LinuxNetwork
> 標題: [文件]iptables/chains + squid transparent proxy
> 時間: Sun Jul  1 08:32:08 2001
>
>
>   transparent proxy,簡單說,就是透通性 proxy,clint 存取 web port
>   時,gateway 能夠把這個 request 導向給 proxy server,由 proxy
>   server 代為 proxy 抓資料,然後會應給 client 。(註: 一般用在 web
>   的 proxy)
>
>   transparent proxy 好處就是,client 不用特定設定 proxy,可以暗自
>   由 gateway 達成這個目的。整體就是能夠因為 proxy 的機制,對於
>   web 瀏覽部份能夠避免重複抓取相同的資料,省下大量的頻寬。
>
>   transparent proxy,當然需要一台 proxy 主機幫忙。這裡的環境就是:
>
>   --> 一台 Linux 主機,提供 nat 功能,上面同時跑 squid proxy 服務
>       於 3128 port 。 eth0 對外,eth1 對內。
>
>   squid.conf 需要先設定好,以便於可能使用 transparent proxy 機制。
>
>   httpd_accel_host proxy.xxx.com.tw
>   httpd_accel_port 80
>   httpd_accel_with_proxy on
>   httpd_accel_uses_host_header on
>
>   (see: http://www.squid-cache.org/Doc/FAQ/FAQ-15.html#ss15.4 )
>
>   上面的 proxy.xxx.com.tw 請改成該 proxy 主機名稱。
>
>   接著是 nat、transparent proxy 機制設定。以 kernel 2.2 來說,是這般設定:
>
>   ipchains -A input -i eth1 -p tcp -s xxx.xxx.xxx.xxx/netmask -d 0/0
>   --dport 80 -j REDIRECT 3128
>
>   ipchains -A forward -i eth0 -s xxx.xxx.xxx.xxx/netmask -d 0/0 -j MASQ
>
>   設定好後,只要是 xxx.xxx.xxx.xxx 這些 private ip 對外發出
>   port 80 的 request 後,就會導向給該 nat 主機上的 port 3128,
>   由 squid cache server 代為 proxy 資料。
>
>   使用 kernel 2.4 的話:
>
>   iptables -t nat -A PREROUTING -i eth1 -p tcp -s xxx.xxx.xxx.xxx/netmask
\
>   --dport 80 -j REDIRECT --to-ports 3128
>
>   iptables -t nat -A POSTROUTING -o eth0 -s xxx.xxx.xxx.xxx/netmask \
>    -j MASQUERADE
>
>   ...[節錄結束]


---------