netfilter是Linux内核中实现的防火墙功能,iptables则是应用态的防火墙管理工具
其中包含三个最基本的规则表:
1. 用于包过滤处理的filter表
2. 用于网络地址转换的nat表
3. 用于特殊目的的数据包修改的mangle表
规则表 | 规则链 | 规则处理对象 | 处理动作 |
filter 包过滤
|
INPUT | 发送给本地协议的数据包 | 过滤、接受等
|
OUTPUT | 本地协议栈发出的数据包 | 过滤、接受等
|
|
FORWARD | 路由转发的数据包 | 过滤、接受等 | |
nat NAT代理
|
PREROUTING | 未经路由选择的数据包 | DNAT、NAPT等 |
POSTROUTING | 已经过路由选择的数据包 | SNAT
|
|
OUTPUT | 本地协议栈发出即将路由的数据包 | 本地数据包DNAT等 | |
mangle 特殊数据包修改 |
以上五个规则链 | 所有数据包 | 特殊目的的数据包头部修改 |
iptables [-t table] command [match] [target]
-t:指定配置规则所在的表 :filter、 nat、 mangle、 raw 。。。。。。
command:告诉iptables命令要做什么
-A(--append):将一条规则附加到链的末尾
$iptables -A INPUT -s202.152.1.1 -j ACCEPT //向INPUT链中添加一个规则
-D(--delete):指定要匹配的规则或者指定规则在链中的位置编号,将其从链中删除该规则
-P(--policy):设置链的缺省目标操作,即所有与链中任何规则都不匹配的信息包都将被强制使用此链的缺省操作
$iptables -P INPUT DROP //将缺省值设置为DROP(ACCEPT/接受;DROP/丢弃)
-N(--new-chain):用命令中所指定的名称创建一个新链
-F(--flush):如果指定链名,该命令删除链中所有的规则,如果未指定链名,该命令删除所有链中所有的规则。
$iptables -F FORWARD //删除FORWARD中所有的规则
-L(--list):列出指定链中所有的规则
$iptables -L FORWARD //列出FORWARD中的所有规则
match:部分为规则匹配条件----- 多个匹配条件之间是与的关系
通用匹配:
-i/-o:进入网络接口/发出网络接口
-s/-d:源和目的地址
-p :协议类型
-m :网络连接状态等
特定协议匹配:
--sport/--dport:为TCP/UDP端口匹配设置条件等
Target:指定满足匹配条件之后的目标操作
ACCEPT:-j ACCEPT 接受(允许他前往目的地),并且他将停止遍历规则链
DROP:-j DROP 阻塞该信息,丢弃
REJECT:-j REJECT 与DROP类似,但不会在服务器和客户机上留下死套接字,另外,它将错误消息发回给数据包的发送方。
RETURN:-jump RETURN 让与该规则匹配的信息包停止遍历包含该规则的链。
包过滤与报文状态检查机制
ACCEPT:允许数据包经过网络协议栈
DROP:静默丢弃数据包,不通知发送源
QUEUE:通过nf_queue机制将数据包传送至应用层供上层应用处理
STOLEN:保持数据报直到特定条件后处理,用于处理ip分片等
REPEAT:使得数据包重新进入Hook检查点
注意:ACCEPT和DROP最常用
NEW:新建连接,即接受到连接处是报文,或只看到一个方向的数据包
ESTABLISHED:已经完成三次握手的TCP连接,或已看到双向通信的网络连接
RELATED:相关网络链接,用于处理FTP等协商端口的网络协议
INVALD:非法状态,即当前网络交互处理不符合网络协议规范,造成非法链接
//允许链接目标地址为web服务器IP,当前状态为NEW的网络链接可通过防火墙转发
# iptables-t filter -A FORWARD -d [WEB_SERVER] -m state --state NEW -j ACCEPT
//已经建立网络链接和相关网络链接可以通过防火墙
# iptables -t filter -A FORWARD -m state --state RELATED, ESTABLISHED -j ACCEPT
NAT配置:PREROUTING(用于DNAT)、POSTROUTING(用于SNAT)、OUTPUT(用于本地产生的包的DNAT) 3个缺省链
SNAT:改变网络连接数据包的源地址
DNAT:改变网络连接数据包的目的地址
使得内部网络主机发出的数据包进行源IP地址伪装,使用防火墙外网IP地址。
# iptables -t nat -A POSTROUTING -i eth1 -o eth0 -j MASQUERADE
按照用户规则配置,可以将网络连接的源地址改编成各种灵活配置的不同地址
SNAT机制需要在POSTROUTING链中完成
因为路由、包过滤都是在源地址改变之前做的
用目标操作选项 “-j SNAT” 用“--to-source"来描述要转换的IP地址、或者一个范围的IP地址及端口
//通过路由发出的网络连接的源IP地址都修改为2.2.2.2
# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 2.2.2.2
//通过路由发出的TCP网络链接的源IP地址修改为2.2.2.2,且源端口设置为1-1023范围内的一个
# iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to 2.2.2.2:1-1023
DNAT机制需要在PREROUTING链中完成
对于本机的应用程序来说都忽略目的地址的改变,认为到达真实的目标地址。需要用到“-i”选项
//将目的地址转换为3.3.3.3
# iptables -t nat -A PREROUTING -i eth1 -j DNAT --to 3.3.3.3
//jiang web网络流量的目的地址和端口转换为4.4.4.4:8080
# iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth1 -j DNAT --to 4.4.4.4:8080
//将本地发出的到2.2.2.2的数据包重定向至本地loopback
# iptables -t nat -A OUTPUT -d 2.2.2.2 -j DNAT --to 127.0.0.1
//将到外网IP1.2.3.4的8080端口网络流量转发至内网ip192.168.1.1的80端口
# iptables -A PREROUTING -t nat -p tcp -d 1.2.3.4 --dport 8080 -j DNAT --to 192.168.1.1:80