iptables详解
iptables定义:
iptables 是nuix/linux 系统自带的优秀且完全免费的基于包过滤的防火墙工具、它的功能十分强大、使用非常灵活、可以对流入、流出及流经服务器的数据包进行精细的控制。特别是它可以在一台非常低配置下跑的非常好。提供400台机器的办公上网共享服务丝毫不逊色数万RMB企业级专业路由器防火墙。
iptables具有链:
prerouting、input、forwrad、output、postrouting
iptables具有表:
filter、nat、mangle表
表的执行顺序
mangle->nat->filter
链和表的关系:
1、filter表和input链、forward链、output链关系
- Filter表 和主机自身相关、负责防火墙(过滤本机流入、流出数据包)。
是iptables默认使用的表。这个表定具有三个链(chains):- INPUT 负责过滤所有目标地址是主机(防火墙)地址的数据包、通俗的讲、就是过滤进入主机的数据包。
- FORWARD 负责转发流经主机但不进入本机的数据包、起转发作用、和NAT表关系很大、后面会详细介绍
- OUTPUT 处理所有原地址是本机地址的数据包、通俗的讲就是处理从主机发出去的数据包。
2、nat表和output链、prerouting链、postrouting链关系
- NAT表 是网络地址转换的意思。即负责来源与目的IP地址和port的转换、和主机本身无关。一般用于局域网多人共享上网或者内网IP映射外网IP及不同端口转换服务等功能。Nat表的功能很重要、这个表具有三个链(chains) :
- OUTPUT 主机发出去的数据包有关、在数据包路由之前改变主机产生的数据包的目的地址等。
- PREROUTING 在数据包刚到达防火墙时、进行路由判断之前执行的规则、改变包的目的地址(DNAT功能)、端口等(通俗比喻,就是收信时、根据规则重写收件人的地址、这看上去不地道啊)把公司IP映射到局域网的机器上、此链多用于把外部IP地址端口的服务、映射为内部IP地址及端口
- POSTROUTING 在数据包离开防火墙时进行路由判断之后执行的规则、改变包的源地址(SNAT)、端口等(通俗比喻、就是寄信时写好发件人的地址、要让人家回信是能够有地址可回)刺链多用于局域网共享上网,把所有局域网的地址、转换为公网地址上
3、mangle表和input链、forward链、output链、prerouting链、postrouting链的关系
- Mangle 主要负责修改数据包中特殊的路由标记,如TTL、TOS、MARK等、这个表定义了5个链(chains)
- INPUT 同filter表的INPUT
- FORWARD 同filter表的FORWARD
- OUTPUT 同fileter表的OUTPUT
- PREROUTING 同nat表的PREROUTING
- POSTOUTING 同nat表的POSTOUTING
iptables的工作原理
规则概念
据指定的匹配条件来尝试匹配每个流经此处的报文,一旦匹配成功,则由规则后面指定的处理动作进行处理;
处理动作
- ACCEPT:允许数据包通过。
- DROP:直接丢弃数据包,不给任何回应信息,这时候客户端会感觉自己的请求泥牛入海了,过了超时时间才会有反应。
- REJECT:拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息。
- SNAT:源地址转换,解决内网用户用同一个公网地址上网的问题。
- MASQUERADE:是SNAT的一种特殊形式,适用于动态的、临时会变的ip上。
- DNAT:目标地址转换。
REDIRECT:在本机做端口映射。 - LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配。
命令中常用的参数
-P 设置默认策略:iptables -P INPUT (DROP|ACCEPT)
-F 清空规则链
-L 查看规则链
-A 在规则链的末尾加入新规则
-I num 在规则链的头部加入新规则
-D num 删除某一条规则
-s 匹配来源地址IP/MASK,加叹号"!"表示除这个IP外。
-d 匹配目标地址
-i 网卡名称 匹配从这块网卡流入的数据
-o 网卡名称 匹配从这块网卡流出的数据
-p 匹配协议,如tcp,udp,icmp
--dport num 匹配目标端口号
--sport num 匹配来源端口号
注:如果没有指定表就是默认为filter表
常用实例
- 阻止指定IP地址
# 丢弃来自1.0.98.1的包
iptables -A INPUT -s "1.0.98.1" -j DROP
# 阻止来自eth0网卡的tcp的包
iptables -A INPUT -i eth0 -p tcp -s "1.0.98.1" -j DROP
- 允许所有SSH的链接请求
# 允许所有来自外部的SSH连接请求,即只允许进入eth0接口,并且目标端口为22的数据包
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
- 在filter表中的中插入拒绝由90端口的机器向本机发送tcp报文
iptables -t filter -A INPUT -j DROP —dport 90
- 删除规则
# 删除上面的规则
iptables -D INPUT -s "1.0.98.1" -j DROP
iptables -D INPUT -i eth0 -p tcp -s "1.0.98.1" -j DROP
iptables -D INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -D OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
iptables -t filter -D INPUT -j DROP —dport 90
想要看其他常用命令:https://www.linuxprobe.com/25-iptables-common-examples.html
参考文档:
https://www.zsythink.net/archives/1199
https://www.cnblogs.com/liang2580/articles/8400140.html