廣告廣告
  加入我的最愛 設為首頁 風格修改
首頁 首尾
 手機版   訂閱   地圖  簡體 
您是第 4085 個閱讀者
 
發表文章 發表投票 回覆文章
  可列印版   加為IE收藏   收藏主題   上一主題 | 下一主題   
SENFO 手機
個人頭像
個人文章 個人相簿 個人日記 個人地圖
初露鋒芒
級別: 初露鋒芒 該用戶目前不上站
推文 x0 鮮花 x4
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片
推文 x0
[資訊教學] 混合多條adsl經linux連進內部ftp主機之相關設定理論總檢討
心得~這是以前在中華網-科技頻道看過的文章把他節錄下來的~分享給大家!

我的公司需求是:
1. 讓防火牆內部的 FTP 主機提供客戶上傳資料
資料進來的量比出去的量大很多(假設 5:1 )
2. 讓內部少數員工上網查資料

原先是用:
hinet 1.5/384 固1 IP x 1
giga 512/512 固5 IP x 5
經由 linux 轉到內部一台 FTP server
讓不同的客戶用不同的 ip 連上來以分散流量
但最近公司"趁我不注意時"將所有的 giga 線路退掉,
改成兩條 hinet 12M/1M 撥接式固定1 ip ,
我一直很奇怪為什麼跟以前類似的配置卻沒辦法讓所有的線路同時連進來,
直到今天才找到解決的方法.

當初在使用 hinet + giga (都是真正的固定 IP)的時候,
就發現一個奇怪的現象,
將 default gateway 設在 hinet 上,
其他的 giga 線路從linux通通都 ping 不出去(更別說接受進來的FTP連線了)
但是把 default gateway 設在其中一條 giga 線路上,
所有的線路卻都可以正常的接受連線,
是什麼原因我也沒有深究,
當時想說反正通通可以連進來就好了.

現在全部都是 hinet 的線 (12M/1M 撥接式固定 ip x2條 + 1.5/384固1 ip x1條)
卻是怎麼設都只能有一條可以接受FTP連線(設為 default gateway那條),
即使所有線路都可以 ping 出去或是 ping 進來.

搞了好幾天,
爬了無數的文章,
終於還是搞不定.
想說就像以前一樣用一條非 hinet 的線路來做 gateway 試試看
就跟樓上借了一條 seednet 512/512 固定 5 ip 的來
終於四條線都可以通了.....
由於板上有看到類似的但是跟我的環境不儘相同,
(因為我的環境混合了固定式ADSL和撥接的ADSL,
也有不同家的線路,
而且主要提供服務的不是linux本身)
想說把我的經驗拿出來給大家參考,
當然中間試過很多方法,
我把最後可用的方法寫出來.
如果方便也加上一些我嘗試錯誤的經驗,
希望給有相同需求的人一點參考.
有錯之處也請多多指教.

===============================================

目的:
 1.讓linux內部的 FTP 主機提供客戶上傳與下載資料
  資料進來公司的量比出去的量大很多(假設 5:1 )
 2.讓內部少數員工上網查資料

現在,
外部線路(連到同一個 Linux box)如下

 A 線ppp0:12M/1M hinet 撥接式固定IP=a.a.a.a gateway=a.a.a.gw
 B 線ppp1:12M/1M hinet 撥接式固定IP=b.b.b.b gateway=b.b.b.gw
   eth3 :給 ppp0
   eth4 :給 ppp1
 C 線eth2 :1.5/384 hinet 固定IP=c.c.c.c gateway=c.c.c.gw
 D 線eth5 : 512/512 seednet 固定IP=d.d.d.d gateway=d.d.d.gw

連到公司內部

 eth0 : ip= 10.0.1.254 / 23
 eth1 : 測試用

內部網路環境:

 網路:10.0.0.0/23 (IP range = 10.0.0.1-10.0.1.254)
 FTP主機:10.0.0.5/23

主機環境:
 linux: fedora core3 預設核心
 所有的核心或套件都是用預設的.
 網路卡 eth0 : intel gigabit server
     eth1 : 主機板內建 sis900
     eth2-5 : DLink 一張4port的卡...型號忘了

===============================================
第一大步:設定網路連線
 相關設定檔:
  1.1. 核心載入模組 /etc/modprobe.conf (我之前的rh8 是叫 modules.conf)
   這個檔案告訴核心哪一個介面(ex: eth0)要用哪一個模組(e1000)
   (至於模組放在哪,可用 locat e1000.o找到)
代碼:
cat /etc/modprobe.conf
alias eth0 e1000
alias eth1 sis900
alias eth2 sundance
alias eth3 sundance
alias eth4 sundance
alias eth5 sundance


  1.2. 每張網路卡的設定檔 /etc/sysconfig/network-scripts 下面ifcfg開頭的都是了.
   例如我的eth2的設定如下
代碼:
cat /etc/sysconfig/network-scripts/ifcfg-eth2
MTU=1500
NETMASK=255.255.255.0
GATEWAY=c.c.c.gw
BOOTPROTO=static
BROADCAST=c.c.c.255
IPADDR=c.c.c.c
NETWORK=c.c.c.0
MACADDR=00:05:5d:71:98:28 --> 這參數可以用來指定eth2對到哪一張卡
ONBOOT=yes
DEVICE=eth2
 

   要做router一定會加上一堆網路卡,
   以前不知道怎麼設讓某張卡固定在某個介面(ex: eth0)
   以為跟插在PCI上的順序有關,
   插插拔拔的弄了好久,
   當然還有無數次的重開機以及跟 kudzu 的奮戰
   嗯嗯.....言歸正傳,
   如果要查哪張卡現在對應到哪個介面
   可用指令 ip address ls 來查
   指令 ip address ls up 可以列出現在運作中的連線
   by the way
   ip 這個指令非常好用,
   但有很多的縮寫可以用,
   所以一開始爬文時搞的眼花撩亂,
   直到爬到 iproute2的文件http://snafu.freedom.org/linux2..../ip-cref.html 
   才終於有點頭緒
   例如 ip address ls = ip a show = ip addr l = ip a l
   因為address = addr = a
     ls = show = list = l
   又例如常用的 ip route add 或 ip rule ...
   route = ro , rule = ru
   以此類推.
   我的機器上執行 ip address list up
代碼:
1: lo: <LOOPBACK,UP> mtu 16436 qdisc noqueue
  link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  inet 127.0.0.1/8 brd 127.255.255.255 scope host lo
  inet6 ::1/128 scope host
    valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000
  link/ether 00:02:b3:97:1d:a5 brd ff:ff:ff:ff:ff:ff
  inet 10.0.1.254/23 brd 10.0.1.255 scope global eth0
  inet6 fe80::202:b3ff:fe97:1da5/64 scope link
    valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000
  link/ether 00:e0:18:d3:29:4b brd ff:ff:ff:ff:ff:ff
  inet6 fe80::2e0:18ff:fed3:294b/64 scope link
    valid_lft forever preferred_lft forever
4: eth2: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000
  link/ether 00:05:5d:71:98:28 brd ff:ff:ff:ff:ff:ff
  inet c.c.c.c/24 brd c.c.c.255 scope global eth2
  inet6 fe80::205:5dff:fe71:9828/64 scope link
    valid_lft forever preferred_lft forever
5: eth3: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000
  link/ether 00:05:5d:71:98:29 brd ff:ff:ff:ff:ff:ff
  inet6 fe80::205:5dff:fe71:9829/64 scope link
    valid_lft forever preferred_lft forever
6: eth4: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000
  link/ether 00:05:5d:71:98:2a brd ff:ff:ff:ff:ff:ff
  inet6 fe80::205:5dff:fe71:982a/64 scope link
    valid_lft forever preferred_lft forever
7: eth5: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000
  link/ether 00:05:5d:71:98:2b brd ff:ff:ff:ff:ff:ff
  inet d.d.d.d/24 brd d.d.d.255 scope global eth5
  inet6 fe80::205:5dff:fe71:982b/64 scope link
    valid_lft forever preferred_lft forever
