linux网络基础知识

科技动态 2017-06-29 阅读原文

本文主要整理一些和linux网络相关的零散功能,后续根据需要还会继续补充。

iptables

先看一张图:

iptables在内核的组成

两个通道:

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

netfilter的hook点包括:

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

原理:

iptables根据功能定义了4个表,raw,mangle,filter,nat。

这个四个表中有各自包含不同的链,如PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING,这些链与Netfilter的HOOK点相对应,链中包含具体的规则从而控制数据包了.

关于不同表的说明如下:

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

从上图可以看出每个hook中处理的chain顺序依次为:mangle-->nat-->filter

特别地,对filter table而言,一个数据包,根据其源和目的地址,只能被其中的一个hook处理。

iptables命令格式:

举例:

增加一条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

NAT hook实现点

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 
#Example:
ip netns add nstest

#列表所有 netns
ip netns list

#删除某 netns
ip netns delete 

#在 network namespace 中运行命令
ip netns exec  
#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可被用于以下场景:

  • mac地址发生变化:通告自己的mac地址发生变化,以 ARP Response 的形式发送广播,它通常只是为了把自己的ARP信息通告/更新给局域网全体,这种Response不需要别人请求,是自己主动发送的通告:
  • 重复地址检测:重复 MAC 地址检测。以 ARP Request的形式发送广播,请求自己的MAC地址,目的是探测局域网中是否有跟自己IP地址相同的主机,也就是常说的IP冲突。发送主机并不需要一定收到此请求的回答。如果收到一个回答,表示网络中存在与自身IP相同的主机。如果没有收到应答,则表示本机所使用的IP与网络中其它主机并不冲突。
  • virtual IP:当提供虚拟IP的active server down掉时,通过某种机制重新选取一个active server,并由此server发送一个免费ARP,格式同"mac地址发生变化"一节,通知网络中的其他主机刷新arp表项。

参考资料:

简书

责编内容by:简书阅读原文】。感谢您的支持!

您可能感兴趣的

linux一切皆文件之文件描述符(一) 一、知识准备 1、在linux中,一切皆为文件,所有不同种类的类型都被抽象成文件。如:普通文件、目录、字符设备、块设备、套接字等 2、当一个文件被进程打开,就会创建一个文件描述符。这时候,文件的路径就成为了寻址系统,文件描述符成为了...
linux-kernel-exploits – Linux平台提权漏洞集合... linux-kernel-exploits 简介 linux-kernel-exploits 漏洞列表 #CVE #Description #Kernels CV...
Linux系统运维面试题解答 1. 简述常用高可用技术 解答: Keepalived:Keepalived是一个保证集群高可用的服务软件,用来防止单点故障,使用VRRP协议实现。在master和backup之间通过master主动降低自己的权值或者backu...
linux环境变量 linux登陆环境变量初始化顺序 /etc/profile-->~/.bash_profile-->~/.bash_login-->~/.profile 参考: A login shell is ...
Cinnamon 3.8.4 发布,Linux 桌面交互环境 Cinnamon 3.8.4 已发布,更新内容: SettingsWidgets.py: strip pkexec from standalone module exec strings when checking fo...