最近在研究Linux tcp/ip协议栈和netfilter/iptables的知识,正好今天在公司帮助同事搭建一下测试环境,也用了用自己的所学,当然用google也可以完成同样的工作,但我更希望能理解其中的原理。
需求是这样的:公司需要用广电的网络信号测试,但是广电的服务器端做了限制,只允许一根线接一个终端,所以问题就来了,几个同事如何同时工作呢?
现有设备:一台广电网络信号专用Modem,虽然输出口有4个,但接两个终端上去,只有一个可以工作,而且用一般的路由器无法工作,原因是DHCP是定制过的,一般的DHCP程序无法从服务器获取到IP地址。
解决方案:因为我们的盒子都跑Linux,而且盒子上有定制过的DHCP程序可以运行,有了Linux那就简单多了,用一台两个eth网口的盒子做网关,eth0用于连接modem,eht1用于连接交换机,终端设置静态IP方式,这样可以分更多的口出来连接终端,大家都可以一起用了,对于服务器端来说只会看到一个终端存在。大概框图如:
网络信号------->[modem] --------eth0-> [2*eth box0] -eth1-------->[switch]===>box1,box2....boxN
下面的工作就是将box0配置成一个路由器,并且在eth0上运行udhcpc(定制过的),再将eth1配置成静态ip,并设置相关路由.
我这里在box0启动后最后执行的脚本中加入如下语句:
ifconfig eth0 up
udhcpc -i eth0 -t 50 &
sleep 1
route add -net 0.0.0.0 netmask 0.0.0.0 dev eth0
ifconfig eth1 10.3.1.1 netmask 255.255.255.0
echo "1">/proc/sys/net/ipv4/ip_forward
iptables -F
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
看上去确实很简单,其中的原理是
udhcpc //用于从广电的服务器上请求ip为eth0.
route add -net 0.0.0.0 netmask 0.0.0.0 dev eth0 //用于默认路由.
ifconfig eth1 10.3.1.1 netmask 255.255.255.0 //为eth1设置静态ip,可以用一根网线将电脑和盒子的eth1直连,然后给电脑设置静态ip 10.3.1.x/24,就可以在电脑上telnet到盒子上了.
echo "1">/proc/sys/net/ipv4/ip_forward // 打开网络协议栈的转发功能,因为从eth1进来的数据要从eth0出去,从eth0进来的数据又要走到eth1去.
iptables -F // 清除其它设置
iptables -P INPUT ACCEPT // 所以进来的数据全部通过
iptables -P FORWARD ACCEPT //转发的数据全部通过
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE // 对从eth0上出去的数据做snat,这一句很关键,这让这台盒子成了网关.
配置结束了,拿另一台盒子box1直接接到eth1,设置静态ip 10.3.1.2/24,默认dns开始工作了。
学到的知识可以解决实际问题,真是开心:)
阅读(2450) | 评论(0) | 转发(0) |