防火墙必备指南

image

安装 yum install iptables-services yum install iptables 默认表和链

image

数据包流程图

image

image

启动 systemctl start iptables systemctl status iptables 注意 重启防火墙将丢失现有的所有配置, 则需重新导入配置 # 需要明确的一点就是:当一条规则中有多个匹配条件时,这多个匹配条件之间,默认存在”与”的关系 -i 选项只能用于PREROUTING链、INPUT链、FORWARD链,那么 -o 选项只能用于FORWARD链、OUTPUT链、POSTROUTING链 使用 --dport 选项时,必须事先指定了使用哪种协议,即必须先使用 -p 选项

image

选项 -A 在指定链的末尾添加(append)一条新的规则 -D 删除(delete)指定链中的某一条规则,可以按规则序号和内容删除 -I 在指定链中插入(insert)一条新的规则,默认在第一行添加 -R 修改、替换(replace)指定链中的某一条规则,可以按规则序号和内容替换 -L 列出(list)指定链中所有的规则进行查看 -E 重命名用户定义的链,不改变链本身 -F 清空(flush) -N 新建(new-chain)一条用户自己定义的规则链 -S 显示 默认策略 -X 删除指定表中用户自定义的规则链(delete-chain) -P 设置指定链的默认策略(policy) -Z 将所有表的所有链的字节和数据包计数器清零 -n 使用数字形式(numeric)显示输出结果 -v 查看规则表详细信息(verbose)的信息 -V 查看版本(version) -h 获取帮助(help) -s : 源 IP -d : 目的 IP -t : 指定数据包处理过滤表 -p : 协议类型 -m : 表示用什么模块来匹配 -i (--in-interface) : 网络设备器接入端口名称 -o (--out-interface) :网络设备器发送端口名称 --line-numbers: 显示序号 , 缩写为: --line -j : 指定数据包处理方式: 或者指向自定义链 # ACCEPT 允许数据包通过 # DROP 直接丢弃数据包,不给任何回应信息 # REJECT 拒绝数据包通过,必要时会给数据发送端一个响应的信息。 # LOG在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则 --dport: 目的端口 # --dport 20:3000 --dports: -f : 匹配第二个及后面被分片的数据 -m multiport: 表示指定多个端口 # -m multiport --dport 20,21,25,110,1250:1280 # 表示请求端口为3326,3327,3328 # -m multiport --destination-ports 3326,3327,3328 --mac-source :源Mac 地址 -m mac :表示指定 Mac 地址 # -m mac --mac-source 00:0c:29:27:55:3F --src-range : 源 IP 范围 -m –iprange : 表示指定 IP 范围 # -m iprange --src-range 192.168.1.20-192.168.1.99 -m state : 表示指定数据包的状态, NEW,ESTABLISHED,RELATED,INVALID # NEW:建立链接的数据包 # ESTABLISHED:经过已经建立的链接通道传输的数据包 # RELATED:与已经建立的链接相关的数据包,如ICMP错误数据包 # INVALID:没法识别的数据包 # -m state --state NEW : 表示任何无连接的新的数据包, 新的链接 # -m state --state ESTABLISHED,RELATED : 容许数据对本机的回应信息 -m limit : 表示限制收发包速率 -m limit --limit 100/s : 当每秒包个数大于100时,拒绝全部链接 # TCP 协议显示[6 个标志位: SYN、ACK、FIN、RST、URG、PSH] -p tcp --tcp-flags SYN,ACK,FIN,RST RST 匹配规则 基本匹配条件 # 匹配 IP 地址 : -s -d 与-s选项一样,-d选项也可以使用”叹号”进行取反,也能够同时指定多个IP地址,使用”逗号”隔开即可 注意,不管是-s选项还是-d选项,取反操作与同时指定多个IP的操作不能同时使用 可指定网段 可指定多个IP , 之间用 逗号分隔 # 匹配协议: -p centos6中,-p选项支持如下协议类型 tcp, udp, udplite, icmp, esp, ah, sctp centos7中,-p选项支持如下协议类型 tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh 当不使用-p指定协议类型时,默认表示所有类型的协议都会被匹配到,与使用-p all的效果相同。 # 匹配端口: --sport 和 --dport # 匹配网卡: -i -o # 匹配扩展模块: -m 扩展匹配条件 在使用扩展匹配条件之前,需要指定相应的扩展模块才行 当使用-p选项指定了报文的协议时,如果在没有使用-m指定对应的扩展模块名称的情况下,使用了扩展匹配条件, iptables默认会调用与-p选项对应的协议名称相同的模块 # 匹配端口: --sport --dport , 默认扩展模块为对应的协议名称相同的模块 -p tcp -m tcp --dport 22 # 借助tcp扩展模块的--sport或者--dport都可以指定一个连续的端口范围,但是无法同时指定多个离散的、不连续的端口 ! --dport 22 # 表示目标端口不是22的报文将会被匹配到 --dport 22:25 # 表示目标端口为22到25之间的所有端口 --dport :22 # 表示匹配0号到22号之间的所有端口 --dport 80: # 表示匹配80号端口以及其以后的所有端口(直到65535) 扩展模块 --- multiport # 指定多个离散的端口: 借助扩展模块: multiport , 同时也可指定连续的端口范围 -p tcp -m multiport --dport 22,55,77 -p tcp -m multiport --dport 22,80:2000 -p TCP -m multiport --dports 22,80,443,30000:50000 -j ACCEPT 注意: multiport扩展只能用于tcp协议与udp协议,即配合 -p tcp或者 -p udp 使用 扩展模块 --- iprange 可以指定"一段连续的IP地址范围",用于匹配报文的源地址或者目标地址 可使用两个扩展匹配条件为: --src-range ; --dst-range -m iprange --src-range 172.16.10.10-172.16.10.200 同样能够使用 "!" 取反 扩展模块 --- string 指定要匹配的字符串,如果报文中包含对应的字符串,则符合匹配条件 --algo:用于指定匹配算法,可选的算法有bm与kmp,此选项为必须选项,我们不用纠结于选择哪个算法,但是我们必须指定一个 --string:用于指定需要匹配的字符串 -m string --algo bm --string "xxdd" # -–algo bm 表示使用bm算法去匹配指定的字符串, --string "xxdd" 则表示我们想要匹配的字符串为"xxdd" -p TCP -m string --string "HelloWorld" --algo kmp -j DROP 扩展模块 --- time 根据时间段区匹配报文,如果报文到达的时间在指定的时间范围以内,则符合匹配条件 -m time --timestart 09:00:00 --timestop 18:00:00 # --timestart选项用于指定起始时间, --timestop 选项用于指定结束时间 -p TCP -m time --timestart 4:00 --timestop 5:00 -j DROP # -m time --weekdays 6,7 # 表示匹配周六日 -m time --monthdays 22,23 # 表示指明每月的22号,23号 -m time --datestart 2022-3-10 --datestop 2022-5-10 # 指定具体的日期范围 注意: 上述选项中, --monthdays 与 --weekdays 可以使用 "!" 取反, 其他选项不能取反 # 必须使用UTC时间 1.UTC 东零区 2.UTC+8 东八区 3.我们比UTC快了八个小时 4.所以需要减8才得到我们现在时间 扩展模块--- state "连接" 其中的报文可以分为5种状态,报文状态可以为NEW、ESTABLISHED、RELATED、INVALID、UNTRACKED -m state : 表示指定数据包的状态, NEW,ESTABLISHED,RELATED,INVALID # NEW:建立链接的数据包 # ESTABLISHED:经过已经建立的链接通道传输的数据包 # RELATED:与已经建立的链接相关的数据包,如ICMP错误数据包, 或者 FTP 协议的数据进程关联命令进程 # INVALID:一个包没有办法被识别,或者这个包没有任何状态 # UNTRACKED: 表示报文未被追踪,当报文的状态为Untracked时通常表示无法找到相关的连接 # -m state --state NEW : 表示任何无连接的新的数据包, 新的链接 # -m state --state ESTABLISHED,RELATED : 容许数据对本机的回应信息 扩展模块--- tcp # --tcp-flags # 匹配第一次握手 iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j REJECT iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags ALL SYN -j REJECT # 匹配第二次握手 iptables -t filter -I OUTPUT -p tcp -m tcp --sport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN,ACK -j REJECT iptables -t filter -I OUTPUT -p tcp -m tcp --sport 22 --tcp-flags ALL SYN,ACK -j REJECT # --syn # 匹配第一次握手 ; 等价于"–tcp-flags SYN,RST,ACK,FIN SYN" iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --syn -j REJECT TCP 报文格式

