iptables
iptables不是服务,单有服务脚本,service iptables status ,服务脚本的主要作用在于管理保存的规则。装载及移除iptables/netfilter相关的内核模块:iptables_nat,iptables_filter,iptables_mangle,iptables_raw,ip_nat,ip_conntrack
规则:匹配标准,处理动作
iptables [ -t TABLE ] COMMAND CHAIN [num] 匹配条件 -j 处理办法
★TABLE:4表
filter:过滤,省略时默认为filter。
nat:地址转换
mangle:拆包,修改数据再封装
raw:关闭nat表上的连接追踪机制
优先级:raw-》mangle-》nat-》filter
★CHAIN:5规则链(当作为主机防火墙时,过滤包都可以在FORWARD链上做)
过滤:filter表
INPUT,OUTPUT,FORWARD:
地址转换:nat表
PREOUTING:进 POSTROUTING:出 OUTPUT:
其他处理:mangle表,可以拆包,修改包中其他数据
INPUT,OUTPUT,FORWARD,PREROUTING,POSTROUTING
原始格式:raw表,将包恢复到原始情况
PREROUTING,OUTPUT
同类规则,匹配范围小的放上面
不同类规则,匹配到报文频率较大的放上面
将可由一条规则描述的多条规则合并为一个
设置默认策略
★COMMAND:命令
管理规则:
-A:附加一条规则,添加在链的尾部
-I CHAIN[num]:插入一条规则,插入为对应CHAIN上的第num条,num省略表示第一条
-D CHAIN[num]:删除指定链中的第num条规则
-R CHAIN[num]:替换指定的规则
管理链:这里面所有的规则都可以-t指定表,不指定默认是filter;同样可以指定链,不指定代表所有。
-F [CHAIN]:flush,清空指定规则链,如果省略CHAIN,则可以实现删除对应表中的所有链
1 | [root@ test ~] # iptables -F |
-P CHAIN:设定指定链的默认策略ACCEPT,DROP,REJECT
1 | [root@ test ~] # iptables -P FORWARD DROP |
-N:自定义一条空链
1 | [root@ test ~] # iptables -N new_chain |
-X:删除一条自定的空链,centos7默认会有很多自定义链,可以直接删除
1 | [root@ test ~] # iptables -X |
-Z:置零指定链中所有规则的计数器
1 | [root@ test ~] # iptables -Z |
-E:重命名自定义的链,正在使用的链无法改名无法删除
1 | [root@ test ~] # iptables -E new_chain old_chain |
查看类:
-L:显示指定表中的规则
-n:以数字格式显示主机地址和端口号
-v:显示链及规则的详细信息
-vv:更详细
-vvv:更更详细
-x:在详细显示时,显示精确值
--line-numbers:显示规则号码
1 | [root@ test ~] # iptables -L -n -v -x --line-numbers |
★匹配条件:
通用匹配:自身就可以完成的匹配
-s | --src 1.1.1.1:指定源地址
-d | --dst 1.1.1.1:指定目标地址
-p {tcp|udp|icmp}:指定协议
-i 进接口:指定数据报文流入的接口,lo代表环回口,可以用于定义标准的链,PREOUTING,INPUT,FORWARD
-o 出接口:指定数据报文流出的接口,lo代表环回口,可以用于定义标准的链,POSTROUTING,OUTPUT,FORWARD
扩展匹配:需要依靠扩展模块来完成的匹配
隐含扩展:不用特别指明由哪个模块进行的扩展,因此此时可以使用-p {tcp|udp|icmp}
-p tcp
--sport PORT[-PORT]:源端口,或连续源端口
--dport PORT[-PORT]:目标端口
--tcp-flags mask comp:comp表中出现的标识位必须为1,comp没有而mask有的必须为0.例如,--tcp-flags SYN,FIN,ACK,RST SYN 代表SYN必须为1,其他必须为0,这条规则可以简写为--syn,tcp三次握手中的第一次。
-p icmp
--icmp-type 0:echo-reply,应答报文,在INPUT表中就代表"对端回应"的报文;在OUTPUT表中就代表"回应对端"的报文。
--icmp-type 8:echo-request,请求报文,在INPUT表中就代表"对端请求"的报文;在OUTPUT表中就代表"请求对端"的报文;
(出8进0代表ping出去的一对;进8出0代表对端请求的一对)
-p udp
--sport
--dport
显示扩展:使用额外的匹配机制;必须指明由哪个模块进行的扩展,在iptables中使用-m选项可完成此功能
-m 扩展模块 --spec-opttions
state:状态扩展,结合ip_conntrack追踪会话的状态.
--state NEW:新连接请求
--state ESTABLISHED:已建立的连接
--state INVALID:非法连接请求
--state RELATED:相关联的
/proc/sys/net/nf_conntrack_max:调整链接追踪功能所能够容纳的最大连接数量
/proc/net/nf_conntrack:已经追踪并记录下的连接
/proc/sys/net/netfilter:不同协议或连接类型追踪时长
multiport:离散多端口匹配扩展
--source-ports:源端口集合,用逗号分开
--destination-ports:目标端口集合,用逗号分开
--ports:端口集合,用逗号隔开
iprange:ip地址组
--src-range:源IP集合,用横杠相连
--dst-range:目的IP集合,用横杠相连
(例,-m iprange --src-range 1.1.1.1-1.1.1.100)
connlimit:单个ip连接数限制
--connlimit-above #:连接数量超过多少个,通常加上!取反
--connlimit-upto #:连接数量少于等于多少个
limit:限制连接数
--limit [/second|/minute|/hour|/day]:限制每秒/分/时/天的连接数
--limit-burst:限制单次最大连接数
string:字符串过滤
--algo {bm|kmp} --string "STRING":选择一种算法,过滤STRING字符串
time:根据报文到达的时间与指定的时间范围进行匹配
--timestart 00:00 :起始时间
--timestop 23:59 :结束时间
recent:安全模块,可以限制暴力破解密码
--name:设定匹配的列表名称
--rsource:匹配源地址,默认选项
--rdest:匹配目的地址
--seconds:在多长时间内
--hitcount:匹配到的次数
--set:将匹配到的内容加入列表
--rcheck:从第一个匹配到的地址开始计算时间,检查
--update:从最后一个匹配到的地址计算时间,检查
--remove:在列表里删除相应地址,后跟列表名称及地址
(例:设定表明为SSS,单个ip30秒内超过5次ssh就拒绝。
iptables -A INPUT -p tcp --dport 22 -m recent --name SSS --set
iptables -A INPUT -p tcp --dport 22 -m recent --seconds 30 -hitcount 5 --name SSS --recheck -j DROP)
★处理办法
-j :
ACCEPT:允许通过
DROP:丢弃
REJECT:拒绝
DNAT:目标地址转换
--to-destination 1.1.1.1[:port]:把目的地址转换为1.1.1.1,或者转换成另一个端口,PNAT,port nat
SNAT:源地址转换
--to-source 1.1.1.1[-1.1.1.5]:把源地址转换为1.1.1.1,或者是一个地址范围
MASQUERADE:动态的转换成某个地址,效率低
REDIRECT:端口重定向
MASQUERADE:地址伪装
LOG:记录日志信息,不做放行或丢弃处理
--log-prefix “STRING”:记录日志时添加前缀(例:记录ping包:iptables -I INPUT -d 192.168.1.2 -p icmp -j LOG --log-prefix "----------")
装载模块: modprobe nf_conntrack_ftp
■允许1.1.1.1主机到2.2.2.2主机的ssh访问
iptables -A INPUT -s 1.1.1.1 -d 2.2.2.2 -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -s 2.2.2.2 -s 1.1.1.1 -p tcp --sport 22 -j ACCEPT
■只允许从eth0接口进来的ping请求
iptables -A INPUT -i eth0 -j ACCEPT
iptables -A OUTPUT -o eth0 -j ACCEPT
■允许9000和10000到11000的多端口
iptables -A INPUT -p tcp -m multiport --sports 9000,1000:11000 -j ACCEPT
iptables -A OUTPUT -p tcp -m multiport --dports 9000,1000:11000 -j ACCEPT
■允许1.1.1.1到1.1.1.10访问
iptables -A INPUT -m iprange --src-range 1.1.1.1-1.1.1.10 -j ACCEPT
iptables -A OUTPUT -m iprange --dst-range 1.1.1.1-1.1.1.10 -j ACCEPT
■不允许任何人请求带有SOS字符串的网页
iptables -A OUTPUT -m string --algo bm --string 'SOS' -j REJECT
■限制主机22点到24点不许访问
iptables -A INPUT -m time --timestart 22:00 --timestop 23:59 -j REJECT
■单个ip访问网页限制两个连接
iptables -A INPUT -p tcp --dport 80 -m connlimit ! --connlimit-above 2 -j ACCEPT
■一分钟允许ping5次
iptables -A INPUT -d 1.1.1.1 -p icmp -m limit --limit-burst 5 --limit 5/minute -j ACCEPT
■使用连接追踪来放行21,22和80端口
iptables -A INPUT -d 1.1.1.1 -m state --state RELATED,ESTABLISHED -j ACCEPT #放在第一条做优化匹配
iptables -A INPUT -d 1.1.1.1 -p tcp -m multiport --dports 21,22,80 -m state --state NEW -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT #任何已经连接的都放行
■打开防火墙的转发功能
临时:echo 1 > /proc/sys/net/ipv4/ip_forward
永久:vim /etc/sysctl.conf 将下面改成1 net.ipv4.ip_forward = 1 之后sysctl -p
■保存配置:
service iptables save:保存在/etc/sysconfig/iptables
iptables-save > /aaaa.iptables:将配置保存至指定位置
iptables-restore < /aaaa.iptables:读取配置
■ip_conntrack:此模块是用来确定有请求才给回复的,防止服务器中毒后,自己给某个地址发报文。开启此模块后会生成一个连接表/proc/net/ip_conntrack,每一个连接都会记录,最大连接数在/proc/sys/net/ipv4/ip_conntrack_max下。由于这些记录都在内存中,所以当连接数大时,非常耗资源。
■条件取反可以使用! 例:-s !1.1.1.1
■自定义链的调用和返回
iptables -N NEW_CHAIN ##生成一个新链
iptables -A NEW_CHAIN -j DROP ##给链添加规则
iptables -A NEW_CHAIN -j RETURN ##当链没有匹配到的时候返回主链
iptables -A INPUT -j NEW_CHAIN ##在主链中调用新链
■利用防火墙抵御DOS攻击
iptables -I INPUT -d 192.168.1.2 -p tcp --dport 22 -m state --state NEW -m recent --set --name SSHH #设定表名并记录
iptables -I INPUT 2 -d 192.168.1.2 -p tcp --dport 22 -m state --state NEW -m recent --update --second 30 --hitcount 3 --name SSHH -j DROP #30秒内超过3次登陆就锁定
■源地址转换(内网上网)
iptables -t nat -A POSTROUTING -s 内网地址 ! -d 内网地址 -j SNAT --to-source 出口ip
iptables -t nat -A POSTROUTING -s 内网地址 ! -d 内网地址 -j MASQUERADE (地址伪装,当没有固定ip上网时使用)
■目标地址转换(外网访问内网)
iptables -t nat -A PREROUTING -d 出口ip -p tcp|udp --dport 端口 -j DNAT --to-destination 内网ip[:端口]
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能