iptables:
定义:命令行工具,用来和内核的netfilter模块通信;
作用:用来管理网络,做一个流量转发;
DNAT:目标地址映射
应用场景:内网做对外服务器;
电脑(外部用户):10.10.10.10(src)
公网服务器:22.22.22.22(dst)
此时,一条TCP(src - >dst:80);
内网服务器:均摊请求流量
192.168.1.1:
192.168.1.2
源端口随机分配,外部的人想请求内部的服务;
公网服务器两张网卡,对内,对外
公网网卡PPPOE拨号上网22.22.22.22 内网网卡:交换机(基于MAC地址的转发,来自于公网服务器网线+内网服务器网线,共属于一个lan)
ARP广播:谁的IP是192.168.1.1 请告诉我你的MAC地址 局域网通讯的原理
公网服务器(路由器):22.22.22.22 内网服务器:192.168.1.1 192.168.1.2 (由路由器分配,接入交换机,DHCP获取IP地址)
ps aux | grep dhcp
arp -a (类似于吆喝一声,告诉我你们的MAC地址)
内网电脑如何上网:只能通过路由器
百度网站:10.10.10.10(dst)
内网服务器:192.168.1.2(src)
网关:Linux路由表 route -n
目标地址与掩码&之后的IP是否是Destnation,从Iface网卡送出去UG表示网关,gateway
src_mac:自己的MAC
dst_mac:网关的MAC(ARP广播所得);
数据包会被192.168.100.1收到;
路由器角度:
MAC地址的确是路由器,但是目标IP地址不是我,
linux内核:首先MAC地址必须是我,否则和我没关,但是目标IP不是我,Linux内核会查看自己的路由表,即路由器查看自己的路由表
路由器默认网关:运营商节点;数据一定可以送到百度;dst_mac变成了运营商的网络节点
路由规则:192.168.2.X lan0 (192.168.2.110)
路由器发到公网前:源地址改写 22.22.22.22 目标地址保持不变10.10.10.10(地址转化SNAT源地址映射)
数据回来:
从百度角度来看:
数据包来源IP:(192.168.1.2) 22.22.22.22 目标IP确实是我
百度回包:
src_ip:101.10.10.10 dst_ip:192.168.2.2(回程丢包) 22.22.22.22(路由器收到报文了)
路由器:的确是我,但这个包我没用啊,路由器能找到当初的转换关系,将包还原,源地址保持不变,目标地址改成当初的192.168.1.2 扔包到lan上
内网服务器视角:源ip:10.10.10.10 目标地址:192.168.1.2
各司其职
iptables规则:
开关:cat proc/sys/net/ipv4/ip_forward
客户端 -> (目标MAC地址改写) -路由器 --> (查询路由表,把流量送给了公网) -->百度
路由器行为:1、mac 是不是我 2、ip是不是我(如果不是,默认丢弃)
iptables -t nat -nvl查看规则
例子1:目标地址改写
访问本机IP地址端口 修改为访问另一台设备IP地址端口
本机:(原始请求目标)192.168.2.101 55 另外一台():192.168.2.100 53
iptables -t nat -A (append) OUTPUT(链,内核的钩子) -p(协议,匹配)tcp -d 192.168.2.101 --dport 55 -j(行为,动作) DNAT --to-destination 192.168.2.100:53
DNAT:在回复报文的时候不需要再次加入iptables规则,只执行一次即可
删除iptables规则:iptabes -t nat -D OUTPUT 1
dig @114.114.114.114 baidu.com(备注:解析域名)
例子2:丢掉发往114.114.114.114的包
iptables -t filter -A OUTPUT -p udp -d 114.114.114.114 -j DROP
网桥:linux bridge 虚拟交换机
cat proc/net/nf_conntrack内核跟踪连接装态,内核对每一条TCP连接都有记录
iptables -t nat -nvL (n:用数字表示 v:详情 L:list)