image

TCP 的三次握手

image

image

# 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认; 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态; 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。 完成三次握手,客户端与服务器开始传送数据,在上述过程中,还有一些重要的概念: # 1. 半连接队列:在三次握手协议中,服务器维护一个半连接队列,该队列为每个客户端的SYN包(syn=j)开设一个条目,该条目表明服务器已收到SYN包,并向客户发出确认,正在等待客户的确认包。这些条目所标识的连接在服务器处于Syn_RECV状态,当服务器收到客户的确认包时,删除该条目,服务器进入ESTABLISHED状态。 backlog参数:表示未连接队列的最大容纳数目。 # 2. SYN-ACK 重传次数 服务器发送完SYN-ACK包,如果未收到客户确认包,服务器进行首次重传,等待一段时间仍未收到客户确认包,进行第二次重传,如果重传次数超过系统规定的最大重传次数,系统将该连接信息从半连接队列中删除。注意,每次重传等待的时间不一定相同。 # 3. 半连接存活时间:是指半连接队列的条目存活的最长时间,也即服务从收到SYN包到确认这个报文无效的最长时间,该时间值是所有重传请求包的最长等待时间总和。有时我们也称半连接存活时间为Timeout时间、SYN_RECV存活时间。 # 各标志位详解 1.紧急 URG:它告诉系统此报文段中有紧急数据,应尽快传送,而不要按原来的排队顺序来传送 2.确认 ACK:当ACK=1的时候,确认号有效,建立连接之后所有的ack都应设置为1 3.推送 PSH (Push):当PSH =1的时候,表示该报文段高优先级,接收方 TCP 应该尽快推送给接收应用程序,而不用等到整个TCP缓存都填满了后再交付。 4.复位 RST (Reset):当 RST = 1 的时候,表示 TCP 连接中出现严重错误,需要释放并重新建立连接。 5.同步 SYN (SYNchronization)[同步序列编号]:当 SYN = 1 的时候,表明这是一个请求连接报文段。一般称携带 SYN 标志的 TCP 报文段为「同步报文段」。在 TCP 三次握手中的第一个报文就是同步报文段,在连接建立时用来同步序号。对方若同意建立连接,则应在响应的报文段中使 SYN = 1 和 ACK = 1。 6.终止 FIN (Finis):当 FIN = 1 时,表示此报文段的发送方的数据已经发送完毕,并要求释放 TCP 连接。一般称携带 FIN 的报文段为「结束报文段」。在 TCP 四次挥手释放连接的时候,就会用到该标志 TCP 的四次挥手 当被动方收到主动方的FIN报文通知时,它仅仅表示主动方没有数据再发送给被动方了。但未必被动方所有的数据都完整的发送给了主动方,所以被动方不会马上关闭SOCKET,它可能还需要发送一些数据给主动方后,再发送FIN报文给主动方,告诉主动方同意关闭连接,所以这里的ACK报文和FIN报文多数情况下都是分开发送的。  1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。  2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。  3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。  4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手 扩展模块--- icmp ICMP报文类型 # 注意: 名称中的"空格"需要替换为 "-" 。 # 例如: 0/0 : echo-reply 8/0 : echo-request

