vlambda博客
学习文章列表

看完这篇!Linux网络基础知识通关!

iptables

先看一张图: 

看完这篇!Linux网络基础知识通关! 对外交互包括两个通道:

1. 由iptables客户端调用命令来配置管理防火墙,最后相关请求发送到内核模块;内核模块用于组织iptables使用的表、链和规则。2. iptables依赖netfilter来注册各种hooks实现对数据包的具体转发逻辑控制 

netfilter的hook点总结

看完这篇!Linux网络基础知识通关!数据包从左边进入IP协议栈,进行IP校验以后,数据包被第一个钩子函数PREROUTING处理,然后就进入路由模块,由其决定该数据包是转发出去还是送给本机。若该数据包是送给本机的,则要经过钩子函数LOCALIN处理后传递给本机的上层协议;若该数据包应该被转发,则它将被钩子函数FORWARD处理,然后还要经钩子函数POSTROUTING处理后才能传输到网络。本机进程产生的数据包要先经过钩子函数LOCALOUT处理后,再进行路由选择处理,然后经过钩子函数POST_ROUTING处理后再发送到网络。 

原理:
iptables根据功能定义了4个表,raw,mangle,filter,nat。这个四个表中有各自包含不同的链,如PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING,这些链与Netfilter的HOOK点相对应,链中包含具体的规则从而控制数据包了. 

看完这篇!Linux网络基础知识通关!关于不同表的说明如下:

看完这篇!Linux网络基础知识通关!

每个注册的Hook函数一次调用各表链的规则来处理网络包:

看完这篇!Linux网络基础知识通关!

iptables命令格式:

举例:

看完这篇!Linux网络基础知识通关!

增加一条rule: 

iptables -A INPUT -p icmp -s 10.24.67.97 -j DROP//drop掉源为10.24.67.97的icmp报文

查看报文匹配:

watch -n 1 -d 'iptables -t filter -L INPUT -nv'

删除一条rule:

iptables -D INPUT -p icmp -s 10.24.67.97 -j DROP

NAT

可使用iptables nat表来实现NAT功能,包括SNAT和DNAT。
(1)SNAT:路由-->转换-->发出,转换步骤在POSTROUTING链上实现。
举例: 

iptables -t nat -A POSTROUTING -s 192.168.252.0/24 -j SNAT -to-source 10.24.67.91

(2)DNAT:转换-->路由-->发出 或者 本机报文-->转换-->发出(这种很少用到),转换步骤在PREROUTING和OUTPUT链上实现。
举例:

iptables -t nat -A PREROUTING -d 10.24.67.91 -p tcp --dport 80 -j DNAT --to-destination 192.168.252.1

看完这篇!Linux网络基础知识通关!

ROUTE

route命令可以用来操作和显示IP路由表。
命令格式如下: 

route [-CFvnee]

route [-v] [-A family] add [-net|-host] target [netmask Nm] [gw Gw] [metric N] [mss M] [window W] [irtt I] [reject] [mod] [dyn] [rein-state] [[dev] If]

route [-v] [-A family] del [-net|-host] target [gw Gw] [netmask Nm] [metric N] [[dev] If]

例子:

● route add -net 224.0.0.0 netmask 240.0.0.0 dev eth0 #增加一条经过 eth0 到达 244.0.0.0 的路由
● route add -net 224.0.0.0 netmask 240.0.0.0 reject #增加一条屏蔽的路由,目的地址为224.x.x.x将被拒绝。
● route del -net 224.0.0.0 netmask 240.0.0.0
● route del -net 224.0.0.0 netmask 240.0.0.0 reject
● route del default gw 192.168.120.240
● route add default gw 192.168.120.240

network namespace

在三层网络上,Linux network namespace(netns)通过虚拟化网络协议栈,将一个物理三层网络分割成几个独立的虚拟三层网络。
Network namespace (netns)从 Linux 2.6.24 版本开始添加,直到 2.6.29 添加完成。每个 netns 拥有独立的 (virtual)network devices, IP addresses, IP routing tables, socket listing, connection tracking table, firewall, /proc/net directory, ports 等等。新创建的 netns 默认只包含 loopback device。除了这个设备,每个 network device,不管是物理的还是虚拟的网卡还是网桥等,都只能存在于一个 netns。而且,连接物理硬件的物理设备只能存在于 root netns。其它普通的网络设备可以被创建和添加到某个 netns。
举例: 

#添加 network namespace
ip netnas add <network namespace name>
#Example:
ip netns add nstest

#列表所有 netns
ip netns list

#删除某 netns
ip netns delete <network namespace name>

#在 network namespace 中运行命令
ip netns exec <network namespace name> <command>
#Example using the namespace from above:
ip netns exec nstest ip addr

#添加 virtual interfaces 到 network namespace
ip link add veth-a type veth peer name veth-b #创建一对虚拟网卡veth-a 和 veth-b,两者由一根虚拟网线连接
#将 veth-b 添加到 network namespace
ip link set veth-b netns nstest

#设置 VI 的 IP 地址
#defaut namespace 中
ip addr add 10.0.0.1/24 dev veth-a
ip link set dev veth-a up

# namespace nstest 中
ip netns exec nstest ip addr add 10.0.0.2/24 dev veth-b
ip netns exec nstest ip link set dev veth-b up
#互通
# ping 10.1.1.1
PING 10.1.1.1 (10.1.1.1) 56(84) bytes of data.
64 bytes from 10.1.1.1: icmp_seq=1 ttl=64 time=0.087 ms

