A-A+

CentOS 6.5 城域网+ADSL策略路由+透明代理

2015年12月12日 站长资讯 CentOS 6.5 城域网+ADSL策略路由+透明代理已关闭评论

现公司目前给用户上网有两条线路一条高新网的10M光纤(Linux,iptables+squid),一条8M的电信ADSL(Cisco 2811),其中10M的光纤给公司内部用户使用,ADSL给无线用户使用。有个比较严重的问题是是光纤链路经常会有人下载导致拥塞很严重,为了解决这个问题,最近本人决定改变现有环境。

想法如下:

用一台三个网卡的IBM X346服务器做策略路由+透明代理来解决,用光纤只走WEB端口80,443的流量,剩余的其他流量走ADSL,这样就可以解决用户使用下载工具时而不至于上网访问网页慢的现象。废话少说入正题
Eth0接ADSL eth1接内网交换机:192.168.0.1 eth2接光纤:218.17.X.X

1,增加两个路由表100 gx和200 dx

  1. cat /etc/iproute2/rt_tables  
  2. # reserved values  
  3. 255  local  
  4. 254  main  
  5. 253  default  
  6.   
  7. 0       unspec  
  8. 100  gx   
  9. 200  dx  

2,用iptables的MARK来为流量打标记,80,443标记为100,剩余的流量标记为200

iptables -t mangle -A PREROUTING -i eth1 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 100

iptables -t mangle -A PREROUTING -i eth1 -j MARK --set-mark 200

3,把不同的流量放入相应的路由表

ip route add default via 218.17.X.1 dev eth2 src 218.17.X.X(eth1的IP地址) table gx

ip ro add default dev ppp0 table dx

我们还得把默认路由设置为光纤出去否则代理会出问题的

ip route replace default via 218.17.X.129 dev eth2

4,设置路由规则

ip rule add fwmark 100 table gx

ip rule add from 218.17.X.X table gx ###把基于218.17.X.X的流量也扔到gx

ip rule add fwmark 200 table dx

因为ADSL为动态IP地址所以本网卡的流量我也就没写,不过根据观察也没出现问题

来检验下路由表

[root@gw ~]# ip route ls table dx

default dev ppp0 scope link

[root@gw ~]# ip route ls table gx

default via 218.17.X.129 dev eth2 src 218.17.X.X

再来看下路由规则

[root@gw ~]# ip rule ls

0: from all lookup local

997:from all fwmark 0xc8 lookup dx

998:from all fwmark 0x64 lookup gx

999:from 218.17.X.242 lookup gx

32766: from all lookup main

32767: from all lookup default

5,用IPTABLES做NAT转换

iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -o ppp0 -j MASQUERADE

iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -o eth2 -j SNAT --to 218.17.X.X

把80端口重定向到3128做透明代理

iptables -t nat -A PREROUTING -i eth1 -s 192.168.0.0/16 -p tcp --dport 80 -j REDIRECT --to 3128

6,为内网用户转发

iptables -A FORWARD -s 192.168.0.0/16 -j ACCEPT

iptables -A FORWARD -d 192.168.0.0/16 -j ACCEPT

还有一个重要的问题,把Linux的路由转发打开

编辑/etc/sysctl.conf

把net.ipv4.ip_forward = 0改为net.ipv4.ip_forward = 1

[root@gw ~]# sysctl –p

使其立即生效,这样应该就可以了将流量进行分流了。

但是接下还有个问题,每次ADSL重新拨号的时候,会将默认路由强制改写为

default dev ppp0 scope link

并且会把dx路由表的路由中抹去。

怎么办呢???

咱们手动编辑一个文件,加入下面两条命令,使ADSL拨号的时候执行它就不会有问题了。

[root@gw ~]# vim /etc/ppp/ip-up.local

ip ro add default dev ppp0 table dx

ip route replace default via 218.17.X.129 dev eth2

到此问题基本上解决了。

Iptables具体的一些规则和squid的配置文件我就省略了。

附加:

不过我这还做了openvpn,做了策略路由之后openvpn只能ping通Linux本机,到内网的全部都不通了怎么办?找资料具体原因大家自己分析。

解决办法如下:

编辑vim /etc/iproute2/rt_tables加入一个路由表

300 vpn

iptables -t nat -A POSTROUTING -s 192.168.99.0/24(OPENVPN拨入的网段) -o eth1 -j SNAT --to 192.168.0.1

ip route add to 192.168.99.0/24 via 192.168.99.1 dev tun0 table vpn

ip rule add from 192.168.0.0/16 table vpn

这样openvpn拨入的客户端就可以和内网通讯了。

基本上大功告成了 不过服务器重启之后会清掉路由表和路由规则,建议大家写入到一个脚本,让其在开机的时候自动执行,免得每次都要写一遍。

标签:

评论已关闭!