1、IPtables简介

Netfilter/Iptables是(linux/unix)自带的一款优秀开源代码的完全自由的基于包过滤的防火墙工具。可以对流入和输出服务器的数据包进行很精细的控制。IPtables主要工作在OSI七层的二、三、四层。

IPtables是linux内核集成的IP信息过滤系统。对于接入网络或者服务器,则该系统有利于在linux系统上控制IP信息包过滤和防火墙配置。

两大组件:netfilter iptables 。 

netfilter 组件称为内核空间(kernelspace),是内核一部分,由信息包过滤表组成。这些表包含内核用来控制信息包过滤处理的规则集。

IPtables 组件是一种工具,称为用户空间(userspace),使插入、修改、除去信息包过滤表中的规则变得容易。

2 IPtables表与链功能

IPtables的规则链分为三种:输入、转发和输出

1)输入——用于过滤目的地址是本机的连接。

2)转发——用来过滤目的地址和原地址都不是本机的连接。如路由器收到大多数数据均需要转发给其他主机。

3)输出——用来过滤地址是本机的连接。如ping baidu.com,iptables会检查输出链中与ping和baidu.com相关的规则,然后决定允许还是拒绝你的连接请求。

3 IPtables数据包流程

数据包先经过PREOUTING,由该链确定数据包走向:

1)  目的地址是本地,则发送到INPUT,让INPUT决定是否接收下来送到用户空间,流程为①--->②;

2)  若满足PREROUTING的nat表上的转发规则,则发送给FORWARD,然后再经过POSTROUTING发送出去,流程为: ①--->③--->④--->⑥;

3)  主机发送数据包时,流程则是⑤--->⑥;

4)  其中PREROUTING和POSTROUTING指的是数据包的流向,如上图所示POSTROUTING指的是发往公网的数据包,而PREROUTING指的是来自公网的数据包。

 

4、IPtables四张表、五条链。

IPtables具有Filter,、NAT、Mangle、Raw四个内建表。

5、linux下的IPtables下filter表

filter表示iptables的默认表,默认有三种内建表:

INPUT链:处理来自外部的数据

OUTPUT链:处理向外发送的数据

FORWARD链:将数据转发到本机或其他网卡设备上。

6、linux下IPtables下的NAT表

NAT表有三种内建链:

PREROUTING链:处理到达本机并在路由转发前的数据包,它会转发数据包中的目标IP地址(destination ip address),通常用于DNAT(destination NAT)

POSTROUTING链 – 处理即将离开本机的数据包。它会转换数据包中的源IP地址(source ip address),通常用于SNAT(source NAT)

OUTPUT链:处理本机产生的数据包

7、linux下IPtables命令

1.命令:
-A 顺序添加,添加一条新规则
-I 插入,插入一条新规则 -I 后面加一数字表示插入到哪行
-R 修改, 删除一条新规则 -D 后面加一数字表示删除哪行
-D 删除,删除一条新规则 -D 后面加一数字表示删除哪行
-N   新建一个链
-X   删除一个自定义链,删除之前要保证次链是空的,而且没有被引用
-L 查看
 @1.iptables -L -n 以数字的方式显示
 @2. iptables -L -v显示详细信息
 @3. iptables -L -x 显示精确信息
-E   重命名链
-F 清空链中的所有规则
-Z   清除链中使用的规则
-P 设置默认规则
2.匹配条件:
隐含匹配:
   -p  tcp udp icmp
   --sport指定源端口
   --dport指定目标端
   -s 源地址
   -d 目的地址
-i 数据包进入的网卡
-o 数据包出口的网卡
扩展匹配:
-m state --state   匹配状态的
-m mutiport --source-port   端口匹配 ,指定一组端口
-m limit --limit 3/minute   每三分种一次
-m limit --limit-burst  5   只匹配5个数据包
-m string --string --algo bm|kmp --string"xxxx"  匹配字符串
-mtime--timestart 8:00 --timestop 12:00  表示从哪个时间到哪个时间段
-mtime--days    表示那天
-m mac --mac-source xx:xx:xx:xx:xx:xx 匹配源MAC地址
-m layer7 --l7proto qq   表示匹配腾讯qq的 当然也支持很多协议,这个默认是没有的,需要我们给内核打补丁并重新编译内核及iptables才可以使用 -m layer7 这个显示扩展匹配
3.动作:
-j
DROP 直接丢掉
ACCEPT 允许通过
REJECT 丢掉,但是回复信息
LOG --log-prefix"说明信息,自己随便定义" ,记录日志
SNAT       源地址转换
DNAT       目标地址转换
REDIRECT   重定向
MASQUERAED  地址伪装
保存iptables规则
service iptables save
# 重启iptables服务
service iptables stop
service iptables start
WEB服务器,开启80端口:
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
邮件服务器,开启25,110端口
iptables -A INPUT -P tcp --dport 110 -j ACCEPT
iptables -A INPUT -P tcp --dport 25 -j ACCEPT
FTP服务器,开启21端口
iptables -A INPUT -P tcp --dport 20 -j ACCEPT
iptables -A INPUT -P tcp --dport 21 -j ACCEPT
DNS服务器开启53号端口
iptables -A INPUT -p tcp --dport 53 -j ACCEPT
允许icmp包通过,也就是允许ping
iptables -A OUTPUT -p icmp -j ACCEPT(DROP)
iptables -A INPUT -p icmp -j ACCEPT(DROP)
将本机的8080端口转发至其他主机,主机IP:192.168.0.111 ,目标主机和端口:192.168.0.112:80
iptables -t nat -A PREROUTING -p tcp -m tcp -d 192.168.0.111 --dport 8080 -j DNAT --to-destination 192.168.0.112:80
iptables -t nat -A POSTROUTING -p tcp -m tcp --dport 80 -j SNAT --to-source 192.168.0.111:8080
echo 1>/proc/sys/net/ipv4/ip_forward
同时开启iptables forward
用 iptables 将 192.168.0.10080 端口映射到 192.168.0.1118080 端口
iptables -t nat -A PREROUTING -p tcp -d 192.168.0.100 --dport 80 -j DNAT -to-destination 192.168.0.111:8080
本机的80端口转到8080端口
iptables -t nat -A PREROUTING -p tcp --dport -j REDIRECT --to-ports 8080

门户网站iptables规则策略如下

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [602:39593]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

-A INPUT -i lo -j ACCEPT
-A INPUT -s 192.168.0.111 -j DROP
-A INPUT -s 192.168.0.112 -j ACCEPT

-A INPUT -p icmp -j ACCEPT
-A INPUT -P tcp -m state --state NEW -M tcp --dport  22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
-A INPUT -s 116.243.139.7 -p tcp -m state --state NEW -m tcp --dport 7001 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 8801 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 25 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 110 -j ACCEPT
####
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT