前言
前段时间需要配置一台私网 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 的使用, 若汝以之为尚可, 拜请赞之 ~:)
来源: http://www.jianshu.com/p/e4d136269afb