1.iptables 过滤原理
包过滤: IPTABLES采用【数据包】过滤机制,它对请求的数据包进行分析,并更具我们预先设置的规则进行匹配来决定是否可以进入主机。
iptables的4表5链: iptables内部结构细化分为:以功能区分称为表; 以iptables动作区分称为链。 iptables(用户空间) —> netfilter(内和空间)—> tables(4表)—> chains(5链) —> 规则policy。
tables四表作用:
- filter(主机防火墙):对主机的数据包进出进行控制,主要是iptables默认的表;表中包含的对应的链:INPUT(进入)、OUTPUT(出去)、FORWARD(流经、转发)。
- nat:用于端口或者IP映射或共享上网;表中包含的链:POSTROUTING(流出主机后路由)、PREROUTING(进入主机前路由)、OUTPUT(流出主机)。
- mangle:用于配置路由标记 ttl \ tos \ mark(拆解报文,做出修改,并重新封装);表中包含的链:INPUT、OUTPUT、FORWARD、POSTROUTING、PREROUTING。
- raw:关闭nat表上启用的连接追踪机制;表中包含的链:OUTPUT、PREROUTING。
chains链的作用:
- INPUT:进入主机的数据包;主机防火墙最关键的链(filter表的INPUT链)。
- OUTPUT:流出主机的数据包。
- FORWARD:流经主机的数据包。
- PREROUTING:进入服务器最先经过的链,NAT端口或IP映射。(nat表的PREROUTING链)
- POSTROUTING:在流出服务器最后经过的链,NAT共享上网。局域网共享上网(nat表的POSTROUTING链)
# 1.查看iptables规则(需要序列)
iptables -nL --line-numbers # 查看全部链
iptables -nL INPUT --line-numbers # 查看INPUT链上的规则
# 2.规则的删除
iptables -t filter -D INPUT 1 # 删除INPUT链中,的第一条规则(编号通过 --line-numbers查询)
iptables -F # 清空所有的规则,只留下默认规则
iptables -X # 清除用户自定义的链
# 配置规则
iptables -I INPUT 2 # 指定位置插入规则
iptables -t filter -A INPUT -i eth0 -s 10.0.0.0/24 -j DORP # 禁止网段访问
iptables -A INPUT -s ! 10.0.0.0/24 -j DROP # 禁止的取反,根据规则;其实可以指定ACCEPT
iptables -A INPUT -m iprange --src-range 127.12.12.50-127.12.12.150 -j ACCEPT #匹配源IP
iptables -A INPUT -m iprange --dest-range 8.8.8.2-8.8.8.22 -j DROP #匹配目标IP
# 匹配端口范围
--sport 22:88
-m multiport --dport 21,22,23,23306,1205:1400
# 匹配网络状态 -m state --state
#允许关联的状态包通过,一般用于ftp服务
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 1. 许出不许进,最安全的配置
iptables -P INPUT DROP # 也是默认配置
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# 开启新人的IP段
iptables -A INPUT -p all -s 124.43.62.96/27 -j ACCEPT
iptablse -A INPUT -p al -s 192.168.30.0/24 -j ACCEPT
# 允许访问的端口
iptables -A INPUT -p tcp --dport 23306 -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dport 21,23,10010:10050 -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dport 21,23,10010:10050 -j ACCEPT
#让服务器可以进行域名解析
iptables -A INPUT -p udp --dport 53 -j ACCEPT
iptables -A INPUT -p udp --sport 53 -j ACCEPT
# 允许所有人ping
iptables -A INPUT -p icmp -m icmp 00icmp-type any -j ACCEPT
#让服务器可以ping
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
#让服务器自身可以上网
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#场景:浏览器中访问 13.32.4.61:8088,能够映射转换到13.32.161.250:8088
#在13.32.4.61上执行
iptables -t nat -A PREROUTING -d 13.32.4.61 -p tcp --dport 8088 -j DNAT --to 13.32.161.250:8088
iptables -t nat -A POSTROUTING -d 13.32.161.250 -p tcp --dport 8088 -j SNAT --to 13.32.4.61
#还可以使用REDIRECT单独进行端口转换
#例:将 80 端口的封包转递到 8080端口
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
# 使用 8080 这个 port 来启动 WWW ,但是别人都用80来联机
#实现外网IP 124.42.34.112 一对一映射到内部 10.0.0.8
#网关IP eth0:124.42.60.109 eth1:10.0.0.254
#首先在路由网关上绑定VIP 124.42.34.112,可以是别名的方式。
iptables -t nat -A POSTROUTING -s 10.0.0.0/20 -d 124.42.34.112 -j SNAT --to-source 10.0.0.254
iptables -t nat -A PREROUTING -d 124.42.34.112 -j DNAT --to-destination 10.0.0.8
iptables -t nat -A POSTROUTING -s 10.0.0.8 -o eth0 -j SNAT --to-source 124.42.34.112
参考文档: