OpenWrt防火墙简介

OpenWrt是一款基于Linux的开源路由器操作系统,它内置了一个名为fw3的防火墙管理工具,它基于iptables和Netfilter技术,提供了简单易用的防火墙配置界面。

fw3防火墙配置

fw3的配置文件位于/etc/config/firewall中,通过修改配置文件可以实现防火墙规则的添加、修改和删除等操作。
防火墙重启命令
/etc/init.d/firewall restart 或fw3 reload
配置详解
fw3的规则由三个部分组成,分别是Zone、Rule和Option。

Zone表示网络区域,可以指定某个区域的网络流量需要经过什么样的规则进行处理。fw3内置了几个预定义的Zone,例如lan、wan、guest等,用户也可以自定义Zone。每个Zone都有一个默认的行为,可以是允许、拒绝、重定向等操作。

Rule表示规则,可以指定某个网络流量需要进行何种操作。规则可以基于源地址、目标地址、协议、端口等多个条件进行匹配,匹配成功后可以执行不同的操作,例如允许、拒绝、重定向等操作。

Option表示额外的选项,可以用来进一步配置规则的行为。例如,可以指定规则的优先级、日志级别、连接追踪等选项。

fw3的配置文件的结构如下:

config defaults
    option input 'ACCEPT'
    option output 'ACCEPT'
    option forward 'REJECT'

config zone
    option name 'lan'
    option network 'lan'
    option input 'ACCEPT'
    option output 'ACCEPT'
    option forward 'ACCEPT'

config zone
    option name 'wan'
    option network 'wan'
    option input 'REJECT'
    option output 'ACCEPT'
    option forward 'REJECT'
    option masq '1'
    option mtu_fix '1'

config forwarding
    option src 'lan'
    option dest 'wan'

config rule
    option name 'Allow-DHCP-Renew'
    option src 'wan'
    option proto 'udp'
    option dest_port '68'
    option target 'ACCEPT'
    option family 'ipv4'

config rule
    option name 'Allow-Ping'
    option src 'wan'
    option proto 'icmp'
    option icmp_type 'echo-request'
    option target 'ACCEPT'
    option family 'ipv4'

config rule
    option name 'Allow-SSH'
    option src 'wan'
    option proto 'tcp'
    option dest_port '22'
    option target 'ACCEPT'
    option family 'ipv4'

在这个示例配置中,首先定义了默认行为为输入和输出都允许,但转发拒绝。然后定义了两个Zone,分别是lan和wan。lan区域的流量都允许输入、输出和转发,而wan区域的流量则只允许输出,其他都拒绝。在wan区域中还定义了一些额外的选项,例如masq和mtu_fix,用来进行NAT和MTU修正。

接下来,定义了一个转发规则,将lan区域的流量转发到wan区域。最后,定义了三条规则,分别是允许DHCP续租、允许ping和允许SSH访问。这些规则都是针对wan区域的流量进行匹配和操作的。

什么是iptables

iptables是Linux系统下的一个强大的防火墙工具,用于设置防火墙规则。

iptables命令详解

常见参数

-A:表示在规则链中添加一条规则
例如,iptables -A INPUT表示在INPUT链中添加一条规则。

-p:表示匹配的协议类型,如TCP、UDP等。
例如,iptables -A INPUT -p tcp表示匹配TCP协议的流量。

–dport:表示匹配的目标端口号
例如,iptables -A INPUT -p tcp –dport 80表示匹配目标端口号为80的TCP流量。

-s:表示匹配的源IP地址或地址段
例如,iptables -A INPUT -s 192.168.1.0/24表示匹配源IP地址为192.168.1.0/24的流量。

-d:表示匹配的目标IP地址或地址段
例如,iptables -A INPUT -d 192.168.1.1表示匹配目标IP地址为192.168.1.1的流量。

-j:表示匹配规则后的动作
例如,iptables -A INPUT -j DROP表示匹配后将流量丢弃。

-i:表示匹配的输入接口
例如,iptables -A INPUT -i eth0表示匹配输入接口为eth0的流量。

-o:表示匹配的输出接口
例如,iptables -A OUTPUT -o eth1表示匹配输出接口为eth1的流量。

-m:表示匹配所使用的模块
例如,iptables -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT表示匹配目标端口号为22的TCP流量,并且只接受新连接和已建立的连接。

