防火墙必备指南 --- iptables
Top
目录
- 安装
- 默认表和链
- 启动
- 注意
- 选项
- 匹配规则
- 插入规则
- 删除规则
- 自定义链
- 命令示例
- 拒绝进入防火墙的所有ICMP协议数据包
- 丢弃从外网接口(eth1)进入防火墙本机的源地址为私网地址的数据包
- 封堵网段(192.168.1.0/24),两小时后解封
- 只允许管理员从202.13.0.0/16网段使用SSH远程登录防火墙主机。
- 禁止其他主机ping防火墙主机,但是允许从防火墙上ping其他主机
- 禁止转发来自MAC地址为00:0C:29:27:55:3F的和主机的数据包
- 允许防火墙本机对外开放TCP端口20、21、25、110以及被动模式FTP端口1250-1280
- 禁止转发源IP地址为192.168.1.20-192.168.1.99的 TCP 数据包。
- 只开放本机的web服务(80)、FTP(20、21、20450-20480),放行外部主机发住服务器其它端口的应答数据包,将其他入站数据包均予以丢弃处理。
- 给数据包打标价
- 端口转发
- 地址转换
- 黑白名单
- 配置保存
- python 操作 iptables
安装
yum install iptables-services
yum install iptables
默认表和链
数据包流程图
启动
systemctl start iptables
systemctl status iptables
注意
重启防火墙将丢失现有的所有配置, 则需重新导入配置
# 需要明确的一点就是:当一条规则中有多个匹配条件时,这多个匹配条件之间,默认存在”与”的关系
-i 选项只能用于PREROUTING链、INPUT链、FORWARD链,那么 -o 选项只能用于FORWARD链、OUTPUT链、POSTROUTING链
使用 --dport 选项时,必须事先指定了使用哪种协议,即必须先使用 -p 选项
选项
-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 报文格式
TCP 的三次握手
# 在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
# 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