使用iptables设定使用NAT分享网络频宽
发表于:2007-07-04来源:作者:点击数:
标签:
作者: kenduest (小州) Linux 上使用 IP-Masquerade 所谓的 IP 儰装以便于达成该功能。 Linux 上的 IPMASQ 因为 kernel 一些核心功能有调整过,所以相关的设定工具 因为不同的核心版本所以不同. kernel 2.0.x 时代,是使用 ipfwadm 程序。(这个说法不算是完
作者: kenduest (小州)
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...ring-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
是不是为 A
CCEPT ,而不是 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. 该篇文章省略设定
网络卡的步骤...
大概就是这样子了,有问题请告知,也欢迎大家讨论。
原文转自:http://www.ltesting.net