iptables

iptables是一个命令行工具,用来和2.4.x、2.6.x内核netfilter通讯的一个工具。
iptables用来管理网络的,做流量转发。

一般对于某个服务来说是部署在多台机器上的,对外提供服务的时候,希望在前端有个负载机把流量转发到后端的任意节点上。这时就需要在前端的负载机上配置一个iptables,经过配置,内核就可以把流量转发到后端服务器上。完全不需要在应用层写网络服务,内核可以帮你在IP层做一个转发。

内网如何做对外服务器

  • 服务协议(TCP/UDP)
  • 对外服务器端口
  • 内部服务器私网 IP
  • 内部真正服务端口
  • 实例
    1. iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 80 \ -j DNAT --to 192.168.1.1
    2. iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 81 \ -j DNAT --to 192.168.1.2:80
    这2条规则配置当公网服务器收到请求的时候,需要把外网流量转发给内网的2台服务器。
    这2台服务器没有公网的IP。但是有一台服务器,也就是执行这2条命令的服务器是有公网IP的。它有一张网卡连接在公网上,还有一张网卡连接在局域网内,当外部的流量通过公网的网卡进入到这台服务器的时候,流量需要转发给内部的服务器,也就是192.168.1.1和192.168.1.2需要做具体的处理。这时候怎么办?
    可以搭建反向代理实现,也可以用iptables。

外部用户:10.10.10.10(src源外部请求IP)
公网服务器:22.22.22.22(dst 目标服务器):有2张网卡,1张公网网卡对外pppoe拨号22.22.22.22,1张内网网卡对内(也插了一根网线,连在交换机上)192.168.1.3

TCP(src -> dst:80)
目标端口是80 ,源端口肯定是随机分配的。

内网服务器: 192.168.1.1、192.168.1.2

所谓交换机就是一个2层基于Mac地址的转发。交换机就是一个小盒子,上面插满了网线,来自于公网服务器一根网线和内网服务器2根网线,共属于LAN 192.168.1.0/24 。

公网服务器(外网ip 22.22.22.22 内网ip 192.168.1.3) 想给内网服务器(192.168.1.1和192.168.1.2)发包的时候,通过ARP广播。
**
如果想给192.168.1.1发包,就通过ARP广播: 谁的IP是192.168.1.1, 请告诉我你的MAC地址。这是局域网通信的原理。当你知道MAC地址之后,公网服务器通过内网网卡就可以获得目标MAC地址,通过交换机就可以直接把数据发给192.168.1.1。

家庭电脑为啥买一个路由器插上网线或者连上WiFi之后就可以上网了,这是什么原理?

我们有一台公网服务器(公网IP是22.22.22.22,内网IP是192.168.1.1)
内网服务器(DHCP Client): 192.168.1.2、192.168.1.3
内网服务器的2个IP就是公网赋予的,公网服务器就相当于一个路由器。怎么赋予的呢?
只要把内网服务器的俩台机器和公网服务器的网线 连在一台交换机上,就会发生一个行为,公网交换机会做DHCP广播(基于MAC地址,在局域网内,可以广播数据出去),通过交换机,可以广播到内网的2台服务器上。
DHCP的作用就是问2台服务器,要不要ip,2台服务器回答说要,公网服务器(路由器)就会收到回复,路由器回复说(DHCP广播,给MAC1这台电脑 192.168.1.2、给MAC2这台电脑192.168.1.3)

如果登录路由器去看的话,路由器上面会跑一个叫dhcp server(dnsmasq不仅提供dns解析能力,还提供DHCP广播能力)
ps aux|grep dhcp 查看dhcp的进程

arp -a 广播,大家把自己的mac地址和ip告诉我
image.png

mac地址是2层网络,ip地址是3层网络。

假设百度网站: 10.10.10.10

公网服务器(路由器)(公网IP(对外wan0网卡)是22.22.22.22,内网IP(对内lan0的网卡)是192.168.2.1)
内网服务器(DHCP Client):
192.168.2.2(访问百度网站 10.10.10.10)
src ip=192.168.2.2 dst ip = 10.10.10.10

192.168.2.3

内网服务器如何上网?内网服务器又没有直接连接在运营商上。只能通过路由器的转发。
linux路由表(网关)
rout -n 查看本机的路由
image.png
从路由器的视角看:MAC地址是我,没毛病,收下来了,linux内核做一个事情,check目标ip(dst ip) 竟然不是我,
从路由器的视角看:(linux内核):
dst mac必须是我,否则和我没关系,不处理
dst ip是不是我?linux内核会查看自己的路由表
路由表的规则信息
1)对外的路由规则:默认网关(公网网关)22.22.22.1wan0(运营商)(dst mac变成了运营商的网络节点)
2)对内的路由规则:192.168.2.x lan0 (目标地址满足这个网段,送到内网lan0 口上,就可以交换数据了)
image.png

树莓派-(dst mac)-> 路由器 -> 百度
路由器行为: 1) dst mac 是不是我? 是,通过
2)dst ip 是不是我?不是的话,默认丢弃。但是其实没有丢弃,路由器查路由表,把流量送给了公网,开启了ip_forward,开启转发行为。
只要打开这个选项ip_forward,linux内核当收到一个目标ip地址不是自己的时候,就会查自己的路由表,匹配一下从正确的网口送出去。
image.png
现在具备准发能力,缺少公网IP地址映射的能力,要具备映射能力,就需要iptables。

telnet 192.1568.2.100 53
Telnet是远程连接服务,它工作于在tcp/ip协议的应用层。telnet命令通常用来远程登录

目标地址改写
image.png
网桥: linux bridge,虚拟交换机
docker container -> bridge (软件概念) -> eth0

cat /proc/net/nf_conntrack | grep 8.8.8.8