9: ppp0: <POINTOPOINT,MULTICAST,NOARP,UP> mtu 1492 qdisc pfifo_fast qlen 3
  link/ppp
  inet a.a.a.a peer a.a.a.gw/32 scope global ppp0
10: ppp1: <POINTOPOINT,MULTICAST,NOARP,UP> mtu 1492 qdisc pfifo_fast qlen 3
  link/ppp
  inet b.b.b.b peer b.b.b.gw/32 scope global ppp1



  1.3. 設定 pppoe 的連線
   1.3.1. 用指令 adsl-setup 先設出一條 ppp0
   1.3.2. 設好一個ppp0後,將ifcfg-ppp0 拷貝成 ifcfg-ppp1並作適當修改
    我的 ifcfg-ppp0如下
代碼:
LCP_INTERVAL=20
GATEWAY=61.224.52.254
FIREWALL=NONE
PEERDNS=no
PROVIDER=DSLppp0  ---> 這裡把 ifcfg-ppp1改成不一樣
LCP_FAILURE=3
BROADCAST=""
ETH=eth3  ---> 這裡把 ifcfg-ppp1改成不一樣
CLAMPMSS=1412
DEMAND=no
USERCTL=yes
USER=8822xxxx@ip.hinet.net  ---> 這裡把 ifcfg-ppp1改成不一樣
CONNECT_TIMEOUT=60
CONNECT_POLL=6
BOOTPROTO=none
NAME=DSLppp0  ---> 這裡把 ifcfg-ppp1改成不一樣
TYPE=xDSL
DEVICE=ppp0  ---> 這裡把 ifcfg-ppp1改成不一樣
SYNCHRONOUS=no
MTU=""
NETMASK=""
IPADDR=""
DEFROUTE=no  ---> 這裡要注意
NETWORK=""
PING=.
PPPOE_TIMEOUT=80
ONBOOT=no
PIDFILE=/var/run/pppoe-adsl_0.pid  ---> 這裡把 ifcfg-ppp1改成不一樣

    
   DEFROUTE這個參數會把default gateway設成ppp抓到的那一個,
   如果你撥接不只一條線,那這個參數會讓default gateway設成最後撥上的
   那個ppp的gateway,
   我後面要手動設定這些所以把他設成no
   還有pppx會用到的ethx裡面不用設定東西,
   例如我的ppp0會用到eth3, ifcfg-eth3如下:
代碼:
NETMASK=""
MTU=""
BOOTPROTO=none
BROADCAST=""
IPADDR=""
NETWORK=""
MACADDR=00:05:5d:71:98:29
ONBOOT=no
DEVICE=eth3

   參考資料:
   http://phorum.study-area.org/viewtopic...light=adsl-setup

  1.4. 接著設定不同連線的密碼檔
   /etc/ppp/pap-secrets
   /etc/ppp/chap-secrets    
   兩個檔案都改成類似這樣
代碼:

# Secrets for authentication using CHAP
# client   server   secret       IP addresses
"8822xxxx@ip.hinet.net"   *   "2oixgxxx"
"8822xxxx@ip.hinet.net"   *   "2rxxoxxx"

   hinet如果撥接式的要撥到固定ip,
   連線名稱就由8822xxxx@hinet.net改成8822xxxx@ip.hinet.net
   加個ip就好了,其他ISP請參考他們的說明.

   我原來的機器是 rh8 ,連pppoe很不穩定,
   斷線重撥也常撥不上,
   現在換成fedora core3就沒有這些問題了....
   不過我其實也不知道它們到底差在哪說...
===============================================
第二大步:設定路由

  就我所知,(爬了好多好多文章啊!!)
  linux的路由規則是放在幾個路由表格裡的,
  路由主要是由 iproute2 這個套件來處理的,
  它的主要指令是以 ip 開頭,例如:
  指令ip rule 用來處理路由表格,
  指令ip route 用來處理路由規則,
  (還有 ip link , ip address, ip neighbour,ip maddress,ip mroute, ip tunnel等)
  例如我的路由表格: ip rule list (=ip ru show =ip rule ls.....)