–state:表示匹配的连接状态
例如,iptables -A INPUT -m state –state RELATED,ESTABLISHED -j ACCEPT表示匹配已建立或相关的连接,并接受这些流量。

-t:表示指定表
iptables支持多个表,如filter、nat、mangle等。例如,iptables -t nat -A PREROUTING -p tcp –dport 80 -j REDIRECT –to-port 8080表示在nat表的PREROUTING链上匹配目标端口为80的TCP流量,并将其重定向到端口8080。

–to-destination:表示重定向到的目标地址
例如,iptables -t nat -A PREROUTING -p tcp –dport 80 -j DNAT –to-destination 192.168.1.100:8080表示将目标端口为80的TCP流量重定向到192.168.1.100的8080端口。

-N:表示创建一个自定义链
例如,iptables -N MYCHAIN表示创建一个名为MYCHAIN的自定义链。

-P:表示设置默认策略
例如,iptables -P INPUT DROP表示设置默认输入策略为拒绝。

-R:表示替换规则
例如,iptables -R INPUT 1 -p tcp –dport 22 -j ACCEPT表示替换INPUT链中的第一个规则,匹配目标端口为22的TCP流量,并接受这些流量。

iptables表和链

在iptables中,表(table)和链(chain)是两个基本概念,它们用于管理网络数据包的流向和处理。

iptables中包含多个预定义的表,每个表包含不同的链。表和链的组合决定了iptables如何处理网络数据包。常见的表包括filter、nat和mangle,常见的链包括INPUT、OUTPUT、FORWARD、PREROUTING和POSTROUTING。

下面是每个表和链的简要描述:

filter表:
filter表是iptables默认的表,包含三个默认链:INPUT、OUTPUT和FORWARD。这些链用于处理网络数据包的流向。INPUT链用于处理进入本地主机的数据包,OUTPUT链用于处理从本地主机发出的数据包,FORWARD链用于处理从本地主机转发到其他主机的数据包。

nat表:
nat表用于处理网络地址转换(NAT),包含三个默认链:PREROUTING、OUTPUT和POSTROUTING。PREROUTING链用于在数据包路由之前进行NAT,POSTROUTING链用于在数据包路由之后进行NAT,OUTPUT链用于处理从本地主机发出的数据包的NAT。

mangle表:
mangle表用于修改网络数据包的头部信息,包含五个默认链:PREROUTING、OUTPUT、INPUT、FORWARD和POSTROUTING。PREROUTING链用于修改进入本地主机的数据包的头部信息,POSTROUTING链用于修改从本地主机发出的数据包的头部信息,INPUT链用于处理进入本地主机的数据包,OUTPUT链用于处理从本地主机发出的数据包,FORWARD链用于处理从本地主机转发到其他主机的数据包。

raw表:
raw表用于禁用特定协议的连接跟踪,包含两个默认链:PREROUTING和OUTPUT。

iptables SNAT

iptables的nat表中有一个POSTROUTING链,用于处理数据包在路由后离开本机的情况。要实现网络地址转换(NAT),可以使用POSTROUTING链中的MASQUERADE或SNAT选项。

在OpenWrt中,如果要实现MASQUERADE(动态网络地址转换),可以使用以下命令

iptables -t nat -A POSTROUTING -o wan -j MASQUERADE

iptables的nat表中有一个POSTROUTING链,用于处理数据包在路由后离开本机的情况。要实现网络地址转换(NAT),可以使用POSTROUTING链中的MASQUERADE或SNAT选项。

在OpenWrt中,如果要实现MASQUERADE(动态网络地址转换),可以使用以下命令:

iptables -t nat -A POSTROUTING -o wan -j MASQUERADE 这个规则的含义是:在nat表的POSTROUTING链上添加一条规则,将从wan接口出去的数据包的源地址改为本机的IP地址,从而实现动态网络地址转换。

这个规则的具体解释如下:

“-t nat”表示使用nat表。
“-A POSTROUTING”表示在POSTROUTING链的末尾添加规则。
“-o wan”表示匹配从wan接口出去的数据包。
“-j MASQUERADE”表示使用MASQUERADE选项,将数据包的源地址改为本机的IP地址。

