简述
iptables其实不是真正的防火墙,我们可以把它理解成一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的”安全框架”中,这个”安全框架”才是真正的防火墙,这个框架的名字叫netfilter
netfilter才是防火墙真正的安全框架(framework),netfilter位于内核空间。
iptables其实是一个命令行工具,位于用户空间,我们用这个工具操作真正的框架。
netfilter/iptables(下文中简称为iptables)组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。
Netfilter是Linux操作系统核心层内部的一个数据包处理模块,它具有如下功能:
- 网络地址转换(Network Address Translate)
- 数据包内容修改
- 以及数据包过滤的防火墙功能
所以说,虽然我们使用service iptables start启动iptables”服务”,但是其实准确的来说,iptables并没有一个守护进程,所以并不能算是真正意义上的服务,而应该算是内核提供的功能。
引用自iptables详解(1):iptables概念
基础操作
查看
1 2 3 4 5 6 7 8 9 10
| # # 查看filter表中INPUT链规则 iptables -t filter -L INPUT --line -nxv
# -t 指定表名,默认filter # -L 指定链名,默认所有链 # -v 查看详细信息 # -n 不对IP地址进行名称反解析,直接显示IP地址 # --line-numbers 显示规则编号,可简写为--line # -x 显示精确数值
|
增加
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| # # 放通从ens192网口来的所有ssh请求 iptables -A INPUT -i ens192 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o ens192 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
# PS: # 处理动作: # - ACCEPT:允许数据包通过。 # - DROP:直接丢弃数据包,不给任何回应信息,这时候客户端会感觉自己的请求泥牛入海了,过了超时时间才会有反应。 # - REJECT:拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息。 # - SNAT:源地址转换,解决内网用户用同一个公网地址上网的问题。 # - MASQUERADE:是SNAT的一种特殊形式,适用于动态的、临时会变的ip上。 # - DNAT:目标地址转换。 # - REDIRECT:在本机做端口映射。 # - LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配。 # - 链名(转至指定链处理)
|
删除
1 2 3 4 5 6 7 8 9 10 11
| # # -t 指定表 # -D 指定链 # <num> 指定规则id iptables -t nat -D POSTROUTING 1
# 删除filter表中INPUT链第三条规则 iptables -t filter -D INPUT 3
# 删除源地址为192.168.1.146,动作为ACCEPT的规则 iptables -t filter -D INPUT -s 192.168.1.146 -j ACCEPT
|
永久生效
1 2 3 4 5
| # 规则添加至/etc/sysconfig/iptables即可永久保存 # iptables服务管理
# iptables-save > /etc/sysconfig/iptables
|
常用方式
路由转发
1 2 3 4 5 6 7 8 9 10 11 12
| # # -s 指定源网段 # -d 指定目标网段 # -o 指定目标网段的网络接口 # -j MASQUERADE 地址伪装 iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -d 10.10.1.0/24 -o eth0 -j MASQUERADE # PS: # 1. 服务器开启路由转发需开启内核转发 # 临时配置:echo "1" > /proc/sys/net/ipv4/ip_forward # 永久配置:修改sysctl.conf,设置net.ipv4.ip_forward = 1,执行sysctl -p生效 # 2. 客户端设置网关为服务器ip # route add -net 10.10.1.0 netmask 255.255.255.0 gw 192.168.1.199
|
示例
命令行方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| # start iptables -N IECI-INPUT
# base iptables -I IECI-INPUT -p tcp --dport 22 -j ACCEPT # ssh iptables -I IECI-INPUT -p tcp --sport 22 -j ACCEPT # ssh iptables -I IECI-INPUT -p udp --sport 123 -j ACCEPT # chronyd iptables -I IECI-INPUT -p udp --sport 53 -j ACCEPT # dns iptables -I IECI-INPUT -p udp --dport 53 -j ACCEPT # dns iptables -I IECI-INPUT -p udp --dport 67 -j ACCEPT # dhcp,检测不需要(已踢除) iptables -I IECI-INPUT -p icmp -j ACCEPT # ping iptables -I IECI-INPUT -i lo -j ACCEPT # 127.0.0.1
# platform iptables -I IECI-INPUT -i ens192 -s 111.111.16.47 -j ACCEPT iptables -I IECI-INPUT -i ens192 -s 111.111.16.48 -j ACCEPT iptables -I IECI-INPUT -i ens192 -s 111.111.16.49 -j ACCEPT iptables -I IECI-INPUT -i ens192 -s 111.111.16.50 -j ACCEPT iptables -I IECI-INPUT -i ens192 -s 111.111.16.147 -j ACCEPT iptables -I IECI-INPUT -i ens224 -s 6.6.6.0/24 -j ACCEPT iptables -I IECI-INPUT -i ens224 -s 192.168.206.0/24 -j ACCEPT iptables -I IECI-INPUT -i ens224 -s 169.254.202.0/24 -j ACCEPT iptables -I IECI-INPUT -i ens161 -s 8.8.8.0/24 -j ACCEPT iptables -I IECI-INPUT -p tcp -i ens192 --dport 1984 -j ACCEPT # haproxy dashboard
# kubernetes iptables -I IECI-INPUT -i docker0 -j ACCEPT # docker iptables -I IECI-INPUT -i kube-ipvs0 -j ACCEPT # kubernates ipvs iptables -I IECI-INPUT -s 10.10.0.0/16 -j ACCEPT # pod iptables -I IECI-INPUT -s 10.96.0.0/12 -j ACCEPT # service iptables -I IECI-INPUT -p tcp -i ens192 --dport 32000 -j ACCEPT # kubernates dashboard
# openstack iptables -I IECI-INPUT --dport 3260 -j ACCEPT # iscsi iptables -I IECI-INPUT --dport 5050 -j ACCEPT # ironic inspector iptables -I IECI-INPUT -p tcp -i ens192 --dport 30680 -j ACCEPT # nova vnc iptables -I IECI-INPUT -p tcp -i ens192 --dport 31000 -j ACCEPT # openstack dashboard
# end iptables -I INPUT -j IECI-INPUT iptables -P INPUT DROP
|
iptables文件方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| # sample configuration for iptables service # you can edit this manually or use system-config-firewall # please do not ask us to add additional ports/services to this default configuration *filter :INPUT DROP [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :IECI-INPUT - [0:0] -A INPUT -j IECI-INPUT -A IECI-INPUT -i lo -j ACCEPT -A IECI-INPUT -p icmp -j ACCEPT -A IECI-INPUT -i docker0 -j ACCEPT -A IECI-INPUT -i kube-ipvs0 -j ACCEPT -A IECI-INPUT -p udp -m udp --sport 53 -j ACCEPT -A IECI-INPUT -p udp -m udp --sport 123 -j ACCEPT -A IECI-INPUT -p tcp -m tcp --sport 22 -j ACCEPT -A IECI-INPUT -p tcp -m tcp --dport 22 -j ACCEPT -A IECI-INPUT -s 10.10.0.0/16 -j ACCEPT -A IECI-INPUT -s 10.96.0.0/12 -j ACCEPT -A IECI-INPUT -s 111.111.16.147/32 -i ens192 -j ACCEPT -A IECI-INPUT -s 111.111.16.47/32 -i ens192 -j ACCEPT -A IECI-INPUT -s 111.111.16.48/32 -i ens192 -j ACCEPT -A IECI-INPUT -s 111.111.16.49/32 -i ens192 -j ACCEPT -A IECI-INPUT -s 111.111.16.50/32 -i ens192 -j ACCEPT -A IECI-INPUT -i ens192 -p tcp -m tcp --dport 30680 -j ACCEPT -A IECI-INPUT -i ens192 -p tcp -m tcp --dport 31000 -j ACCEPT -A IECI-INPUT -i ens192 -p tcp -m tcp --dport 1984 -j ACCEPT -A IECI-INPUT -i ens192 -p tcp -m tcp --dport 32000 -j ACCEPT -A IECI-INPUT -s 6.6.6.0/24 -i ens224 -j ACCEPT -A IECI-INPUT -s 8.8.8.0/24 -i ens161 -j ACCEPT -A IECI-INPUT -s 192.168.206.0/24 -i ens224 -j ACCEPT -A IECI-INPUT -s 169.254.202.0/24 -i ens224 -j ACCEPT -A IECI-INPUT -p tcp -m tcp --dport 3260 -j ACCEPT -A IECI-INPUT -p tcp -m tcp --dport 5050 -j ACCEPT COMMIT
|
参考文档