# ip netns exec netns1 ping 10.1.1.2
PING 10.1.1.2 (10.1.1.2) 56(84) bytes of data.
64 bytes from 10.1.1.2: icmp_seq=1 ttl=64 time=0.054 ms
#查看路由表和 iptbales
# ip netns exec netns1 route
# ip netns exec netns1 iptables -L

免费ARP

免费ARP可被用于以下场景: 

路由策略

Usage: ip rule [ list | add | del ] SELECTOR ACTION (add 添加;del 删除;llist 列表)
SELECTOR := [ from PREFIX 数据包源地址] [ to PREFIX 数据包目的地址] [ tos TOS 服务类型][ dev STRING 物理接口] [ pref NUMBER ] [fwmark MARK iptables 标签]
ACTION := [ table TABLE_ID 指定所使用的路由表] [ nat ADDRESS 网络地址转换][ prohibit 丢弃该表| reject 拒绝该包| unreachable 丢弃该包]
[ flowid CLASSID ]
TABLE_ID := [ local | main | default | new | NUMBER ]

举例:
ip rule add from 192.203.80/24 table inr.ruhep prio 220 通过路由表 inr.ruhep 路由来自源地址为192.203.80/24的数据包
ip rule add from 193.233.7.83 nat 192.203.80.144 table 1 prio 320 把源地址为193.233.7.83的数据报的源地址转换为192.203.80.144,并通过表1进行路由

不要混淆路由表和策略:规则指向路由表,多个规则可以引用一个路由表,而且某些路由表可以没有策略指向它。如果系统管理员删除了指向某个路由表的所有规则,这个表就没有用了,但是仍然存在,直到里面的所有路由都被删除,它才会消失 

路由表

  • ip route list table table_number

  • ip route list table table_name

路由表序号和表名的对应关系在 /etc/iproute2/rt_tables 文件中,可手动编辑。
以下表为例:

Destination    Netmask    Gateway          Interface    Metric
0.0.0.0 0.0.0.0 192.168.123.254 192.168.123.88 1 #缺省路由,目的地址不在本路由表中的数据包,经过本机的 192.168.123.88 接口发到下一个路由器 192.168.123.254
127.0.0.0 255.0.0.0 127.0.0.1 127.0.0.1 1 #发给本机的网络包
192.168.123.0 255.255.255.0 192.168.123.68 192.168.123.68 1 #直连路由。目的地址为 192.168.123.0/24 的包发到本机 192.168.123.88 接口
192.168.123.88 255.255.255.255 127.0.0.1 127.0.0.1 1 #目的地址为 192.168.123.88的包是发给本机的包
192.168.123.255 255.255.255.255 192.168.123.88 192.168.123.88 1 #广播包的网段是 192.168.123.0/24,经过 192.168.123.88 接口发出去
224.0.0.0 224.0.0.0 192.168.123.88 192.168.123.88 1 #多播包,经过 192.168.123.88 接口发出去
255.255.255.255 255.255.255.255 192.168.123.68 192.168.123.68 1 #全网广播包
Default Gateway: 192.168.123.254

设置和查看路由表都可以用route命令,该命令格式如下:

route [add|del] [-net|-host] target [netmask Nm] [gw Gw] [[dev] If]
- add : 添加一条路由规则,del : 删除一条路由规则,-net : 目的地址是一个网络,-host : 目的地址是一个主机,target : 目的网络或主机
- netmask : 目的地址的网络掩码,gw : 路由数据包通过的网关,dev : 为路由指定的网络接口

还可以根据路由的生成方法划分如下:- 静态路由
由用户或网络管理员手工配置的路由信息。当网络的拓扑结构或链路的状态发生变化时,网络管理员需要手工去修改路由表中相关的静态路由信息。静态路由信息在缺省情况下是私有的,不会传递给其他的路由器。当然,网管员也可以通过对路由器进行设置使之成为共享的。静态路由一般适用于比较简单的网络环境,在这样的环境中,网络管理员易于清楚地了解网络的拓扑结构,便于设置正确的路由信息。- 动态路由
动态路由是指路由器能够自动地建立自己的路由表,并且能够根据实际情况的变化适时地进行调整。它是与静态路由相对的一个概念,指路由器能够根据路由器之间的交换的特定路由信息自动地建立自己的路由表,并且能够根据链路和节点的变化适时地进行自动调整。当网络中节点或节点间的链路发生故障,或存在其它可用路由时,动态路由可以自行选择最佳的可用路由并继续转发报文。
常见的动态路由协议有以下几个:路由信息协议(RIP)、OSPF(Open Shortest Path First开放式最短路径优先)、IS-IS(Intermediate System-to-Intermediate System,中间系统到中间系统)、边界网关协议(BGP)是运行于 TCP 上的一种自治系统的路由协议。 

参考资料:

http://www.cnblogs.com/sammyliu/p/4636091.html http://linux.vbird.org/linuxserver/0250simplefirewall.php#netfiltersyntax http://www.linuxhomenetworking.com/wiki/index.php/QuickHOWTO:Ch14:LinuxFirewallsUsingiptables#ManagingtheiptablesServer http://www.embeddedlinux.org.cn/linux_net/0596002556/understandlni-CHP-28-SECT-3.html http://www.netfilter.org/documentation/HOWTO/NAT-HOWTO-6.html


长按订阅更多精彩▼

如有收获,点个在看,诚挚感谢