代碼:
0:   from all lookup local
32763:   from c.c.c.c lookup eth2_gw   -> 我自定的
32764:   from b.b.b.b lookup ppp1_gw   -> 我自定的
32765:   from a.a.a.a lookup ppp0_gw   -> 我自定的
32766:   from all lookup main
32767:   from all lookup default


  簡單一點說 local,eth2_gw,ppp1_gw,main,default等都是路由表格
  裡面存放了一些路由規則(一般會簡稱這個為"路由")
  在核心要尋找如何去路由一個封包時,(路由也可作動辭表示"選擇路徑"這個動作)
  會由上而下比對這些路由表格的條件(ex : from a.a.a.a),
  如果條件符合就用該路由表格裡面的路由規則去決定封包何去何從.
  例如:從 a.a.a.a 來的封包就找 ppp0_gw這個路由表格裡的路由規則去決定路由
  (上面這句話若是簡略的話:從 a.a.a.a 來的封包就找 ppp0_gw這個路由表裡的路由去路由,嘿嘿...這誰看的懂啊?)

  有一個檔案顯示路由表格的權重編號,在/etc/iproute2/rt_tables
代碼:
#
# reserved values
#
#255   local
#254   main
#253   default
102   ppp1_gw   -> 我自定的
101   ppp0_gw   -> 我自定的
100   eth2_gw   -> 我自定的
#0   unspec
#
# local
#
#1   inr.ruhep

  在設定檔中我們隨便用數字代表先後的次序
  例如我要 eth2_gw 排在最前面,所以我給他100
  然後在記憶體中這個路由表格的順序號碼變成32763
  總之在設定檔中的數字你可以從2到252隨便選
  然後系統載入後會把順序變成它自己方便的順序
  就像上面執行 ip rule list 出現的那樣

  當然你可以只用手動加進一個路由表格,
  就像大多數的文件那樣,
  例如:
代碼:
ip ru add from 192.168.1.3 lookup 101
ip ru add from 192.168.2.3 lookup 102
ip ro add default gw 192.168.1.254 dev eth0 table 101
ip ro add default gw 192.168.2.254 dev eth1 table 102

  上面那段是從http://phorum.study-area.org/viewtopic.php?t=21073&highlight=multi+path抄來的,
  那個 101,102就是自訂的表格,
  我自己是覺得把路由表格取個有意義的名字比較好記.

  接著,
  要顯示某個表格內的規則,
  用 ip route list table ppp0_gw 或者是用 ip route list table 100都可以

代碼:
> ip route ls table 100   
default via c.c.c.gw dev eth2   -->table 100內的規則

> ip route ls table eth2_gw
default via c.c.c.c.gw dev eth2   -->table eth2_gw內的規則,跟 table 100是相同的

> ip route ls table main   -->顯示table main內的規則
b.b.b.gw dev ppp1 proto kernel scope link src b.b.b.b
a.a.a.gw dev ppp0 proto kernel scope link src .a.a.a.a
d.d.d.0/24 dev eth5 proto kernel scope link src d.d.d.d
c.c.c.0/24 dev eth2 proto kernel scope link src c.c.c.c
10.0.0.0/23 dev eth0 proto kernel scope link src 10.0.1.254
169.254.0.0/16 dev eth5 scope link
default via d.d.d.gw dev eth5

   好了,
   知道一些基礎再去爬其他的文章就輕鬆多了,
   參考資料
   http://www.study-area.org/tips/adv-...ng-HOWTO-3.html
   http://www.study-area.org/tips/adv-...ng-HOWTO-4.html
   http://snafu.freedom.org/linux2..../ip-cref.html

  
  2.1. 設定路由表格
   2.1.1. 修改路由表格檔 /etc/iproute2/rt_tables
代碼:
#
# reserved values
#
255   local
254   main
253   default
102   ppp1_gw   -> 我自定的
101   ppp0_gw   -> 我自定的
100   eth2_gw   -> 我自定的
#0   unspec
#
# local
#
#1   inr.ruhep

   
   2.1.2. 加入路由表格
