赞
踩
Iptables是Linux内核集成的包过滤防火墙系统,几乎所有的Linux发行版本都支持Iptables的功能,如果Linux系统连接到Internet或LAN、服务器、代理服务器,则iptables有利于在Linux系统上更好的控制IP信息包过滤和防火墙配置。
注意:Centos8支持三种防火墙服务iptables(6版本及其以下版本)、firewalld(7版本及其以上版本)、nftables(8版本新服务)
Netfilter/Iptables过滤防火墙系统是一种强大的拦截工具,可以新增、修改、删除其规则,这些规则在包过滤中起决定性作用,虽然Netfilter/Iptables包过滤系统是一个单个实体,但是其由两部分组成,前者为Netfilter,后者为Iptables;
filter表:主要用于过滤数据包,该表根据系统管理员预定义的一组规则过滤符合条件的数据包,对于防火墙而言,主要利用filter表中指定的规则来实现对数据包的过滤,filter表是默认的表,如果没有指定那个表,则iptables默认使用filter表来执行所有的命令,filter表包含了INPUT链(处理进入的数据包)、FORWARD链(处理转发的数据包)、OUTPUT链(处理本地生成的数据包),在filter表中只能允许对数据包进行接收(ACCEPT)、丢弃(DROP)的操作,而无法对数据包进行更改;
nat表:主要用于网络地址转换NAT,该表可以实现一对一、一对多、多对多等NAT操作,iptables就是使用该表实现共享上网的,NAT表包含了PREROUTING链(修改即将到来的数据包),POSTROUTING链(修改即将出去的数据包)、OUTPUT链(修改路由之前本地生成的数据包);
mangle表:主要用于对指定数据包进行更改,在内核版本2.4.18后的Linux版本中该表包含的链有INPUT链(处理进入的数据包)、FORWARD链(处理转发的数据包)、OUTPUT链(处理本地生成的数据包)、POSTROUTING链(修改即将输出的数据包)、PREROUTING链(修改即将到来的数据包);
raw表:只使用在PREROUTING链和OUTPUT链上,因为优先级最高,从而可以对收到的数据包在连接跟踪前进行处理,一旦用户使用了raw表,在某个链上,将跳过nat表和ip_conntrack处理,即不再做地址转换和数据包的链接跟踪处理了。
表优先级由高到低:security --> raw --> mangle --> nat --> filter
内置链:每个内置链都对应一个钩子函数;
自定义链:用户可以自定义设置链。
从外界到达防火墙的数据包,先被PERROUTING链处理(是否修改即将到来的数据包),之后会进行路由选择(判断该数据包应该发往何处),如果数据包的目标地址是防火墙本机器,那么内核将其传给INPUT链(是否允许通过)进行处理,通过后交给系统上传的应用程序进行响应;
来自外界的数据包达到防火墙后,首先被PERROUTING链规则进行处理,之后会进行路由选择,如果数据包的目的地址是其他的外部地址,则内核将其传递给FORWARD链(确认转发或拦截)进行处理,然后交给POSTROUTING链(是否修改数据包的地址)处理;
防火墙本机器向外部地址发送的数据包,首先被OUTPUT链处理,之后进行路由选择,然后传递给POSTROUTING链进行处理;
Iptables是CentOS 7/Redhat 7及其以下版本的防火墙服务,若要开启iptables服务需先关闭firewalld服务。
# 关闭firewalld [root@localhost ~]# systemctl stop firewalld [root@localhost ~]# systemctl mask firewalld Created symlink /etc/systemd/system/firewalld.service → /dev/null. # 附:恢复firewalld服务配置 [root@localhost ~]# systemctl unmask firewalld [root@localhost ~]# systemctl restart/start firewalld # 安装并打开iptables [root@localhost ~]# yum -y install iptables-services [root@localhost ~]# systemctl restart/start iptables # 查看配置文件 [root@localhost ~]# rpm -qc iptables-services /etc/sysconfig/ip6tables /etc/sysconfig/iptables [root@localhost ~]# cat /etc/sysconfig/iptables # sample configuration for iptables service # you can edit this manually or use system-config-firewall *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT # 帮助查询 [root@localhost ~]# iptables --help # 查看版本 [root@localhost ~]# iptables --version iptables v1.8.2 (nf_tables) # 查看命令执行文件位置与权限 [root@localhost ~]# which iptables /usr/sbin/iptables [root@localhost ~]# ll /usr/sbin/iptables lrwxrwxrwx 1 root root 17 Jun 15 2021 /usr/sbin/iptables -> xtables-nft-multi # 查看表内链 [root@localhost ~]# iptables -vnL -t [table] Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination
命令格式:
[root@localhost ~]# iptables [-t table] SUBCOMMAND chain [-m matchname [per-match-options]] -j targetname [per-target-options]
PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING + 自定义链
扩展操作需加载特殊模块(/usr/lib64/xtables/*.so)后方可使用。
iptables在使用-p选项指明了特定的协议时,无需再用-m选项指明扩展模块的扩展机制,不需要手动加载扩展模块。
使用-m选项指明要调用的扩展模块名称,需手动加载对应扩展模块,如[-m matchname [per-match-options]]
。
以离散方式定义多端口匹配,最多指定15个端口。
[root@localhost ~]# iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.10 -p tcp -m multiport --dports 20:22,80 -j ACCEPT
指明连续的(但一般不是整个网络)ip地址范围。
[root@localhost ~]# iptables -A INPUT -d 172.16.1.100 -p tcp --dport 80 -m iprange --src-range 172.16.1.5-172.16.1.10 -j DROP
指明源MAC地址,适用于:PREROUTING, FORWARD,INPUT chains。
[root@localhost ~]# iptables -A INPUT -s 172.16.0.100 -m mac --mac-source 00:50:56:12:34:56 -j ACCEPT
对报文中的应用层数据做字符串模式匹配检测。
[root@localhost ~]# iptables -A OUTPUT -p tcp --sport 80 -m string --algo bm --from 62 --string "google" -j REJECT
根据将报文到达的时间与指定的时间范围进行匹配(CentOS 8 此模块有问题)。
注: centos6 不支持kerneltz ,–localtz指定本地时区(默认配置)
[root@localhost ~]# iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.10 -p tcp --dport 80 -m time --timestart 14:30 --timestop 18:30 --weekdays Sat,Sun --kerneltz -j DROP
根据每个客户端IP做并发连接数数量匹配,可防止Dos攻击;
[root@localhost ~]# iptables -A INPUT -d 172.16.100.10 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
基于收发报文的速率做匹配(令牌桶过滤器);
[root@localhost ~]# iptables -I INPUT -d 172.16.100.10 -p icmp --icmp-type 8 -m limit --limit 10/minute --limit-burst 5 -j ACCEPT
state扩展模块可以根据”连接追踪机制“去检查连接的状态,较耗资源;
conntrack机制:追踪本机上的请求和响应之间的关系。
状态类型:
# 已经追踪到的并记录下来的连接信息库
[root@localhost ~]# cat /proc/net/nf_conntrack
ipv4 2 tcp 6 299 ESTABLISHED src=192.168.70.1 dst=192.168.70.134 sport=14362 dport=22 src=192.168.70.134 dst=192.168.70.1 sport=22 dport=14362 [ASSURED] mark=0 secctx=system_u:object_r:unlabeled_t:s0 zone=0 use=2
ipv4 2 tcp 6 431987 ESTABLISHED src=192.168.70.1 dst=192.168.70.134 sport=14378 dport=22 src=192.168.70.134 dst=192.168.70.1 sport=22 dport=14378 [ASSURED] mark=0 secctx=system_u:object_r:unlabeled_t:s0 zone=0 use=2
ipv4 2 udp 17 10 src=192.168.70.134 dst=185.209.85.222 sport=51394 dport=123 src=185.209.85.222 dst=192.168.70.134 sport=123 dport=51394 mark=0 secctx=system_u:object_r:unlabeled_t:s0 zone=0 use=2
# 调整连接追踪功能所能够容纳的最大连接数量
[root@localhost ~]# cat /proc/sys/net/netfilter/nf_conntrack_max
65536
[root@localhost ~]# cat /proc/sys/net/nf_conntrack_max
65536
# 查看连接跟踪有多少条目
[root@localhost ~]# cat /proc/sys/net/netfilter/nf_conntrack_count
4
# 不同的协议的连接追踪时长
[root@localhost ~]# ll /proc/sys/net/netfilter/
连接跟踪,需要加载模块modprobe nf_conntrack_ipv4,当服务器连接多于最大连接数时dmesg 可以观察到 :kernel: ip_conntrack: table full, dropping packet错误,并且导致建立TCP连接很慢,各种状态的超时后,链接会从表中删除。
连接过多的解决方法两个:
# 加大nf_conntrack_max值
[root@localhost ~]# vim /etc/sysctl.conf
net.nf_conntrack_max = 393216
net.netfilter.nf_conntrack_max = 393216
# 降低nf_conntrack timeout时间
[root@localhost ~]# vim /etc/sysctl.conf
net.netfilter.nf_conntrack_tcp_timeout_established = 300
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
iptables -t nat -L -n
格式:-m --state state
[root@localhost ~]# iptables -A INPUT -d 172.16.1.10 -p tcp -m multiport --dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT
[root@localhost ~]# iptables -A OUTPUT -s 172.16.1.10 -p tcp -m multiport --sports 22,80 -m state --state ESTABLISHED -j ACCEPT
comment扩展是一种用于添加注释的扩展,它允许在iptables规则中添加注释,以便在以后查看或修改规则时更容易理解规则的目的。
[root@localhost ~]# iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT -m comment --comment "Allow SSH from local network"
# "Allow SSH from local network"是注释,它描述了此规则的目的
# 显示所有INPUT链中的规则,包括它们的注释
[root@localhost ~]# iptables -L INPUT -n -v -x --line-numbers
在iptables中,-J选项用于指定应该执行哪个目标(target)动作,允许用户定义自己的目标动作。
# 创建一个名为MYACTION的新链
[root@localhost ~]# iptables -N MYACTION
# 将所有通过MYACTION链的流量记录到系统日志中,并添加一个前缀“MYACTION:”
[root@localhost ~]# iptables -A MYACTION -j LOG --log-prefix "MYACTION: "
# 将所有通过MYACTION链的流量丢弃
[root@localhost ~]# iptables -A MYACTION -j DROP
# 将所有来自192.168.1.0/24网络的TCP流量重定向到MYACTION链中,以执行MYACTION链中定义的动作
[root@localhost ~]# iptables -A INPUT -s 192.168.1.0/24 -p tcp -j MYACTION
target类型:
[root@localhost ~]# iptables -I INPUT -s 10.0.1.0/24 -p tcp -m multiport --dports 80,21,22,23 -m state --state NEW -j LOG --log-prefix "new connections: "
[root@localhost ~]# iptables -R INPUT 2 -p tcp --dport 21 -m state --state NEW -j LOG --log-prefix "ftp new link: "
[root@localhost ~]# iptables-save > /PATH/TO/SOME_RULES_FILE
[root@localhost ~]# iptables-restore < /PATH/FROM/SOME_RULES_FILE
在/etc/rc.d/rc.local文件添加加载规则即可。
iptables/netfilter利用filter表的FORWARD链,可以充当网络防火墙(FORWARD链实现内外网络的流量控制)。
[root@localhost ~]# iptables -A FORWARD -d 10.1.1.0/24 -m state --state NEW -j ACCEPT
[root@localhost ~]# iptables -I FORWARD -d 10.1.2.0/24 -p tcp --dport 80 -j ACCEPT
[root@localhost ~]# iptables -vnL FORWARD --line-numbers
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 ACCEPT tcp -- * * 0.0.0.0/0 10.1.2.0/24 tcp dpt:80
2 0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
3 0 0 ACCEPT all -- * * 0.0.0.0/0 10.1.1.0/24 state NEW
source NAT ,支持POSTROUTING, INPUT,让本地网络中的主机通过某一特定地址访问外部网络,实现地址伪装,请求报文:修改源IP。
SNAT:基于nat表的target,适用于固定的公网IP。
格式:iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNet -j SNAT --to-source ExtIP
[root@localhost ~]# iptables -t nat -A POSTROUTING -s 10.0.1.0/24 ! –d 10.0.1.0/24 -j SNAT --to-source 172.18.1.6-172.18.1.9
基于nat表的target,适用于动态的公网IP,如:拨号网络。
格式:iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNet -j MASQUERADE
[root@localhost ~]# iptables -t nat -A POSTROUTING -s 10.0.1.0/24 ! –d 10.0.1.0/24 -j MASQUERADE
destination NAT 支持PREROUTING , OUTPUT,把本地网络中的主机上的某服务开放给外部网络访问(发布服务和端口映射),但隐藏真实IP,请求报文:修改目标IP;
nat表的target,适用于端口映射,即可重定向到本机,也可以支持重定向至不同主机的不同端口,但不支持多目标,即不支持负载均衡功能。
格式:iptables -t nat -A PREROUTING -d ExtIP -p tcp|udp --dport PORT -j DNAT --to-destination InterSeverIP[:PORT]
[root@localhost ~]# iptables -t nat -A PREROUTING -s 0/0 -d 172.18.100.6 -p tcp --dport 22 -j DNAT --to-destination 10.0.1.22
REDIRECT,是NAT表的 target,通过改变目标IP和端口,将接受的包转发至同一个主机的不同端口,可用于PREROUTING OUTPUT链。
iptables -t nat -A PREROUTING -d 172.16.100.10 -p tcp --dport 80 -j REDIRECT --to-ports 8080
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。