image

# ICMP 协议限制; 发出的ping请求属于类型8的icmp报文,而对方主机的ping回应报文则属于类型0的icmp报文) -p icmp -m icmp --icmp-type 8/0 # 表示 icmp报文的 type为 8,code为 0 才会被匹配到 # 因为 type 为8的类型下只有一个code为0的类型,所以我们可以省略对应的code -p icmp --icmp-type 8 # 除了能够使用对应type/code匹配到具体类型的icmp报文以外,我们还能用icmp报文的描述名称去匹配对应类型的报文 -p icmp --icmp-type echo-request # 与 --icmp-type 8/0 的效果完全相同. -p icmp --icmp-type Echo-Reply -p icmp --icmp-type destination-Unreachable # 用法: --icmp-type {type[/code]|typename} echo-request (8) 请求; 我可以ping别人 echo-reply (0) 回应; 别人可以ping我 扩展模块--- connlimit 可以限制每个IP地址同时链接到server端的链接数量,注意:我们不用指定IP,其默认就是针对”每个客户端IP”,即对单IP的并发连接数限制。 -p TCP --dport 22 -m connlimit --connlimit-above 2 -j DROP # 主机连接最多有2个 扩展模块--- limit 限制单位时间内流入的包的数量; 可以以秒为单位进行限制,也可以以分钟、小时、天作为单位进行限制 # 外部主机对本机进行ping操作时,本机最多每6秒中放行一个ping包 iptables -A INPUT -p icmp -m limit --limit 30/minute -j ACCEPT # 限制速率在500k/s左右 iptables -t filter -A OUTPUT -p TCP -m limit --limit 333/s -j ACCEPT ## 操作规则 # 主要则是对规则的增删改查 插入规则 # 插入第二条规则, iptables -I INPUT 2 -s 172.16.90.191 -p tcp --dport 22 -j ACCEPT 删除规则 # 1. 根据行号删除, iptables -t filter -D INPUT 2 # 在每个链中行号为从上往下升序 # 2. 根据匹配规则删除 官方文档中采用的的精确匹配删除。所以你不能只制定一个筛选条件。必须给出规则的每一个细节,和你当初添加该规则时一样,和添加动作唯一不同的是,你要把-A改成-D。这种精确匹配删除的成功依赖的就是用户提供的所有match字段,target字段必须和内核中保存的一模一样,精确到字节级别的匹配。如果哪怕有一个字节不匹配,就会有二义性,删除失败 # 清空 iptables -t filter -F 自定义链 # 创建 iptables -t filter -N ssh # 挂载 iptables -I INPUT -p tcp --dport 22 -j ssh # 重命名自定义链 iptables -t filter -E ssh new_ssh # 删除自定义链 iptables -X new_ssh 使用"-X"选项可以删除自定义链,但是删除自定义链时,需要满足两个条件: 1、自定义链没有被任何默认链引用,即自定义链的引用计数为0。 2、自定义链中没有任何规则,即自定义链为空。 ## 执行动作 拒绝动作 -- reject # 在拒绝时设置提示信息 --reject-with; 会提示对方为什么被拒绝。 可用值如下: icmp-net-unrechable icmp-host-unreachable icmp-port-unreachable, icmp-proto-unreachable icmp-net-prohibited icmp-host-pro-hibited icmp-admin-prohibited # 当不设置任何值时,默认值为 icmp-port-unreachable, 表示端口不可达 iptables -I INPUT 2 -j REJECT --reject-with icmp-host-unreachable 丢弃动作 -- Drop 待更新... 通过接受动作 -- ACCEPT 待更新... 记录日志动作 使用LOG动作,可以将符合条件的报文的相关信息记录到日志中, # LOG动作只负责记录匹配到的报文的相关信息,不负责对报文的其他处理,如果想要对报文进行进一步的处理,可以在之后设置具体规则,进行进一步的处理 # LOG动作默认会将报文的相关信息记录在/var/log/message文件中 # LOG动作常用选项如下: –log-level # 指定记录日志的日志级别,可用级别有emerg,alert,crit,error,warning,notice,info,debug。 –log-prefix # 给记录到的相关信息添加”标签”之类的信息,以便区分各种记录到的报文信息,方便在分析时进行过滤。 # 注:–log-prefix对应的值不能超过29个字符。     0: emerg     1: alert     2: crit     3: err     4: warning     5: notice     6: info     7: debug # 修改记录日志文件 1. vim /etc/rsyslog.conf 2. kern.warning /var/log/iptables.log 3. service rsyslog restart # 重启rsyslog服务(或者syslogd) # 命令示例 iptables -I INPUT 1 -p tcp --dport 22 --state NEW --log-prefix "fdfdfd" -j ssh iptables -I INPUT 1 -p tcp --dport 20,21,22,67,68,69,80,443 -j LOG iptables -I INPUT 1 -p tcp -m multiport --dport 67,68 -j LOG --log-prefix "Iptables-DHCP-IN:" --log-level 4 # 使 messages 记录日志生效 service rsyslog restart 命令示例 拒绝进入防火墙的所有ICMP协议数据包 iptables -I INPUT -p icmp -j REJECT # 允许防火墙转发除ICMP协议以外的所有数据包 iptables -A FORWARD -p ! icmp -j ACCEPT # 说明:使用“!”可以将条件取反 丢弃从外网接口(eth1)进入防火墙本机的源地址为私网地址的数据包 iptables -A INPUT -i eth1 -s 192.168.0.0/16 -j DROP iptables -A INPUT -i eth1 -s 172.16.0.0/12 -j DROP iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP 封堵网段(192.168.1.0/24),两小时后解封 iptables -I INPUT -s 10.20.30.0/24 -j DROP iptables -I FORWARD -s 10.20.30.0/24 -j DROP at now 2 hours at> iptables -D INPUT 1 at> iptables -D FORWARD 1 # 说明:这个策略咱们借助crond计划任务来完成,就再好不过了。 只允许管理员从202.13.0.0/16网段使用SSH远程登录防火墙主机。 iptables -A INPUT -p tcp --dport 22 -s 202.13.0.0/16 -j ACCEPT iptables -A INPUT -p tcp --dport 22 -j DROP # 1.允许接收远程主机的SSH请求 iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT # 2.允许发送本地主机的SSH响应 iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT # 说明 -m state: 启用状态匹配模块(state matching module) –-state: 状态匹配模块的参数。当SSH客户端第一个数据包到达服务器时,状态字段为NEW;建立连接后数据包的状态字段都是ESTABLISHED # 使用SSH连接其他远程主机 # 1.送出的数据包目的端口为22 iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT # 2.接收的数据包源端口为22 iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT 禁止其他主机ping防火墙主机,但是允许从防火墙上ping其他主机 iptables -I INPUT -p icmp --icmp-type Echo-Request -j DROP iptables -I INPUT -p icmp --icmp-type Echo-Reply -j ACCEPT iptables -I INPUT -p icmp --icmp-type destination-Unreachable -j ACCEPT 禁止转发来自MAC地址为00:0C:29:27:55:3F的和主机的数据包 iptables -A FORWARD -m mac --mac-source 00:0c:29:27:55:3F -j DROP # 说明:iptables中使用“-m 模块关键字”的形式调用显示匹配。咱们这里用“-m mac –mac-source”来表示数据包的源MAC地址。 允许防火墙本机对外开放TCP端口20、21、25、110以及被动模式FTP端口1250-1280 iptables -A INPUT -p tcp -m multiport --dport 20,21,25,110,1250:1280 -j ACCEPT # 说明:这里用“-m multiport –dport”来指定目的端口及范围 禁止转发源IP地址为192.168.1.20-192.168.1.99的 TCP 数据包。 iptables -A FORWARD -p tcp -m iprange --src-range 192.168.1.20-192.168.1.99 -j DROP # 说明:此处用“-m –iprange –src-range”指定IP范围。 只开放本机的web服务(80)、FTP(20、21、20450-20480),放行外部主机发住服务器其它端口的应答数据包,将其他入站数据包均予以丢弃处理。 iptables -I INPUT -p tcp -m multiport --dport 20,21,80 -j ACCEPT iptables -I INPUT -p tcp --dport 20450:20480 -j ACCEPT iptables -I INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT iptables -P INPUT DROP 给数据包打标价 # 以一例子来说明:公司内网要求192.168.0.100 以内的使用 10.0.0.1 网关上网 (电信),其他IP使用 20.0.0.1 (网通)上网。 # 首先要在网关服务器上添加一个默认路由,当然这个指向是绝大多数的IP的出口网关: ip route add default gw 20.0.0.1 # 通过 ip route 添加一个路由表: ip route add table 3 via 10.0.0.1 dev ethX # ethx 是 10.0.0.1 所在的网卡, 3 是路由表的编号) # 添加 ip rule 规则: ip rule add fwmark 3 table 3 # fwmark 3 是标记,table 3 是路由表3 上边。 意思就是凡事标记了 3 的数据使用 table3 路由表 # 使用 iptables 给相应的数据打上标记 iptables -A PREROUTING -t mangle -i eth0 -s 192.168.0.1 - 192.168.0.100 -j MARK --set-mark 3 端口转发 iptables -t nat -I PREROUTING -p tcp --dport 3389 -j DNAT --to 38.X25.X.X02 iptables -t nat -I POSTROUTING -p tcp --dport 3389 -j MASQUERADE # 配置 63306 转发至 3306 # 先允许数据包转发 echo 1 >/proc/sys/net/ipv4/ip_forward # 允许所有外来的IP访问,慎用 iptables -t nat -A PREROUTING -p tcp -m tcp --dport 63306 -j DNAT --to-destination 127.0.0.1:3306 # 限制单个来源IP iptables -t nat -R PREROUTING 4 -s 192.168.40.154 -p tcp -m tcp --dport 63306 -j DNAT --to-destination 127.0.0.1:3306 # 要求访问服务器的8080端口转发至80端口 iptables -t nat -A PREROUTING -p TCP --dport 8080 -j REDIRECT --to-port 80 iptables -t nat -A PREROUTING - -i eth1 -p tcp -m multiport --dports 80,82 -j REDIRECT --to-ports 80 地址转换 动作选项 解释
redirect   将数据包重定向到另一台主机的某个端口,通常用实现透明代理和对外开放内网某些服务。  
snat   源地址转换,改变数据包的源地址  
dnat   目的地址转换,改变数据包的目的地址  
masquerade   IP伪装,只适用于ADSL等动态拨号上网的IP伪装,如果主机IP是静态分配的,就用snat  
PRERROUTING:DNAT 、REDIRECT (路由之前)只支持-i,不支持-o。在作出路由之前,对目的地址进行修改 POSTROUTING:SNAT、MASQUERADE (路由之后)只支持-o,不支持-i。在作出路由之后,对源地址进行修改 OUTPUT:DNAT 、REDIRECT (本机)DNAT和REDIRECT规则用来处理来自NAT主机本身生成的出站数据包. # 要实现nat,要将文件/proc/sys/net/ipv4/ip_forward内的值改为1,(默认是0)。 # DNAT :目的nat 做智能DNS时会用到 在路由之前所有从eth0(内网卡)进入的目的端口为53的数据包,都发送到1.2.3.4这台服务器解析 iptables -t nat -I PREROUTING -i eth0 -p udp --dport 53 -j DNAT --to-destination 1.2.3.4:53 iptables -t nat -I PREROUTING -i eth0 -p tcp --dport 53 -j DNAT --to-destination 1.2.3.4:53 # SNAT :一般正常共享上网都用的这个。 所有从eth0(外网卡)出来的数据包的源地址改成61.99.28.1(这里指定了一个网段,一般可以不指定) iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to 61.99.28.1 # MASQUERADE iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o enp0s3 -j MASQUERADE iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE 黑白名单 如果使用白名单机制,我们就要把所有人都当做坏人,只放行好人。 如果使用黑名单机制,我们就要把所有人都当成好人,只拒绝坏人。 # 将INPUT链的默认策略设置为了ACCEPT,同时又使用了白名单机制 先将INPUT链的默认策略设置为ACCEP,然后继续配置需要放行的报文的规则,如下图所示,当所有放行规则设置完成后,在INPUT链的尾部,设置一条拒绝所有请求的规则。好处是: 即使我们误操作,执行了”iptables -F”操作,也能保证管理员能够远程到主机上进行维护,因为默认策略仍然是ACCEPT 配置保存 注意:iptables-save是连在一起的,是一个命令,不是参数 iptables-save 仅仅是列出当前设置,并不是将配置保存 # 若你用的是 RedHat 系列,应该使用: service iptables save 保存,用 chkconfig iptables on 实现开机启动启用 # 若不是 RedHat 系列,可以使用下面方法手动保存/恢复配置 iptables-save > /root/iptables.conf # 保存 iptables-restore < /root/iptables.conf # 恢复 更改默认策略 iptables -A INPUT -j DROP iptables -A OUTPUT -j DROP iptables -A FORWARD -j DROP PXE # 首先配置 允许通过 规则 iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -P OUTPUT ACCEPT # 清除所有规则 ipatbles -F # 清除用户自定义的链 iptables -X # 清除当前所有链的计数器 iptables -Z # 允许ssh远程连接端口 # iptables -A INPUT -p tcp --dport 22 -j ACCEPT iptables -I INPUT 1 -d 172.16.1.10 -i eth4 -p tcp --dport 22 -j ACCEPT # 允许网卡回环接口(服务器本机) iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT # 设置DROP掉FORWARD,INPUT链,允许OUTPUT链 iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT # 允许指定网段通过(外网网段与内网网段) iptables -A INPUT -s 172.16.0.0/17 -p all -j ACCEPT iptables -A INPUT -s 172.17.0.0/17 -p all -j ACCEPT # 允许对外提供 http, https 服务 iptables -A INPUT -p tcp --dport 80,443 -j ACCEPT # 允许对外提供 dhcp 服务 iptables -A INPUT -p tcp --dport 67,68 -j ACCEPT # 允许对外提供 ftp 服务 iptables -A INPUT -p tcp --dport 20,21 -j ACCEPT # 允许对外提供 tftp 服务 iptables -A INPUT -p tcp --dport 69 -j ACCEP # 允许 icmp 类型通过(所有 ip 都能ping) iptables -A INPUT -p icmp -m icmp --icmp-type any -j ACCEPT # 允许关联的包通过 (一般应用与ftp) iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 永久保存防火墙配置,预防重启后失效 /etc/init.d/iptables save # 或用重定向方式保存(很少用) iptables-save >/etc/sysconfig/iptables # iptables -I INPUT 1 -p tcp -m multiport --dport 20,21,67,68,69,80,443 -j ACCEPT # 记录日志 iptables -I INPUT 1 -p tcp --dport 20,21,22,67,68,69,80,443 -j LOG iptables -I INPUT 1 -p tcp -m multiport --dport 67,68 -j LOG --log-prefix "Iptables-DHCP-IN:" --log-level 4 # 使 messages 记录日志生效 service rsyslog restart # 允许已经建立tcp连接的包以及该连接相关的包通过。状态防火墙能识别TCP或者UDP会话。非状态防火墙只能根据端口识别,不能识别会话。 iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A log -p udp -m multiport --dport 67,68 -m state --state NEW -j LOG --log-prefix "log-of-dhcp:" --log-level 7 iptables -A log -p tcp -m multiport --dport 80,443 -m state --state NEW -j LOG --log-prefix "log-of-http:" --log-level 7 iptables -A log -p udp --dport 69 -m state --state NEW -j LOG --log-prefix "log-of-tftp:" --log-level 7 iptables -A log -p tcp -m multiport --dport 20,21 -m state --state NEW -j LOG --log-prefix "log-of-ftp:" --log-level 7 iptables -A log -p udp --dport 2049 -m state --state NEW -j LOG --log-prefix "log-of-nfs:" --log-level 7 iptables -A log -p tcp --dport 2049 -m state --state NEW -j LOG --log-prefix "log-of-tcp-nfs:" --log-level 7 第二版 # 首先配置 允许通过 规则 iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -P OUTPUT ACCEPT # 1.删除现有规则 iptables -F # 3.允许远程主机进行SSH连接 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 # 2.配置默认链策略 iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT DROP # 4.允许本地主机进行SSH连接 iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT # 5.允许HTTP请求 iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT 其他 # 配置文件 /etc/sysconfig/iptables # 查看IPtables防火墙策略 iptables -L -n -v # 显示行号 iptables -L -n -v --line-numbers # 清空 IPtables防火墙策略 iptables -F # 查看某一个表的规则列表 iptables -t filter --list -n python 操作 iptables Python-iptables

2025-08-19 19:15 点击量:10