环境:Ubuntu 10.10

网卡:一张集成网卡,一张在扩展槽上的独立网卡

主机:Dell vostro 200

用linux主机实现网关有很多好处,比如可以实现更好的NAT功能。一般的路由器(如TP-LINK TL-R478, NETGEAR N300, LINKSYS WRT54GS等,不过强大的路由器除外)只支持简单的虚拟服务器功能,即将外网对网关服务器的请求映射到内网的一台主机上。它的缺点在于外网的请求只能映射到内网一台主机的同名端口上。比如外网的Web请求于202.XX.XX.XXX:80上,路由器可以路由到一台内网的Web服务器上。但是有的情况下,需要内网与外网的端口号不一致,这样路由器就无能为力了。比如内网有多台主机有远程桌面的需求,就不得不将网关的不同的端口映射到内网几个主机的3389端口上。

这种灵活的NAT可以同双网卡的linux主机实现。以下是我的操作步骤,其他的linux系统可能一些配置文件的位置会不同,不过大致的思路是一致的。

STEP 1

为机器装好两块网卡。集成的或是独立的无所谓。编辑/etc/network/interface,如下

auto eth0

iface eth0 inet static

address 192.168.X.XX

netmask 255.255.255.0

auto eth1

iface eth1 inet static

address 202.XX.XX.XXX

gateway 202.XX.XX.XXX

netmask 255.255.255.0

dns-nameservers XX.XX.XX.XX XXX.XX.XX.XX

其中我配置eth0为内网的网关,eth1为外网的接口。注意到内网不用设置gateway。还有外网的设定要由实际情况来设,如DHCP等,实际的DNS服务器等。我这里的情况上静态的IP,还要与MAC绑定,之前MAC没有设好,卡了我很久。

STEP 2

让机器实现简单的转发功能。

首先先让它知道什么包要给哪个网卡发出去,添加两条路由表项:

#route add -net 192.168.X.0 netmask 255.255.255.0 eth0

#route add -net 202.XX.XX.0 netmask 255.255.255.0 eth1

意思是192.等等开头的从eth0发出去,202.等等开头的从eth1发出去。

其次要让从一个网卡进来的包可以forward到另一个网卡上去,键入以下命令:

#echo 1 > /proc/sys/net/ipv4/ip_forward

同时修改/etc/sysctl.conf, 将net.ipv4.ip_forward=1的注释去掉

这几个命令可能写成一个shell script开机运行,当然也可以手工操作。

STEP 3

到上面一步只是实现了路由器的功能,还没有到NAT的实现。linux主机实现NAT是通过iptables命令实现的。这个命令有语法稍显复杂,不过网上有很多讲解的文章。这里只给出个toyexample,是一个shell script,可以设置为登录运行:

#!/bin/bash
# iptables firewall script

#-------------------------------------------------------------------------------#load module
modprobe ip_tables
modprobe iptable_filtermod
probe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftpmod
probe ip_nat_ftp

#-------------------------------------------------------------------------------#flush iptables
iptables -F
iptables -t nat -F
#-------------------------------------------------------------------------------
# firewall
iptables -P INPUT ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT
iptables -A INPUT -s 10.8.0.0/24 -j ACCEPT
iptables -A INPUT -s 219.228.100.0/24 -j ACCEPT
iptables -A INPUT -p 47 -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT


iptables -P OUTPUT ACCEPTiptables -A OUTPUT -o lo -j ACCEPT
iptables -A OUTPUT -p 47 -j ACCEPT
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -j ACCEPT
iptables -A OUTPUT -o eth1 -j ACCEPT

#-------------------------------------------------------------------------------# SNAT
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to 202.120.38.191
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j SNAT --to 202.120.38.191

#-------------------------------------------------------------------------------# DNAT
# for FTPiptables -A INPUT -p tcp -d 202.120.38.191 --dport 21 -j ACCEPT
iptables -t nat -A PREROUTING -p tcp -d 202.120.38.191 --dport 21 -j DNAT --to 192.168.1.145:21
# for Web Server
iptables -A INPUT -p tcp -d 202.120.38.191 --dport 80 -j ACCEPT
iptables -t nat -A PREROUTING -p tcp -d 202.120.38.191 --dport 80 -j DNAT --to 192.168.1.66:80
#for Remote Desktop
iptables -A INPUT -p tcp -d 202.120.38.191 --dport 3128 -j ACCEPT
iptables -t nat -A PREROUTING -p tcp -d 202.120.38.191 --dport 3128 -j DNAT --to 192.168.1.77:3389
#-------------------------------------------------------------------------------
# echo current config
iptables -L
iptables -t nat -L

Trouble Shooting

开始的时候,碰到好多问题。硬件搭好后就是上不了网,以下是我的排错经验:

网关上来回ping,看是否可以ping通内网与处网的IP地址,如果不通,检查物理连接和基本设置,如MAC地址等,DNSserver是否写对

如果可以,则问题出在网间转发上,转到上述STEP2检查是否正确设置

如果上述测验也没问题,就试一下NAN的功能,比如访问一下内网的web 和ftp服务器,试一下每个人的远程桌面(或putty)是否可以正常使用

如果都通过,就大成告成了~

其他:

可以在此基础上,继续实现防火墙,IP过滤等功能。这些网络上也有丰富的资源。这里主要是分享一下自己的经验与弯路,就不展开讲了

2011/6/20 @ Lab

 

当外网IP不够,比如几个人共同用一个端口上网,或者外网的DHCP导致IP老变,共享打印机、文件什么不方便时,你可能想建一个静态IP的内网。

我们不折腾高级的,服务器采用简单的双网卡,一块外网,一块做内网网关。

 

1.基本要求

系统:Ubuntu

服务器(双网卡):

eth0    自动IP    (外网)

eth1    192.168.0.1    (内网)

内网客户机:

eth0    192.168.0.* (内网)

 

2.服务器配置

 

基本思想:开启IP转发,设置好iptables规则。

 

2.1.开启IP转发

两种方式,

临时:echo "1" >/proc/sys/net/ipv4/ip_forward

固定:修改/etc/sysctl.conf,取消这一行的注释: 

net.ipv4.ip_forward= 1

然后使之立即生效

sysctl -p

 

2.2.设置iptables规则

临时:iptables -t nat -A POSTROUTING -j MASQUERADE

固定:

或者把上面这个写到一个启动脚本中(比如/etc/rc.local)。这里还有另外一个版本:

iptables -F

iptables -P INPUT ACCEPT

iptables -P FORWARD ACCEPT

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth1 -j MASQUERADE

据说“第一句是清除掉之前所有的iptables规则,第二第三句是允许接收和发送数据包,第四句是在eth1网口上NAT“,只是比上面的多了几句废话,最后指定网卡参数什么,还没试过。iptables的用法还得好好学。

 

3.客户端设置

将缺省网关设置为192.168.0.1,至于IP,192.168.0.*自己随便设。

 

 

参考:

http://www.gaojinbo.com/linux下使用iptables做路由器nat上网.html

http://www.linuxdiyf.com/viewarticle.php?id=109210