安装
1. 关闭selinux,不关闭selinux,iptables不读取配置文件
sed -i 's#SELINUX=enforcing#SELINUX=disabled#' /etc/selinux/config
setenforce 0
2. 关闭firewalld并关闭开机自启
centos7中默认的防火墙是firewalld,使用iptables需要先关闭firewalld防火墙
systemctl stop firewalld
systemctl disable firewalld
3. 安装iptables
yum install iptables-services iptables -y
4. 启动和查看iptables状态
systemctl start iptables
systemctl enable iptables
5. 检查内核模块
lsmod |egrep "nat|filter|ip"
ip_tables 27126 1 iptable_filter ###真正处理规则的。
6. 加载如下模块到linux内核
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state
7. 添加开机自动加载
cat >> /etc/rc.local << EOF
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state
EOF
chmod +x /etc/rc.d/rc.local
8. 开启ipv4转发
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p
net.ipv4.ip_forward = 1
工作流程
iptables是采用数据包过滤机制工作的,所以它会对请求的数据包的包头数据进行分析,并根据我们预先设定的规则进行匹配来决定是否可以进入主机。
1、防火墙是一层层过滤的。实际是按照配置规则的顺序从上到下,从前到后进行过滤的。
2、如果匹配上了规则,即明确表明是阻止还是通过,此时数据包就不在向下匹配新规则了。
3、如果所有规则中没有明确表明是阻止还是通过这个数据包,也就是没有匹配上规则,向下进行匹配,直到匹配默认规则(最后一条)得到明确的阻止还是通过。
4、防火墙的默认规则是对应链的所有的规则执行完以后才会执行的(最后执行的规则)。
iptables的表tables与链chains
Filter表(常用)
Filter是iptables的默认表,它有以下三种内建链(chains):
INPUT链: 处理来自外部的数据。
OUTPUT链: 处理向外发送的数据。
FORWARD链: 将数据转发到本机的其他网卡设备上。
NAT表(常用)
NAT表有三种内建链:
PREROUTING: 处理刚到达本机并在路由转发前的数据包。它会转换数据包中的目标IP地址(destination ip address),通常用于DNAT(destination NAT)。
POSTROUTING链: 处理即将离开本机的数据包。它会转换数据包中的源IP地址(source ip address),通常用于SNAT(source NAT)。
OUTPUT链: 处理本机产生的数据包。
Mangle表(基本不用)
Mangle表用于指定如何处理数据包。它能改变TCP头中的QoS位。Mangle表具有5个内建链(chains):
PREROUTING
OUTPUT
FORWARD
INPUT
POSTROUTING
Raw表(基本不用)
Raw表用于处理异常,它具有2个内建链:
PREROUTING chain
OUTPUT chain
iptables默认规则解析
iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
48 3356 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
1 40 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT 27 packets, 3404 bytes)
pkts bytes target prot opt in out source destination
iptables的配置文件:
cat /etc/sysconfig/iptables
# 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 ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
# 放行所有 已建立的连接(ESTABLISHED) 和 关联的连接(RELATED),确保正常的双向通信,避免影响现有会话。
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# 允许所有 ICMP 协议流量
-A INPUT -p icmp -j ACCEPT
# 允许本地回环流量
-A INPUT -i lo -j ACCEPT
# 允许 SSH 连接 ,放行新的 SSH 连接请求,当ssh连接已经建立时,再发起请求时第一条规则发挥作用(放行)
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
# 拒绝所有转发流量,并且以ICMP协议回应,生产环境中建议直接把(REJECT --reject-with icmp-host-prohibited)改为(DROP),因为默认的规则会有回应操作,如果遭受大量攻击访问,也是不小的请求负载,而DROP直接拒绝,不回应任何信息。
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
IPTABLES 规则
规则的关键知识点:
Rules包括一个条件和一个目标(target)
如果满足条件,就执行目标(target)中的规则或者特定值。
如果不满足条件,就判断下一条Rules。
目标值
在target里指定的特殊值:
ACCEPT: 允许防火墙接收数据包
DROP: 防火墙丢弃包
QUEUE: 防火墙将数据包移交到用户空间
RETURN: 防火墙停止执行当前链中的后续Rules,并返回到调用链(the calling chain)中。
描述规则的基本参数
以下这些规则参数用于描述数据包的协议、源地址、目的地址、允许经过的网络接口,以及如何处理这些数据包。这些描述是对规则的基本描述。
-p 协议(protocol)
指定规则的协议,如tcp, udp, icmp等,可以使用all来指定所有协议。
如果不指定-p参数,则默认是all值。这并不明智,请总是明确指定协议名称。
可以使用协议名(如tcp),或者是协议值(比如6代表tcp)来指定协议。映射关系请查看/etc/protocols
还可以使用–protocol参数代替-p参数
-s 源地址(source)
指定数据包的源地址
参数可以使IP地址、网络地址、主机名
例如:-s 192.168.1.101指定IP地址
例如:-s 192.168.1.10/24指定网络地址
如果不指定-s参数,就代表所有地址
还可以使用–src或者–source
-d 目的地址(destination)
指定目的地址
参数和-s相同
还可以使用–dst或者–destination
-j 执行目标(jump to target)
-j代表”jump to target”
-j指定了当与规则(Rule)匹配时如何处理数据包
可能的值是ACCEPT, DROP, QUEUE, RETURN
还可以指定其他链(Chain)作为目标
-i 输入接口(input interface)
-i代表输入接口(input interface)
-i指定了要处理来自哪个接口的数据包
这些数据包即将进入INPUT, FORWARD, PREROUTE链
例如:-i eth0指定了要处理经由eth0进入的数据包
如果不指定-i参数,那么将处理进入所有接口的数据包
如果出现! -i eth0,那么将处理所有经由eth0以外的接口进入的数据包
如果出现-i eth+,那么将处理所有经由eth开头的接口进入的数据包
还可以使用–in-interface参数
-o 输出(out interface)
-o代表”output interface”
-o指定了数据包由哪个接口输出
这些数据包即将进入FORWARD, OUTPUT, POSTROUTING链
如果不指定-o选项,那么系统上的所有接口都可以作为输出接口
如果出现! -o eth0,那么将从eth0以外的接口输出
如果出现-i eth+,那么将仅从eth开头的接口输出
还可以使用–out-interface参数
-sport 源端口(source port)针对 -p tcp 或者 -p udp
缺省情况下,将匹配所有端口
可以指定端口号或者端口名称,例如”–sport 22″与”–sport ssh”。
/etc/services文件描述了上述映射关系。
从性能上讲,使用端口号更好
使用冒号可以匹配端口范围,如”–sport 22:100″
还可以使用”–source-port”
--dport 目的端口(destination port)针对-p tcp 或者 -p udp
参数和–sport类似
还可以使用”--destination-port”
--tcp-flags TCP标志 针对-p tcp
可以指定由逗号分隔的多个参数
有效值可以是:SYN, ACK, FIN, RST, URG, PSH
可以使用ALL或者NONE
--icmp-type ICMP类型 针对-p icmp
--icmp-type 0 表示Echo Reply
--icmp-type 8 表示Echo
常用命令
以下是iptables命令的详细指南,包括命令格式、常见选项和使用示例。
查看现有规则
查看所有表中的规则:
查看所有表中的规则:
sudo iptables -L -v -n
-L:列出规则
-v:显示详细信息,包括数据包计数和字节数
-n: 以数字形式显示 IP 地址和端口号,而不是解析主机名
查看特定表中的规则:
sudo iptables -t nat -L -v -n
查看对应规则的序号:
iptables -L -n --line-numbers
添加规则
iptables -A INPUT -p tcp -s 192.168.1.10 --dport 80 -j ACCEPT
-A:将规则添加到INPUT链
-p:指定协议
-s:指定源ip
--dport:目标端口
-j ACCEPT:表示接受流量
# FORWARD链中添加一条规则,丢弃来自特定 IP 的所有流量:
sudo iptables -A FORWARD -s 10.0.0.5 -j DROP
-s:源ip地址
-j DROP:匹配后丢弃流量
#根据序号添加规则:
iptables -I INPUT 2 -s 172.0.0.0/8 -p tcp --dport 10255 -j ACCEPT
上述命令会在 INPUT 链的第 2 条规则之前插入一条新规则
删除规则
删除特定链中的一条规则,假设规则编号为 2:
iptables -D INPUT 2
删除特定表特定链中的一条规则
iptables -t nat -D PREROUTING 1
-D: 表示删除
2: 规则编号
-t 表示选择哪个表
根据规则内容删除规则:
iptables -D INPUT -p tcp -s 192.168.1.10 --dport 80 -j ACCEPT
与添加规则时相同的选项,但使用-D来删除规则
修改规则
不支持直接修改规则,只能先删除原有规则,再添加修改后的规则。先删除旧规则:
iptables -D INPUT -p tcp -s 192.168.1.10 --dport 80 -j ACCEPT
然后添加修改后的规则:
iptables -A INPUT -p tcp -s 192.168.1.10 --dport 8080 -j ACCEPT
修改端口号为 8080。
清空规则
sudo iptables -F
清空所有链中的规则,默认为filter表
sudo iptables -F INPUT
清空特定链中的规则:
清空特定表中的规则
sudo iptables -t nat -F
清空特定表特定链中的规则
sudo iptables -t nat -F PREROUTING
设置默认策略
sudo iptables -P INPUT DROP
设置INPUT链的默认策略为丢弃流量
sudo iptables -P INPUT ACCEPT
设置默认策略为接受
设置端口转发
以下是在云上实践
经过测试在公有云的iptables只能这样做转发,统一出网ip,iptables实现不了,只能使用nat网关产品。
要开启ipv4转发。
内网转发到内网的方式:
想使用192.168.171.139:5555去访问192.168.171.1:9999端口
iptables -t nat -A PREROUTING --dst 192.168.171.139 -p tcp --dport 5555 -j DNAT --to-destination 192.168.171.1:9999
iptables -t nat -A POSTROUTING --dst 192.168.171.1 -p tcp --dport 9999 -j SNAT --to-source 192.168.171.139
-t:指定表
-A:添加
-j DNAT --to-destination:目标地址转换
外网转发到内网的方式:(这里不可以加--dst,因为公有云的公网是绑定的,不是网卡)
A机器:公网:47.100.209.32 内网:192.168.1.252。 B机器:内网:192.168.1.251
想要从A机器的1122端口访问到B机器的22端口
iptables -t nat -A PREROUTING -p tcp --dport 1122 -j DNAT --to-destination 192.168.1.251:22
iptables -t nat -A POSTROUTING -p tcp -d 192.168.1.251 --dport 22 -j SNAT --to-source 192.168.1.252
第二句也可以替换为:
iptables -t nat -A POSTROUTING -p tcp -d 192.168.1.251 --dport 22 -j MASQUERADE #MASQUERADE 会将数据包的源IP地址更改为发出接口的IP地址。这对于动态分配的IP地址(例如通过DHCP获取的IP地址)非常有用,因为你可以确保数据包总是使用正确的源IP地址。
以下是在exsi实践(模仿物理机)
要开启ipv4转发。
内网转发到内网和外网转发到内网都一样,只要开启了ipv4转发。(有实实在在的网卡)
A机器:公网100.100.137.20 内网:192.168.1.10 B机器:内网:192.168.1.11
想要从A机器的1122端口访问到B机器的22端口
iptables -t nat -A PREROUTING --dst 100.100.137.20 -p tcp --dport 1122 -j DNAT --to-destination 192.168.1.11:22
iptables -t nat -A POSTROUTING --dst 192.168.1.11 -p tcp --dport 22 -j SNAT --to-source 192.168.1.10
或者:
iptables -t nat -A PREROUTING -p tcp --dport 1122 -j DNAT --to-destination 192.168.1.11:22
iptables -t nat -A POSTROUTING -p tcp -d 192.168.1.11 --dport 22 -j SNAT --to-source 192.168.1.10
再或者:
1. 将B机器的默认路由网关改为A机器 内网IP
2. iptables -t nat -A PREROUTING -p tcp --dport 1122 -j DNAT --to-destination 192.168.1.11:22
实现内网机器访问外网:
1. 将B机器的默认路由网关改为A机器的内网IP
2. iptables -t nat -A POSTROUTING -s 192.168.1.0/255.255.255.0 -j SNAT --to-source 100.100.137.20
备份和恢复
备份iptables规则
iptables-save命令用来批量导出iptables防火墙规则,直接执行iptables-save时,将显示出当前启用的所有规则,按照raw、mangle、nat、filter表的顺序依次列出;若只希望显示出某一个表,应添加“-t表名”作为命令选项,然后结合重定向输入“>”将输出内容重定向到某个文件中。
列如:备份所有表的规则,操作如下:
iptables-save > /opt/iprules_all.txt
默认将所有规则保存到“/etc/sysconfig/iptables”文件中
service iptables save
恢复iptables规则
iptables-retore命令用来批量导入防火墙规则,如果已经有使用iptable-save命令导出的备份文件,则恢复规则的过程也就是一瞬间的事。与iptables-save命令相对的,iptables-restore命令应结合重定向输入来指定备份文件的位置。
列如:将上所备份的规则恢复到iptables中,操作如下:
iptables-restore < /opt/iprules_all.txt
默认将“/etc/sysconfig/iptables”文件中的内容加载到iptables中,也就是说,如果备份使用的是“service iptables save”那么恢复的时候就应该使用“service iptables start”
service iptables start