2020年4月15日 下午12:19
注:关于linux中iptable和route这些指令的学习一定要以了解linux系统内核处理过程的设计为前提,否则学习这些命令就是花架子。
- linux中关于网络的命令有很多:iptable route rule iostat 等等,我觉得他们很乱,我作为一个使用者我该如何理解,学习并可以做到按照场景需要来控制自己的网络数据包的走向呢?这其中最大的问题就是iptable和route之间的区别是什么?iptable是否和route是取代的关系,还是在一套流程中是合作的关系?
- linux - iptables vs route - Super User
- route is a command that displays, adds and deletes entries from the kernel’s TCP/IP routing table (aka “Forwarding Information Base”).
- iptables is a command that displays, adds, and deletes entries from Netfilter, the Linux kernel’s packet filtering and manipulating subsystem. It handles NAT.
- 这篇文章对route和iptable下了一个准确的定义,可以看出route操作的对象是table,而iptable对应的是linux中的一个内核模块Netfilter
- 这里首先我们需要了解linux中Netfilter这个内核模块他的逻辑是什么?
- 这里得再次提醒,一定要站在linux系统内核的角度去分析这个问题,iptable这命令只不过是一个用户接口罢了。从这个图中,我们就可以看到需要做到这几个功能:
- Netfilter模块可作为一个网关路由度器,转发其他主机发过来的数据包。
- 可以接收网络中放给自己的数据包,然后通过内核,也即是Netfilter来传递给上层的协议栈,进而传递给对应的进程端口
- 当我们自己发送数据给别人时,也需要通过内核态的Netfilter,然后才可以发送到网络上
- 我们做到上面的基础功能是不够的,在这个数据流动的过程中,我们希望可以对信息进行处理:
- 对数据包处理的能力:
- 过滤功能
- 网络地址转换功能
- 拆解报文,做出修改,并重新封装的功能
- 连接追踪的功能
- 定位数据包发送位置的能力:
- 判断数据包下一站是去哪里
- 对数据包处理的能力:
- 上面的对数据包处理的能力1-4功能其实对应了iptable中的四种表 filter表,nat表,mangle表,raw表,定位数据包发送位置的能力就是由route table来完成。也就是说其实iptable是更加偏向于提供对数据包处理的能力,而route则是提供所谓的定位发送的能力,也就是路由本身的意思。这里我们就区分开了iptable和route,他们是在一个大的数据处理流程中有不同的任务,他们之间是合作的关系,共同保证数据的正确传输,也就是Netfilter内核的正确运作。
- 这里有个Netfilter简要的处理流程:转发其他主机发过来的数据包
- Netfilter 处理网络包的先后顺序:接收网络包,先 DNAT,然后查路由策略,查路由策略指定的路由表做路由,然后 SNAT,再发出网络包。
- iptables - SNAT和DNAT的区别 - SegmentFault 思否
- SNAT: Source Network Address Translation,是修改网络包源ip地址的。
- 修改源ip地址的目的一般都是为了让这个包能再回到自己这里,所以在iptables中,SNAT是在出口,也即POSTROUTING链发挥作用。
- DNAT: Destination Network Address Translation,是修改网络包目的ip地址的。
- 修改目的ip地址的原因一般就是为了改变包发送的目的地,让包走出去,而不是留下来,所以在iptables中,DNAT是在入口,也即PREROUTING链中发挥作用,以便让包进入FORWARD表
- Netfilter 处理网络包的先后顺序:接收网络包,先 DNAT,然后查路由策略,查路由策略指定的路由表做路由,然后 SNAT,再发出网络包。
- 最后,一个实际的例子来应用route,iptable完成:公司内网要求192.168.0.100 以内的使用 10.0.0.1 网关上网 (电信),其他IP使用 20.0.0.1 (网通)上网。
- 参考:
- 第一步:route
- 首先要在网关服务器上添加一个默认路由,当然这个指向是绝大多数的IP的出口网关:ip route add default gw 20.0.0.1
- 之后通过 ip route 添加一个路由表:ip route add table 3 via 10.0.0.1 dev ethX (ethx 是 10.0.0.1 所在的网卡, 3 是路由表的编号)
- 第二步:rule
- 之后添加 ip rule 规则:ip rule add fwmark 3 table 3 (fwmark 3 是标记,table 3 是路由表3 上边。 意思就是凡事标记了 3 的数据使用 table3 路由表)
- 第三部:iptables
- 之后使用 iptables 给相应的数据打上标记:iptables -A PREROUTING -t mangle -i eth0 -s 192.168.0.1 - 192.168.0.100 -j MARK —set-mark 3
- 总结:
- 因为 mangle 的处理是优先于 nat 和 fiter 表的,所以在数据包到达之后先打上标记,之后再通过 ip rule 规则,对应的数据包使用相应的路由表进行路由,最后读取路由表信息,将数据包送出网关。