广告广告
  加入我的最爱 设为首页 风格修改
首页 首尾
 手机版   订阅   地图  繁体 
您是第 3926 个阅读者
 
发表文章 发表投票 回覆文章
  可列印版   加为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.028369 second(s),query:15 Gzip disabled
本站由 瀛睿律师事务所 担任常年法律顾问 | 免责声明 | 本网站已依台湾网站内容分级规定处理 | 连络我们 | 访客留言