这个规则可以使本机上的局域网设备通过WAN接口访问互联网。当局域网设备发送数据包到互联网时,数据包的源地址会被改为本机的IP地址,从而在路由器与互联网之间建立一条NAT转换的映射关系,使局域网设备可以正常访问互联网。

iptables DNAT

iptables的DNAT(Destination NAT)用于将目标IP地址和端口号转换为不同的IP地址和端口号。通常用于将外部访问内部服务的请求导向到内部网络中的某个主机或者端口上。

在OpenWrt中,要实现DNAT,可以使用以下命令:

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:8080

这个规则的含义是:在nat表的PREROUTING链上添加一条规则,将从eth0接口进入的TCP 80端口的数据包的目标地址和端口号修改为192.168.1.100的8080端口。这个规则的具体解释如下:

“-t nat”表示使用nat表。
“-A PREROUTING”表示在PREROUTING链的末尾添加规则。
“-i eth0”表示匹配从eth0接口进入的数据包。
“-p tcp”表示匹配TCP协议的数据包。
“–dport 80”表示匹配目标端口为80的数据包。
“-j DNAT”表示使用DNAT选项。
“–to-destination 192.168.1.100:8080”表示将数据包的目标地址和端口号修改为192.168.1.100的8080端口。
这个规则可以将外部访问本机的TCP 80端口的数据包转发到内部网络中的192.168.1.100的8080端口,使外部用户可以访问内部网络中的某个服务,比如内网搭建了一个web服务,端口为8080端口,可以通过wan口ip访问到该服务,如果设备有公网ip,则可以通过远程访问到内部web服务,实现私有网站的搭建,在家用路由器中该功能叫做虚拟服务器或者DMZ。

iptables配置MSS

iptables的MSS(Maximum Segment Size)规则用于控制TCP数据包的最大分段大小,从而避免网络拥塞和TCP协议的传输性能问题。

在OpenWrt中,可以使用以下命令来实现MSS规则:

iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -o eth0 -j TCPMSS --set-mss 1452

这个规则的含义是:
在mangle表的FORWARD链上添加一条规则,匹配TCP SYN或RST标志,并且从eth0接口出去的TCP数据包,并将TCP数据包的MSS设置为1452。

具体解释如下:

“-t mangle”表示使用mangle表。
“-A FORWARD”表示在FORWARD链的末尾添加规则。
“-p tcp”表示匹配TCP协议的数据包。
“–tcp-flags SYN,RST SYN”表示匹配SYN或RST标志的TCP数据包。
“-o eth0”表示匹配从eth0接口出去的数据包。
“-j TCPMSS”表示使用TCPMSS选项。
“–set-mss 1452”表示将TCP数据包的MSS设置为1452。
这个规则可以避免TCP数据包过大导致网络拥塞和性能问题。MSS规则通常在路由器上设置,以控制网络流量和提高网络性能。

iptables mark

iptables中mark包含数据包的mark和连接跟踪的mark,通过iptables可以设置mark和匹配mark,通过对mark的操作可以实现很多高级功能。 如:

  1. 实现连接负载均衡,多wan口
  2. 实现智能流控
  3. 结合流量识别模块实现应用防火墙

两种mark的区别
数据包的mark是指每个包都可以带不同的mark值,新的数据包需要重新设置,而连接跟踪mark会长期保存,直到该数据流(连接跟踪)释放掉才会清除。

数据包mark 匹配mark
-m mark --mark value[/mask]
mask为可选项, 如果指定了mask,则先将mark值和mask相与后再匹配

iptables -t mangle -A INPUT -m mark --mark 0x2 -j DROP

设置数据包mark
-j MARK --set-mark value

设置连接跟踪mark
-j CONNMARK --set-mark value
数据包mark保存到连接跟踪
-j CONNMARK --save-mark
将连接跟踪的mark恢复到数据包
-j CONNMARK --restore-mark

示例:
匹配数据包mark为2,并将数据包mark保存到连接跟踪中

iptables -t mangle -I POSTROUTING -m mark --mark 2 -j CONNMARK --save-mark 将所有tcp连接的mark恢复到数据包中
iptables -t mangle -I PREROUTING -p tcp -j CONNMARK --restore-mark

iptables规则备份和恢复

备份
其中/tmp/rules为规则保存的文件名

iptables-save > /tmp/rules

恢复

iptables-restore < /tmp/rules
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。