Linux 小记 — 网络管理

作者: 捷义 | 来源:发表于2018-12-11 21:11 被阅读4次

    前言

    前段时间需要配置一台私网 ECS 联外网,阿里云比较推荐的方案是创建一个 NAT 网关并绑定 EIP, 以此来统一所有 ECS 的网络出口。由于我已经拥有一台外网 ECS(不想多掏钱,且我自己的测试环境不需要严格的稳定性要求),因此我决定使用 Iptables 对私网 ECS 的请求进行源地址转换,这台外网 ECS 就作为其余私网 ECS 的跳板机和网络代理机。虽然原理和最后的解决方案都非常简单,但查资料的过程却废了一番周折,于是决定将网络管理和 Iptables 的知识点做一个简单的梳理。


    1. OSI 七层模型与 TCP/IP 四层模型

    (以下部分图片来自互联网,不知其最初作者,因此未标记来源。)

    1.1 七层模型

    1.2 四层模型


    1.3 对应


    这几幅图一目了然,不需要过多文字赘述了。举个写邮件的例子吧:

    • 应用层:写邮件。
    • 表示层:加密和翻译为二进制。
    • 会话层:判断存储还是发送。
    • 传输层:选择 TCP 协议和发送端口。
    • 网络层:确定收发的 IP 地址和 MAC 地址。
    • 数据链路层:物理寻址,即确定每一个网关。
    • 物理层:各种硬件设备。

    2. 地址与端口

    2.1 IP 地址与子网掩码

    此二者必须结合使用,子网掩码的作用就是将某个IP地址划分成网络地址和主机地址两部分。
    IP 地址分类:

    网络类别 最大网络数 IP 地址范围 最大主机数 私有 IP 地址范围
    A 2^7 -2 1.0.0.0-126.255.255.255 2^24 -2 10.0.0.0-10.255.255.255
    B 2^14 128.0.0.0-191.255.255.255 2^16 -2 172.16.0.0-172.31.255.255
    C 2^21 192.0.0.0-223.255.255.255 2^8 -2 192.168.0.0-192.168.255.255

    子网掩码及子网规划:

    地址 网络位 网络位 子网位 主机位
    IP地址(172.16.2.121) 10101100 00010000 00000010 01111001
    子网掩码(255.255.255.0) 11111111 11111111 11111111 00000000
    网络地址 10101100 00010000 00000010 00000000
    广播地址 10101100 00010000 00000010 11111111

    网络地址 = IP 地址 & 子网掩码。
    广播地址 = 网络地址的主机位(子网掩码为0的部分)全换成1。
    (广播地址只是一个标识,在数据包里面,如果目的地址是广播地址的话,就会向整个同一网段的主机发送广播包。)

    2.2 其他地址

    • 网关地址:具有路由功能的设备的IP地址,如:路由器、启用了路由协议的服务器(相当于路由器)、代理服务器(相当于路由器)。当网络中的主机发现数据包的目标主机不在本地网络中,就把数据包转发给它自己的网关,再由网关转发给目标网络的网关。一般设置为一个网段的起始或终止值,例:172.16.2.1 或 172.16.2.254。
    • MAC地址:Media Access Control,具有全球唯一性。
    • DNS地址:Domain Name Server(域名服务器),百度:114.114.114.114,谷歌:8.8.8.8。
    • DHCP:指的是由服务器控制一段IP地址范围,客户机登录服务器时就可以自动获得服务器分配的IP地址和子网掩码。提升地址的使用率。

    2.3 常用端口

    • FTP:20,21。
    • SSH:22。
    • Telnet:23。
    • DNS:53。
    • HTTP(s):80(443)。
    • SMTP:25。
    • POP3:110。
    • SOCKS:1080。
    • Oracle:1521。
    • SQL Server:1433。
    • MySQL:3306。
    • MongoDB:27017。
    • Redis:6379。
    • Memcached:11211。

    3. Iptables

    3.1 Iptables 摘要

    简单的说,Iptables 是一种能够轻易插入、修改和除去数据包过滤表中规则的工具,是netfilter项目的一部分。以下为使用方法和案例详解(只记录我认为的常用规则):

    示意图:


    命令结构:

    iptables [-t 表名] [-AI 链名] [-I/o 网卡名] [-p  协议名] [-s 源IP/子网] [--sport 源端口] [-d 目标IP/子网] [--dport 目标端口] [-j 控制类型]
    

    表:

    • filter:默认表,配置规则允许或不允许,用于防火墙。
    • nat:地址转换,用于网关路由器。

    规则链:

    • PREROUTING 路由前(用于目标地址转换 DNAT)。
    • INPUT:数据包流入口。
    • PORWARD:转发管卡。
    • OUTPUT:数据包出口。
    • POSTOUTING:路由后(用于源地址转换 SNAT)。

    控制类型:

    • ACCEPT/DROP/REJECT:接收/丢弃/重定向数据包。
    • SNAT/DNAT:源地/目标址转换。
    • MASQUERADE:IP伪装(NAT),用于ADSL。
    • LOG:日志记录。

    3.2 Iptables 实例

    3.2.1 查看与清除规则

    iptables [-t tables] [-nv] [-L]
    # 参数说明:
    -t table:默认为 filter, 可指定 nat。
    -L :列出当前 table 的规则。
    -n :不进行 IP 与 HOSTNAME 的反查(速度更快)。
    -v :列出更多的信息,包括通过该规则的封包总位数、相关的网络接口等。
    
    iptables [-t tables] [-FXZ]
    # 参数说明:
    -F :清空规则链。
    -X :删除用户自定义的空链。
    -Z :将所有链的计数与流量统计归零。
    

    3.2.2 添加规则

    参数说明:

    -A/I 链名:添加规则,-A为在原规则后追击;-I 则为插入,若未指定行,则插入到第一行,例:iptables -I 2 INPUT -j ACCEPT。
    
    -i/o 网卡名:匹配网卡流入/出。
    
    -p  协议名:主要有tcp、udp、icmp 和 all。
    
    -s/d 源/目标 IP/子网:
       -s 172.16.205.1
       172.16.205.0/24 
       172.16.205.0/255.255.255.0
       IP:172.16.205.1
       -s ! 172.16.205.0/24 
       
    ...
    

    以上说明再结合 3.1 小节的命令结构足以满足大部分的应用场景了。

    3.2.3 配置私网 ECS 联外网

    前言中说了一些与之相关的梗概,本小结进行实际操作。首先,在 VPC 专有网络中添加一条路由规则,如下:



    下一跳实例为外网 ECS 实例。
    其次,在外网 ECS(172.16.200.1)中开启内核路由转发功能:

    # 临时
    echo 1 > /proc/sys/net/ipv4/ip_forward
    sysctl -p
    # 永久
    echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
    sysctl -p
    

    再根据 VPC 网段添加一条转发规则,例如我的是:

    iptables -t nat -A POSTROUTING -s 172.16.205.0/24 -j SNAT --to-source 172.16.200.1
    

    之后,只要是在 172.16.205.0/24 这个网段内的所有私网服务器都能联外网了。

    4. 其他网络管理常用命令

    由于服务器都在“云上”,所以很多 Linux 最基本的网路配置命令几乎都用不着了,常用的就是一些测试或者查看的命令,暂时收录如下:

    • ping: 发送ICMP报文,常用: ping -ic,参数说明:interval、count。
    • telnet: 查看端口是否联通,格式: telnet ip port
    • traceroute: 路由跟踪,格式: traceroute hostname
    • ifconfig: 查看网卡信息,其他的参数都不常用了。

    netstat: 监控 TCP/IP 网络,常用参数:

      -a # 显示所有socket,包括正在监听的。
      -l # 显示有在 Listen (监听) 的服务状态。
      -n # 以网络IP地址代替名称,显示网络连接情形。
      -t # 显示TCP协议的连接情况。
      -u # 显示UDP协议的连接情况。
    

    常与 grep 结合使用,如 netstat -atuln | grep ':80'

    route:

    route -n # 查询路由状态。
    route add/del default gw 172.16.200.1 #添加/删除默认网关。
    

    结语

    以上主要简述了 TCP/IP 模型和 Iptables 的使用,若汝以之为尚可,拜请赞之 ~:)


    我的公众号《有刻》,我们共同成长!


    相关文章

      网友评论

        本文标题:Linux 小记 — 网络管理

        本文链接:https://www.haomeiwen.com/subject/oatyhqtx.html