代碼:
指令 ip rule add from a.a.a.a lookup ppp0_gw
指令 ip rule add from b.b.b.b lookup ppp1_gw
指令 ip rule add from c.c.c.c lookup eth2_gw

   
   指令 ip rule add from a.a.a.a lookup ppp0_gw 的意思大概是
   加入一個條件在路由表格上.來決定要不要使用這個表格.
   把 a.a.a.a. 過來的封包找 table ppp0_qw 裡面的路由規則去處理
   (就像前面所說的... ppp0_qw是我自訂的一個路由表格,它是一個table,裡面存放路由規則)
   然後來看看路由表格的條件變成什麼樣子
代碼:
   指令 ip rule list
0:   from all lookup local
32763:   from c.c.c.c lookup eth2_gw
32764:   from b.b.b.b lookup ppp1_gw
32765:   from a.a.a.a lookup ppp0_gw
32766:   from all lookup main
32767:   from all lookup default


  2.2.把路由規則加入路由表格
代碼:
指令 ip route add table ppp0_gw to default via a.a.a.gw
指令 ip route add table ppp1_gw to default via b.b.b.gw
指令 ip route add table eth2_gw to default via c.c.c.gw
指令 ip route add to default via d.d.d.gw

   這個指令:ip route add table ppp0_gw to default via a.a.a.gw的意思大概是:
   使用指令 ip 把一個路由規則(default via a.a.a.gw)加到(add)路由表格(table ppp0_gw)
   而default via a.a.a.gw應該是以a.a.a.gw當default gateway,
   當然,只有在這個table中有效.
   最後一個指令(ip route add to default via d.d.d.gw)沒有指定要加到哪個表格,
   那它就會被放到main表格裡.

   現在來看看我自訂的路由表格中的內容有什麼變化
代碼:
指令 ip route ls table ppp0_gw
default via a.a.a.gw dev ppp0

指令 ip route ls table ppp1_gw
default via b.b.b.gw dev ppp1

指令 ip route ls table eth2_gw
default via c.c.c.gw dev eth2

   補充一點,
   我的rh8增加這些路由規則後,
   有時過一下子自己會莫名其妙的不見,
   換到fedora core3就沒有這個問題.

   現在,我所有的路由規則就會變成下面這樣(我自己整理過的)
代碼:

0:   from all lookup local
        broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1
        local a.a.a.a dev ppp0 proto kernel scope host src a.a.a.a
        broadcast d.d.d.0 dev eth5 proto kernel scope link src d.d.d.d
        local 10.0.1.254 dev eth0 proto kernel scope host src 10.0.1.254
        broadcast c.c.c.0 dev eth2 proto kernel scope link src c.c.c.c
        broadcast 10.0.0.0 dev eth0 proto kernel scope link src 10.0.1.254
        broadcast 10.0.1.255 dev eth0 proto kernel scope link src 10.0.1.254
        local d.d.d.d dev eth5 proto kernel scope host src d.d.d.d
        broadcast d.d.d.255 dev eth5 proto kernel scope link src d.d.d.d
        local b.b.b.b dev ppp1 proto kernel scope host src b.b.b.b
        broadcast c.c.c.255 dev eth2 proto kernel scope link src c.c.c.c
        local c.c.c.c dev eth2 proto kernel scope host src c.c.c.c
        broadcast 127.0.0.0 dev lo proto kernel scope link src 127.0.0.1
        local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1
        local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1
32763:   from c.c.c.c lookup eth2_gw
        default via c.c.c.gw dev eth2
32764:   from b.b.b.b lookup ppp1_gw
        default via b.b.b.gw dev ppp1
32765:   from a.a.a.a lookup ppp0_gw
        default via a.a.a.gw dev ppp0
32766:   from all lookup main
        b.b.b.gw dev ppp1 proto kernel scope link src b.b.b.b
        a.a.a.gw dev ppp0 proto kernel scope link src .a.a.a.a
        d.d.d.0/24 dev eth5 proto kernel scope link src d.d.d.d
        c.c.c.0/24 dev eth2 proto kernel scope link src c.c.c.c
        10.0.0.0/23 dev eth0 proto kernel scope link src 10.0.1.254
        169.254.0.0/16 dev eth5 scope link
        default via d.d.d.gw dev eth5
