★ 解决方法
1 共享上网
1) 按照下图连接电脑。
                       isp
                        |
           gw(用来做网关的电脑,双网卡)
                        |
                   hub(or switch)
                        |
           ---------------------------
           |      | ........ |       |
           pc1   pc2 ......  pcx    pcy
gw一个网卡接isp,ip设置为isp告诉你的。另外一个网卡接hub,ip设置为一个内网ip,例如192.168.0.1。
2) 在gw上面执行如下脚本。
#------------script start--------
#!/bin/sh
IPT="/sbin/iptables"
# Internet Interface
INET_IFACE="ethx"
INET_ADDRESS="x.x.x.x"
# Local Interface Information
LOCAL_IFACE="ethy"
LOCAL_IP="192.168.0.1"
LOCAL_NET="192.168.0.0/24"
LOCAL_BCAST="192.168.0.255"
#修改从外网网卡出去的包的源地址,好让外网返回的包能正确回来。
$IPT -t nat -A POSTROUTING -o $INET_IFACE -j SNAT --to-source $INET_ADDRESS
#打开系统的转发功能
echo "1" > /proc/sys/net/ipv4/ip_forward
#----------script end----------
这样内网的电脑做如下设置后就应该可以上网了。
ip:  192.168.0.x
网关: 192.168.0.1
dns:  和gw的设置一样
这时的服务器已经具备一个网关的功能,不过内网的电脑想要上网,都必须手动设置ip,想做到自动获取,可以
2 端口映射
端口映射需要做的其实就是修改对方发过来包的目的地址和端口,然后帮忙转发一下,并且转发的同时修改一下源地址,好让被转发的电脑认为是gw发的包,处理完毕之后好能正常返回gw,然后由gw在负责转发给外网的ip。端口转发需要用到iptables的nat表,上面这些操作是在PREROUTING和POSTROUTING链之间完成的。
1) 映射到外网ip
整个过程可以参考下图。
                                       eth0(外网网卡)    
                               ________________________
                               |                          |
     gw的80端口        修改目标地址(DNAT)       修改源地址(SNAT)
外网ip---------->PREROUTING------------>POSTROUTING------------>外网ip
所以,例如我们要将对gw 80端口的访问都转发到外网的202.202.202.202这台电脑上面,只需要在上面的脚本中添加下面的语句即可。
# 修改从外网进来的对80端口访问的数据包的目的地址
$IPT -t nat -A PREROUTING -p tcp -i $INET_IFACE --destination-port 80 \
    -j DNAT --to-destination 202.202.202.202
那么,你可能要问,按照上面的说法,这样只修改了目的地址,还要修改源地址啊,这样包才能正确返回到gw。问的好,不过其实我们已经做了这个设置了,聪明的你可能已经想到了,就是上面让内网ip可以上网的那个脚本里的一句语句已经实现了这个功能。
#修改从外网网卡出去的包的源地址,好让外网返回的包能正确回来。
$IPT -t nat -A POSTROUTING -o $INET_IFACE -j SNAT --to-source $INET_ADDRESS
就是上面这句,他把所有从外网网卡出去的包的源地址都修改了,当然也包括去往202.202.202.202的80端口的包。
2) 映射到内网ip
整个过程可以参考下图。
                                       eth0(外网网卡)                                eth0(内网网卡)
                               ________________________                        _______________________
                               |                          |                        |                      |
     gw的80端口        修改目标地址(DNAT)       修改源地址(SNAT)                              修改源地址(SNAT)
外网ip---------->PREROUTING------------>POSTROUTING------------>PREROUTING----------->POSTROUTING----------->内网ip
所以,例如我们要映射80端口到内网的192.168.1.80这台电脑上面,只需要在上面的脚本中添加下面的语句即可。
# 修改从外网进来的对80端口访问的数据包的目的地址
$IPT -t nat -A PREROUTING -p tcp -i $INET_IFACE --destination-port 80 \
    -j DNAT --to-destination 192.168.1.80
   
# 修改从内网网卡出去的所有数据包源地址
$IPT -t nat -A POSTROUTING -o $LOCAL_IFACE \
    -j SNAT --to-source $LOCAL_IP
这个比上面多了一句,意思相信你已经明白了吧。因为访问内网ip的时候走了内网网卡,所以还需要对从内网网卡出去的包修改一下源地址。