一,iptables的表和链 (iptables包含4个表,5个链)
1) 规则表 (表的处理优先级:raw>mangle>nat>filter。)
filter:用来对数据包过滤。
nat:用于nat功能(端口映射,地址映射等)
mangle:用于对特定数据包的修改,用来修改数据包的Tos,TTL设置标记。
raw:主要用来决定是否对的数据包进行状态跟踪。
2)链
INPUT:当收到访问防火墙本机地址的数据包(入站)时, 应用链中的规则
FORWARDING:通过路由表后,目的地不为本机
OUTPUT:由本机产生,向外转发
PREROUTING:数据包进入路由表之前
POSTROUTIONG:发送到网卡接口之前。
第一种情况:入站数据流向
从外界到达防火墙的数据包,先被PREROUTING规则链处理(是否修改数据包地址等),之后会进行路由选择(判断该数据包应该发往何处),如果数据包的目标主机是防火墙本机(比如说Internet用户访问防火墙主机中的web服务器的数据包),那么内核将其传给INPUT链进行处理(决定是否允许通过等),通过以后再交给系统上层的应用程序(比如Apache服务器)进行响应。
第二冲情况:转发数据流向
来自外界的数据包到达防火墙后,首先被PREROUTING规则链处理,之后会进行路由选择,如果数据包的目标地址是其它外部地址(比如局域网用户通过网关访问QQ站点的数据包),则内核将其传递给FORWARD链进行处理(是否转发或拦截),然后再交给POSTROUTING规则链(是否修改数据包的地址等)进行处理。
第三种情况:出站数据流向
防火墙本机向外部地址发送的数据包(比如在防火墙主机中测试公网DNS服务器时),首先被OUTPUT规则链处理,之后进行路由选择,然后传递给POSTROUTING规则链(是否修改数据包的地址等)进行处理。
二,防火墙规则
1)查看规则列表
iptables -L INPUT --line-numbers(以顺序号的形式显示规则)
iptables -n -L input (-n 能够以数字的形式显示地址和端口信息)
还可以查单个表的规则 (如 iptables -t nat -nL)
2)删除和清空规则
iptables -D INPUT 2 (-D 删除指定的一条规则)
iptables -F 清除预设表filter中的所有规则链的规则
iptables -X 清除预设表filter中使用者自定链中的规则
3)设置默认规则
iptables -p INPUT DROP
iptables -p OUTPUT ACCEPT
iptables -p FORWARD DROP
对于OUTPUT链,也就是流出的包我们不用做太多限制,而是采取ACCEPT。
我们可以把INPUT,FORWARD两个链的默认策略设置为DROP,然后具体添加允许通过的规则
这样设置还是挺合理的,当然你也可以三个链都DROP,但这样做我认为是没有必要的,而且要写的规
则就会增加.但如果你只想要有限的几个规则是,如只做WEB服务器.还是推荐三个链都是DROP.
4)添加个规则
通用规则
协议匹配 (iptables -I INPUT -p icmp -j DROP)
地址匹配 (iptables -A FORWARD -s 192.168.1.0/24 -j ACCEPT)
网络接口匹配 (iptables -I INPUT -i eth0 -s 192.168.1.0/24 -j DROP)
端口匹配(iptables -A FORWARD -s 192.168.1.0/24 -p udp --dport 53 -j ACCEPT)
ICMP类型匹配( iptables -A INPUT -p icmp --icmp-type 8 -j DROP 8表示请求,0表 示回显,3表示目标不可达。。)
显式匹配
多端口匹配 ( iptables -A INPUT -p tcp -m multiport --dport 25,80,110,143 -j ACCEPT)
IP范围匹配 (iptables -A FORWARD -p tcp -m iprange --src-range 192.168.1.10-192.168.1.100 -j ACCEPT )
MAC地址匹配 (iptables -A INPUT -m mac --mac-source 00:01:29:c0:55:3F -j DROP)
状态匹配 (iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT, 常见的状态有NEW(与任何连接无关的) ESTABLISHED(响应请求或 已建立连接的),RELATED(与已有连接有相关性的,如ftp数据连接))
5)SNAT 策略(针对局域网pc机访问internet的数据,将原有地址更改为网关的公网ip地址)
共享固定ip上网(iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT ---to 200.0.0.1)
共享动态ip地址上网 (iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE) (MASQUERADE 伪装 自动获取外网接口的ip址)
6)DNAT策略
发布企业内部的服务器(iptables -t nat -A PREROUTING -I eth0 -d 200.0.0.1 -p tcp --dport 80 -j DNAT --to 192.168.1.2
设置端口映射(iptables -t nat -A PREROUTING -I eth0 -d 200.0.0.1 -p tcp --dport 2222 -j DNAT --to 192.168.1.2:22 )
7)规则的备份和还原
iptables-save 备份(导出) iptables-save > /opt/iptb.txt
iptables-restore 恢复(导入) </opt/iptb.txt
8)squid代理服务
传统和透明代理(透明需手动指定代理服务器的地址和端口,透明需要结合客户机的默认 路由,网关重定向策略。)
三 ,综合实验
网关防火墙:
实现内网使用域名通过代理访问外网WEB服务,只允许ICMP、FTP通过NAT访问外网(使用域名)
允许内网主机ping通网关,能使用squid代理
不允许外网主机ping网关,只允许响应包及SSH请求(200.0.0.2)进入网关
允许外网主机远程登录内部服务器
实验环境
3台虚拟机(第一台为外网 ip为200.0.0.2,第二台虚拟机为网关并且还是squid代理 eth0 200.0.0.1 eth1 192.168.1.1 第三台为充当内网 192.168.1.2)
防火墙规则
重定向
iptables -t nat -A PREROUTING -s 192.168.1.0/24 -i eth1 -p tcp --dport 80 -j REDIRECT --to-ports 3128
共享上网
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 200.0.0.1 (也可以用动态共享 MASQUERADE)
定义FORWARD链的默认规则
iptables -P FORWARD DROP
允许内网ping请求
iptables -A FORWARD -s 192.168.1.0/24 -i eth1 -p icmp --icmp-type 8 -j ACCEPT
允许内网访问ftp (一定要添加模块)
iptables -A FORWARD -s 192.168.1.0/24 -i eth1 -p tcp --dport 20:21 -j ACCEPT
/sbin/modprobe ip_nat_ftp
/sbin/modprobe ip_conntrack_ftp
允许DNS解析
iptables -A FORWARD -s 192.168.1.0/24 -i eth1 -p udp --dport 53 -j ACCEPT
响应请求或已建立的连接
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
定义INPUT默认规则
iptables -P INPUT DROP
iptables -A INPUT -s 192.168.1.0/24 -i eth1 -p icmp -m icmp --icmp-type 8 -j ACCEPT
允许外网ssh网关
iptables -A INPUT -s 200.0.0.2 -i eth0 -p tcp --dport 22 -j ACCEPT
允许squid代理
iptables -A INPUT -s 192.168.1.0/24 -i eth1 -p tcp --dport 3128 -j ACCEPT
响应请求
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
允许外网主机远程登录内部服务器
iptables -t nat -A PREROUTING -i eth0 -d 200.0.0.1 -p tcp --dport 222 -j DNAT --to 192.168.1.2:22
iptables -A FORWARD -s 200.0.0.2 -i eth0 -p tcp --dport 22 -j ACCEPT
我们可以写成脚本,
将脚本写入/etc/rc.local下 开机自动运行
ipt=/sbin/iptables
lan_net=192.168.1.0/24
lan_int=eth1
wan_int=eth0
wan_ip=200.0.0.1
echo 1 > /proc/sys/net/ipv4/ip_forward
/sbin/modprobe ip_nat_ftp
/sbin/modprobe ip_conntrack_ftp
$ipt -P INPUT DROP
$ipt -P FORWARD DROP
$ipt -A INPUT -s $lan_net -i $lan_int -p icmp -m icmp --icmp-type 8 -j ACCEPT
$ipt -A INPUT -s 200.0.0.2 -i $wan_int -p tcp -m tcp --dport 22 -j ACCEPT
$ipt -A INPUT -s $lan_net -i $lan_int -p tcp -m tcp --dport 3128 -j ACCEPT
$ipt -A INPUT -m state --state ESTABLISHED -j ACCEPT
$ipt -A FORWARD -s $lan_net -i $lan_int -p icmp -m icmp --icmp-type 8 -j ACCEPT
$ipt -A FORWARD -s $lan_net -i $lan_int -p tcp -m tcp --dport 20:21 -j ACCEPT
$ipt -A FORWARD -s $lan_net -i $lan_int -p udp -m udp --dport 53 -j ACCEPT
iptables -A FORWARD -s 200.0.0.2 -i $lan_int -p tcp --dport 22 -j ACCEPT
$ipt -A FORWARD -m state --state ESTABLISHED -j ACCEPT
$ipt -A FORWARD -m state --state RELATED -j ACCEPT
$ipt -t nat -A PREROUTING -s $lan_net -i $lan_int -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128
$ipt -t nat -A POSTROUTING -s $lan_net -o $wan_int -j SNAT --to-source $wan_ip
$ipt -t nat -A PREROUTING -i eth0 -d $wan-ip -p tcp -m tcp --dport 222 -j DNAT --to 192.168.1.2:22