32767:   from all lookup default


   很壯觀吧...跟route -n顯示的差很多吧.....
   其實 route -n 所顯示的就是路由表格main的內容.
代碼:

指令 route -n
Kernel IP routing table
Destination   Gateway       Genmask       Flags Metric Ref   Use Iface
b.b.b.gw     0.0.0.0       255.255.255.255 UH   0     0     0 ppp1
a.a.a.gw     0.0.0.0       255.255.255.255 UH   0     0     0 ppp0
d.d.d.0       0.0.0.0       255.255.255.0   U   0     0     0 eth5
c.c.c.0       0.0.0.0       255.255.255.0   U   0     0     0 eth2
10.0.0.0     0.0.0.0       255.255.254.0   U   0     0     0 eth0
169.254.0.0   0.0.0.0       255.255.0.0   U   0     0     0 eth5
0.0.0.0       d.d.d.gw       0.0.0.0       UG   0     0     0 eth5

指令 ip route ls table main
b.b.b.gw dev ppp1 proto kernel scope link src b.b.b.b
a.a.a.gw dev ppp0 proto kernel scope link src .a.a.a.a
d.d.d.0/24 dev eth5 proto kernel scope link src d.d.d.d
c.c.c.0/24 dev eth2 proto kernel scope link src c.c.c.c
10.0.0.0/23 dev eth0 proto kernel scope link src

   我個人覺得用 ip route ls table main 所顯示的我比較容易看得懂,
   只是ip route ls沒有像route -n的輸出看起來那麼整齊.

   可以這樣精細的控制路由應該就是iproute2的神奇之處,
   而且我們還沒到iptables呢

===============================================
第三大步:設定iptables

  說到 iptables 我是不太熟了,
  不過我爬文得到了一些觀念(希望沒弄錯)
  1. 路由(iproute2)和封包處理(iptables)是要一起考慮的.
  2. iproute2和iptables都是一組工具,
    iproute2用來編修路由規則(依照條件看封包往哪裡送)
    iptables用來編修封包處理規則(依照條件看封包要不要改或是讓他繼續跑或是丟棄).
  3. 這些規則會放在類似表格的資料結構裡方便邏輯上的分類,
  4. iproute2和iptables修改好的規則,由核心參照用以決定封包的命運.
  下面兩個圖是從兩份HOW-TO文件中抄下來的,可以幫助理解
  封包過濾
代碼:
Incoming           /   \       Outgoing
    -->[Routing ]--->|FORWARD|------->
      [Decision]   \_____/     ^
          |                 |
          v               ____
        ___             /   \
        /   \             |OUTPUT|
        |INPUT|             \____/
        \___/               ^
          |                 |
          ----> Local Process ----

   http://www.netfilter.org/documentation/HOW...ing-HOWTO.html#toc5

  封包偽裝(NAT)
代碼:
  /   \                       /   \
  PREROUTING -->[Routing ]----------------->POSTROUTING----->
  \D-NAT/   [Decision]             \S-NAT/
              |                   ^
              |                 __|__
              |                 /   \
              |                 | OUTPUT|
              |                 \D-NAT/
              |                   ^
              |                   |
              --------> Local Process ------

  http://www.netfilter.org/document...NAT-HOWTO.html

  而上一大段 iproute2 的那些路由規則應該就是放在 Routing Decision 這裡面,
這樣一串(route + filtering + nat),思考起來起來就很清楚了.  好,接下來設定NAT

  3.1.設定NAT
   3.1.1. 設定讓內部電腦可以上網
   3.1.2. 設定讓外面的連線可以連到內部 FTP 主機(10.0.0.5)
   修改 /etc/sysconfig/iptables 在*nat後面那段

代碼:
*nat
:PREROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A PREROUTING -p tcp -i ppp0 --dport 21 -j DNAT --to-destination 10.0.0.5:21
-A PREROUTING -p tcp -i ppp1 --dport 21 -j DNAT --to-destination 10.0.0.5:21
-A PREROUTING -p tcp -i eth2 --dport 21 -j DNAT --to-destination 10.0.0.5:21
-A PREROUTING -p tcp -i eth5 --dport 21 -j DNAT --to-destination 10.0.0.5:21
-A POSTROUTING -s 10.0.0.219 -j MASQUERADE
-A POSTROUTING -s 10.0.1.3 -j MASQUERADE
-A POSTROUTING -s 10.0.0.5 -j MASQUERADE
-A OUTPUT


  我沒有設定 NAT 出去走的介面,
  因為在我的環境下,
  出去的連線都走 default gateway.

  3.2. 設定防火牆規則
    這部分就請參考其他文件了.

  3.3. 確定核心模組支援 ftp 的 NAT
    執行如下指令:
代碼:
modprobe ip_nat_ftp
modprobe ip_conntrack
modprobe ip_conntrack_ftp

   有一點要注意的是,
   如果剛設定好新的網路組態,
   有時候這些模組也會不見,
   這時候 FTP 軟體就會出現像下面這樣的訊息
代碼:
COMMAND:>   REST 0
    350 Restarting at 0. Send STORE or RETRIEVE to initiate transfer.
COMMAND:>   PASV
    227 Entering Passive Mode (10,0,0,10,154,79)
COMMAND:>   LIST
STATUS:>   Connecting ftp data socket 10.0.0.10:39503... ---> 這是內部ip
ERROR:>     Can't connect to remote server. Socket error = #10061.

   這台主機在防火牆後,但它的firewall沒有把內部ip轉成外部ip,
   這個功能就是上面那些個模組在做的.
   如果要看他們是不是不見了,就用如下指令:
   指令 lsmod | grep 'ip_'
代碼:
ip_nat_ftp         4913 0
ip_conntrack_ftp     72561 1 ip_nat_ftp
iptable_nat         23045 3 ip_nat_ftp,ipt_MASQUERADE
ip_conntrack       40693 4 ip_nat_ftp,ip_conntrack_ftp,ipt_MASQUERADE,iptable_nat
ip_tables         16193 4 ipt_MASQUERADE,iptable_nat,iptable_mangle,iptable_filter


===============================================
第四大步:測試

   4.1. 測試連到外面去的連線
    因為有很多條連線,
    要測試每一個連線就要指定它的介面,
    例如我想從ppp0 ping出去到 168.95.1.1,ping個兩次就好了,
    指令 ping -I ppp0 -c 2 168.95.1.1
代碼:
PING 168.95.1.1 (168.95.1.1) from a.a.a.a ppp0: 56(84) bytes of data.
64 bytes from 168.95.1.1: icmp_seq=0 ttl=251 time=18.4 ms
64 bytes from 168.95.1.1: icmp_seq=1 ttl=251 time=18.4 ms

--- 168.95.1.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 18.422/18.445/18.469/0.137 ms, pipe 2



   4.2.測試外面連進來的連線.
    這不用多說了吧....

===============================================
結語

   上面講的好像很多,
   但其實觀念不難,
   大部分都是從這個討論區或精華區得到的,
   也是我爬文十數個小時才的一點心得....
   希望可以讓需要的人做一個參考.
   謝謝每一位在這邊熱心回答的朋友,
   還有每一位linux程式的作者和文件作者(+譯者)
   由於我的功力並不高深,
   所以如果看了這篇有其他問題,
   請發揮自助的精神自己解決.
   如果有什麼疏漏或錯誤也請在板上糾正,
   有時間我會更正.
   Enjoy!


[ 此文章被SENFO在2005-03-19 08:58重新編輯 ]



獻花 x0 回到頂端 [樓 主] From:台灣亞太線上 | Posted:2005-03-18 16:23 |

首頁  發表文章 發表投票 回覆文章
Powered by PHPWind v1.3.6
Copyright © 2003-04 PHPWind
Processed in 0.070652 second(s),query:15 Gzip disabled
本站由 瀛睿律師事務所 擔任常年法律顧問 | 免責聲明 | 本網站已依台灣網站內容分級規定處理 | 連絡我們 | 訪客留言