iptables
> 下图为iptables的表和链,重点在nat表和filter表。
>
> filter表是默认表,实现防火墙即包过滤功能。
>
> nat表实现网络地址转换。
>
> - 配置iptables时,不指定表,就是使用filter表
> - 配置时不指定规则链,则配置所有链

#### 一、iptables
**包的整个流程是一个回环**
> iptables常用功能是防火墙和NAT
>
> firewalld底层调用iptables
```shell
# 环境准备
client1:
eth0 -> 192.168.88.10/24
gateway -> 192.168.88.11
fw1:
eth0 -> 192.168.88.11/24
eth1 -> 192.168.99.11/24
server1:
eth1 -> 192.168.99.100/24
gateway -> 192.168.99.11
# 安装firewalld
yum install -y iptables-services
systemctl start iptables.service # iptables在起动服务时会出现一些默认规则
```
##### iptables参数
- INPUT:数据包目标地址为本机,则进入INPUT链
- OUTPUT:数据包源地址为本机,则进入OUTPUT链
- FORWARD:数据包穿过本机做转发功能,则进入FORWARD链
> iptables语法格式
>
> iptables [-t表名] 选项 [链名] [条件] [-j满足条件的操作]
```
常用参数:
追加规则:-A
eg:iptables -A INPUT
删除规则:-D
eg:iptables -D INPUT 1
修改规则:-R(替换目标规则,顺序不变)
eg:iptables -R INPUT [替换位置] -s [IP地址] -j DROP
插入规则:-I(插入一条规则,原本位置上的规则将往后顺位)
eg:iptables -I INPUT [插入位置] --dport [端口] -j ACCEPT
查看规则:-L(列出规则链中的所有规则)
eg:iptables -L INPUT
显示规则行号:--line-numbers
eg:iptables -nL INPUT --line-numbers
通用参数:
协议:-p
eg:iptables -A INPUT -p tcp
源地址:-s
eg:iptables -A INPUT -s [IP源地址]
目的地址:-d
eg:iptables -A INPUT -d [IP目的地址]
源端口:--sport
eg:iptables -A INPUT -p tcp --sport [端口号]
目的端口:--dport
eg:iptables -A INPUT -p tcp --dport [端口号]
指定入口网卡:-i
eg:iptables -A INPUT -i [网卡]
指定出口网卡:-o
eg:iptables -A FORWARD -o [网卡]
最后指定要处理的动作:-j
DROP(直接丢弃) REJECT(明确拒绝) ACCEPT(接受)
规则清空:-F
eg:iptables -F
```
白名单默认拒绝明确允许;黑名单默认允许明确拒绝
> 保存规则,如果不保存规则,那重启iptables服务后自定义规则将消失
>
> iptables-save > /etc/sysconfig/iptables
从本机发出包会带有标识:ESTABLISHE
> 如果从本机设置防火墙阻止外界访问,本地ping的包可以发包但返回不能接收
>
> iptables -I INPUT -m state --state ESTABLISHED -j ACCEPT
#### 二、NAT网络地址转换
追踪httpd日志信息:/var/log/httpd/access_log #可以查看登录用户详细信息
<img src="iptables-nat.png" style="zoom:250%;" />
互联网环境中,运营商不允许私有地址出现在互联网上,发现私有地址的数据会直接丢弃。所以私有地址发往互联网时,需要用NAT转换成公有地址,也叫合法地址。
同样,作为公司也不会暴露内网地址,也需要路由器将内网地址在对外端口做公网转换,所有内网地址对外统一使用一个公网IP
所以不同内网路由器需要配置对应路由表,大致路线为:
从客户端发向服务器的包
经路由器A将客户端ip地址改成公网IP后发往路由器B
路由器B将接收包中的公网IP改变成内网ip转发给服务器
服务器接收请求后将返回结果发送给路由器B
路由器B将包内网ip改成公网IP后转发给路由器A
路由器A将包中的ip改为社区内网ip传给客户端
以上整个传输步骤完结,但有两处细节,第一整个流程中客户端与服务器都不知道对方的ip只知道对方路由器的ip地址,第二在公司内网,服务器提供服务的端口不一定与路由器B的端口一致,比如服务器80端口提供http服务但路由器B转发时会采用8080端口发包
(客户端到路由器A的步骤)**Easy IP**是一种特殊的动态NAT技术,直接使用路由器或防火墙外网接口的公网IP作为转换后的地址,无需额外配置公网地址池。多个内网设备通过共享同一个公网IP的不同端口访问外网
(路由器A到路由器B的步骤)**静态NAT**是一对一固定映射的NAT技术,将内网设备的私有IP永久映射到一个公网IP。通常用于内网服务器对外提供服务
```shell
# 路由器A添加规则追加到postrouting链:将88.0网段的源ip包装成99.11
iptables -t nat -A POSTROUTING -s 192.168.88.0/24 -j SNAT --to-source 192.168.99.11
# ip伪装
iptables -t nat -A POSTROUTING -s 192.168.88.0/24 -j MASQUERADE
# 路由器B添加规则追加到prerouting链:将发给88.11:8080的包转发到内网服务器99.100:80
iptables -t nat -A PREROUTING -d 192.168.88.11 -p tcp --dport 8080 -j DNAT --to-destination 192.168.99.100:80
```
> postrouting在数据包离开路由器前生效
> prerouting在数据包进入路由器后、路由决策前生效