Linux 双线策略路由的三种实现方式总结+端口映射
Linux 双线策略路由的三种实现方式总结+端口映射 Linux 双线策略路由的三种实现方式总结+端口映射
网络环境
服务器(网关):
eth0 为LAN口,IP为 LAN_IP = 192.168.0.1
eth1 为第一个WAN口,接电信线路,IP为 CTC_IP,网关为 CTC_GW
eth2 为第二个WAN口,接网通线路,IP为 CNC_IP,网关为 CNC_GW
内网网站
HTTP_SERVER = 192.168.0.100 内核打补丁
如果你希望外网用户,不管通过哪个IP都可以访问到服务器或映射后的内网服务器,那么你就需要为内核打上补丁,
补丁在 http://www.ssi.bg/~ja/#routes 可以下载到,在 Static, Alternative Routes, Dead Gateway Detection, NAT 找和内核对应的 patch
下载后为内核打上,然后在
Networking ---> Networking options ---> IP: advanced router
把 IP: equal cost multipath with caching support (EXPERIMENTAL) 前面的勾去掉
如果你不想打补丁,或不想动内核,有个简单的办法来实现,即写一个脚本,每隔2秒钟刷新一次route cache
while : ; do
ip route flush cache
sleep
done 双线策略的实现
. 静态路由方式(这种方式是最简单的)
) 设置默认路由,比如电信
ip route replace default via 电信网关 dev eth1
) 设置策略路由,对另外一条线路
ip route add 网通路由表1 via 网通网关 dev eth2 metric
ip route add 网通路由表2 via 网通网关 dev eth2 metric
....
) 添加原路返回路由
策略路由规则设置完后,还要为每条线路加入相应的 “原路返回路由”(从哪条线进来的数据,最终还是从这条线出去),不然就会出现这样的问题:
电信用户通过网通的IP访问不到服务器,网通用户也不能通过电信IP访问到服务器
ip route flush table
ip route add default via 电信网关 dev eth1 src 电信IP table prio
ip rule add from 电信IP table
ip route flush table
ip route add default via 网通网关 dev eth2 src 网通IP table prio
ip rule add from 网通IP table
出来加入本身的原路返回路由之外,还应加入局域网接口的,不然通过端口映射后,内网无法通过外网IP访问到映射后的服务器
ip route add 192.168.0.0/ dev eth0 scope link src 192.168.0.1 table
ip route add 192.168.0.0/ dev eth0 scope link src 192.168.0.1 table . 策略路由方式
为了方便,我们增加2个策略路由表,电信 => ,网通 => ,这样再添加规则时,就可以直接用自定义的名称来替代数字
echo "100 ctc" >> /etc/iproute2/rt_tables
echo "200 cnc" >> /etc/iproute2/rt_tables
)设置默认路由(电信)
ip route replace default via 电信网关 dev eth1
)对网通进行基于目的地址的策略路由
ip rule add to 网通路由表1 table cnc prio
ip rule add to 网通路由表2 table cnc prio
....
)添加原路返回路由
ip route flush table ctc
ip route add default via 电信网关 dev eth1 src 电信IP table ctc
ip route add 192.168.0.0/ dev eth0 scope link src 192.168.0.1 table ctc
ip rule add from 电信IP table ctc
ip route flush table cnc
ip route add default via 网通网关 dev eth2 src 网通IP table cnc
ip route add 192.168.0.0/ dev eth0 scope link src 192.168.0.1 table ctc
ip rule add from 网通IP table cnc
. iptables打标记+iproute2 fwmark
)使用 CONNMARK 对连接进行标记
外网进来数据
iptables -t mangle -A PREROUTING -i eth1 -m conntrack --ctstate NEW -j CONNMARK --set-mark 0x100
iptables -t mangle -A PREROUTING -i eth2 -m conntrack --ctstate NEW -j CONNMARK --set-mark 0x200
转发出去的数据
iptables -t mangle -A POSTROUTING -o eth1 -m conntrack --ctstate NEW -j CONNMARK --set-mark 0x100
iptables -t mangle -A POSTROUTING -o eth2 -m conntrack --ctstate NEW -j CONNMARK --set-mark 0x200
局域网进来数据
iptables -t mangle -A PREROUTING -i eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j CONNMARK --restore-mark
本地出去数据
iptables -t mangle -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j CONNMARK --restore-mark
)在 IPROUTE2 中做基于 fwmark 的策略路由
ip rule add fwmark 0x100 table ctc prio
ip rule add fwmark 0x200 table cnc prio
)添加原路返回路由
ip route add table ctc to $CTC_NET dev eth1 scope link
ip route add table ctc to $CNC_NET dev eth2 scope link
ip route add table ctc to 192.168.0.0/ dev eth0 scope link
ip route add default via 电信网关 dev eth1 table ctc
ip route add table cnc to $CTC_NET dev eth1 scope link
ip route add table cnc to $CNC_NET dev eth2 scope link
ip route add table cnc to 192.168.0.0/ dev eth0 scope link
ip route add default via 网通网关 dev eth2 table cnc Iptables/NAT 规则
/sbin/iptables -t nat -A POSTROUTING -o eth1 -s 局域网网段 -j SNAT --to-source 电信外网IP
/sbin/iptables -t nat -A POSTROUTING -o eth2 -s 局域网网段 -j SNAT --to-source 网通外网IP
如果外网IP是动态的,可以用 MASQUERADE
/sbin/iptables -t nat -A POSTROUTING -o eth1 -s 局域网网段 -j MASQUERADE
/sbin/iptables -t nat -A POSTROUTING -o eth2 -s 局域网网段 -j MASQUERADE 端口映射
端口映射可以分别针对两条线做端口映射
比如 LAN口的IP为 192.168.0.1,内网服务器IP为 192.168.0.100,映射端口为
iptables -t nat -A PREROUTING -p tcp --dport -d 电信IP -j DNAT --to-destination 192.168.0.100
iptables -t nat -A PREROUTING -p tcp --dport -d 网通IP -j DNAT --to-destination 192.168.0.100
端口回流(内网可以通过外网IP访问映射后的服务器)
iptables -t nat -A POSTROUTING -p tcp -s 192.168.0.0/ --dport -d 192.168.0.100 -j SNAT --to-source 192.168.0.1
Linux 双线策略路由的三种实现方式总结+端口映射的更多相关文章
- Linux下SVN的三种备份方式
原文链接:http://blog.csdn.net/windone0109/article/details/4040772 (本文例子基于FreeBSD/Linux实现,windows环境请自己做出相 ...
- Linux C申请内存三种基本方式
一份代码可以知道具体方式和原理: int main() { int stack_a; int stack_b; static int static_c; static int static_d; in ...
- 【OS_Linux】Linux中虚拟机的三种上网方式——桥接、NAT、Host-only
1.桥接 桥接方便做实验,配置ip方便.可以和局域网中的其他机器进行通信,也可以和公网进行通信.缺点是会占用主机所在局域网的一个ip. 2. NAT NAT模式下虚拟机可以和主机进行通信,可以上网,而 ...
- linux学习之centos(二):虚拟网络三种连接方式和SecureCRT的使用
---操作环境--- 虚拟机版本:VMware Workstation_10.0.3 Linux系统版本:CentOS_6.5(64位) 物理机系统版本:win10 一.虚拟网络三种连接方式 当在V ...
- Linux基石【第二篇】虚拟网络三种连接方式(转载)
在虚拟机上安装完Centos系统后,开始配置静态IP,以方便在本宿主机上可以访问虚拟机,在曲折的配置中,了解到虚拟机还有三种连接方式:Bridged,NAT和Host-only,于是,我又一轮新的各种 ...
- Linux 软件安装的三种方式
Linux 软件安装的三种方式 1.yum 语法格式: yum -y install package.name -y yes # 遇到提示自动输入yes 案例: 安装ifconfig命 ...
- python对mysql数据库操作的三种不同方式
首先要说一下,在这个暑期如果没有什么特殊情况,我打算用python尝试写一个考试系统,希望能在下学期的python课程实际使用,并且尽量在此之前把用到的相关技术都以分篇博客的方式分享出来,有想要交流的 ...
- grub安装的 三种安装方式
1. 引言 grub是什么?最常态的理解,grub是一个bootloader或者是一个bootmanager,通过grub可以引导种类丰富的系统,如linux.freebsd.windows等.但一旦 ...
- .NET Core应用的三种部署方式
.NET Core应用提供了三种部署方式: FDD FDD:Framework-dependent deployment,框架依赖部署.这种方式针对某个特定版本的.NET Core进行发布,只打包应用 ...
随机推荐
- [terry笔记]ora-00904 invalid identifier—同义词
今天遇到一个问题,说起来也简单,但是困扰我半天. 升级数据库后,一个功能无法运行,在后台观察到其sql,发现sql中包含一个包执行不了,报错ora-00904 invalid identifier w ...
- R 中安装xlsx包缺少java环境解决方案
1.安装Java程序(官网win7 64位系统的Java安装程序及网址http://www.java.com/zh_CN/download/manual.jsp),选择windows 64位脱机安装到 ...
- OpenStack: 安装准备
>安装准备1. 安装MySQL# apt-get install python-mysqldb mysql-server将/etc/mysql/my.cnf修改bind-address为&quo ...
- .Net开源数据库设计工具Mr.E For Linq (EF 6.1) 教程(三)更新已发布的数据库
项目发布到服务器后,如果在后期,数据库的结构发生变更,如何更新到服务器呢? 首先,右键点击数据库,导出结构脚本文件 把脚本文件和 Mr.E.rar拷贝到服务器,在服务器解压Mr.E,运行其中的“更新数 ...
- 学习IOS需要知道的事
什么是iOS iOS是一款由苹果公司开发的操作系统(OS是Operating System的简称),就像平时在电脑上用的Windows XP.Windows 7,都是操作系统 那什么是操作系统呢?操作 ...
- verilog中级别到底是什么?级别的分类是什么???
1.级别到底是什么? 答:所谓的系统级,算法级,RTL级,门级,开关级,就是在不同的层次上来描述某个电路模块.当然行为级和结构级就是在行为上和结构上来描述电路模块. 模块可以用不同级别语言来描述,当然 ...
- transform属性
transform属性 在OC中,通过transform属性可以修改对象的平移.缩放比例和旋转角度常用的创建transform结构体方法分两大类 (1) 创建“基于控件初始位置”的形变 CGAffin ...
- Machine Learning 学习笔记 (4) —— 广义线性模型
本系列文章允许转载,转载请保留全文! [请先阅读][说明&总目录]http://www.cnblogs.com/tbcaaa8/p/4415055.html 1. 指数分布族简介 之前的文章分 ...
- 20145120 《Java程序设计》第10周学习总结
20145120 <Java程序设计>第10周学习总结 教材学习内容总结 转自:http://www.cnblogs.com/springcsc/archive/2009/12/03/16 ...
- Eigen库实现简单的旋转、平移操作
本来课程要求用GUI界面来实现Eigen的旋转.平移操作的,但是接触GUI编程时间太短,虽然要求很简单,但是做了几天还是没有完成.就把命令行下面的简单的贴一下吧. main.cpp #include ...