不会使用iptables配置防火墙?看完这篇文章保证你能学会iptables配置方法!

不会使用iptables配置防火墙?看完这篇文章保证你能学会iptables配置方法!

这篇文字有点长,可以先保存下来以后慢慢阅读。有时候稍稍花点时间和耐心学习一下,可以节省以后很多时间。而且也能自我能力的提升。

基础用法

iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> --sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 动作


表名包括:

  • raw:高级功能,如:网址过滤。
  • mangle:数据包修改(QOS),用于实现服务质量。
  • net:地址转换,用于网关路由器。
  • filter:包过滤,用于防火墙规则。

规则链名包括:

  • INPUT链:处理输入数据包。
  • OUTPUT链:处理输出数据包。
  • PORWARD链:处理转发数据包。
  • PREROUTING链:用于目标地址转换(DNAT)。
  • POSTOUTING链:用于源地址转换(SNAT)。

动作包括:

  • ACCEPT:接收数据包。
  • DROP:丢弃数据包。
  • REDIRECT:重定向、映射、透明代理。
  • SNAT:源地址转换。
  • DNAT:目标地址转换。
  • MASQUERADE:IP伪装(NAT),用于ADSL。
  • LOG:日志记录。

参数详细信息

-t<表>:指定要操纵的表;
-A:向规则链中追加条目,追加到链尾部;
-D:从规则链中删除条目,指定规则号或者规则;
-I:向规则链中插入条目,默认插入到第一条;
-R:替换规则链中的条目;
-L:显示规则链中已有的条目;
-F:清除规则链中已有的条目;
-X:清除自定链中的规则;
-Z:清空规则链中的数据包计算器和字节计数器;
-N:创建新的用户自定义规则链;
-P:定义规则链中的默认目标;
-h:显示帮助信息;
-p:指定要匹配的数据包协议类型;
-s:指定要匹配的数据包源ip地址;
-j<目标>:指定要跳转的目标;
-i<网络接口>:指定数据包进入本机的网络接口;
-o<网络接口>:指定数据包要离开本机所使用的网络接口。

详细的iptables使用示例

说明: iptables是以规则链方式组织防火墙策略的,因此配置规则的顺序是影响防火墙策略的重要因素,匹配过程是从第一条规则依次匹配,匹配成功后就会执行对应动作,而不会继续匹配链后面的规则的。

接下来,我们来详细介绍一下iptables配置规则的查询添加删除以及修改的方法。

iptables规则保存与恢复

iptables规则的保存备份以及恢复工作通常是很重要的,一旦出现错误操作导致规则丢失时,可以使用保存下来的备份进行快速恢复。

下面我们看下保存iptables配置规则的命令:

iptables-save > /etc/sysconfig/iptables

恢复配置规则方法:

iptables-restore /etc/sysconfig/iptables

配置自动保存iptables规则

我们可以通过修改/etc/sysconfig/iptables-config文件,设置停机或者重启自动保存iptables规则链:

# Save current firewall rules on stop.
#   Value: yes|no,  default: no
# Saves all firewall rules to /etc/sysconfig/iptables if firewall gets stopped
# (e.g. on system shutdown).
IPTABLES_SAVE_ON_STOP="yes"

# Save current firewall rules on restart.
#   Value: yes|no,  default: no
# Saves all firewall rules to /etc/sysconfig/iptables if firewall gets
# restarted.
IPTABLES_SAVE_ON_RESTART="yes"

查看已添加的iptables规则

查看已有的链规则: iptables -L -n -v

$ iptables -L -n -v
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  304 15200 ACCEPT     all  --  *      *       127.0.0.1            127.0.0.1           
 611K  491M ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
  425 39256 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22
    0     0 DROP       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22 state NEW recent: UPDATE seconds: 60 hit_count: 10 TTL-Match name: SSH side: source mask: 255.255.255.255
  223 13636 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80
  550 31968 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:443
 9971  738K REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DROP       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp flags:!0x17/0x02 state NEW
    0     0 ACCEPT     all  -f  *      *       0.0.0.0/0            0.0.0.0/0            limit: avg 100/sec burst 100
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0            limit: avg 1/sec burst 10
    0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
 491K 1245M ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0

清除已有iptables规则

清除已有iptables规则前,最好进行备份,避免误操作导致规则丢失。

iptables -F  # 清除规则链中已有的条目;
iptables -X  # 清除自定链中的规则;
iptables -Z  # 清空规则链中的数据包计算器和字节计数器;

删除已添加的iptables规则

将所有iptables以序号标记显示,执行:

iptables -L -n --line-numbers

比如要删除INPUT里序号为8的规则,执行:

iptables -D INPUT 8

添加规则:开放指定的端口

添加规则分为两种: 追加插入

  • 追加-A : 表示向链表的尾部追加一条记录。
  • 插入-I : 表示向链表中的指定位置插入一条记录。
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT               #允许本地回环接口(即运行本机访问本机)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT    #允许已建立的或相关连的通行
iptables -A OUTPUT -j ACCEPT         #允许所有本机向外的访问
iptables -A INPUT -p tcp --dport 22 -j ACCEPT    #允许访问22端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT    #允许访问80端口
iptables -A INPUT -p tcp --dport 21 -j ACCEPT    #允许ftp服务的21端口
iptables -A INPUT -p tcp --dport 20 -j ACCEPT    #允许FTP服务的20端口
iptables -A INPUT -j REJECT       #禁止其他未允许的规则访问

插入一条规则:

$ iptables -L -nv --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1     1066 2021K ACCEPT     all  --  *      *       127.0.0.1            127.0.0.1           
2     9138  953K ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
3        7   376 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22
4        0     0 DROP       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22 state NEW recent: UPDATE seconds: 60 hit_count: 10 TTL-Match name: SSH side: source mask: 255.255.255.255
5     1631 97640 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80
6        9  1025 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:443
7       14   724 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

...



$ iptables -I INPUT  -p tcp --dport 21 -j ACCEPT

$ iptables -L -nv --line-numbers
Chain INPUT (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            0.0.0.0/0            tcp dpt:21
2     1066 2021K ACCEPT     all  --  *      *       127.0.0.1            127.0.0.1           
3     9535  995K ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
4        7   376 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22
5        0     0 DROP       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22 state NEW recent: UPDATE seconds: 60 hit_count: 10 TTL-Match name: SSH side: source mask: 255.255.255.255
6     1685  101K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80
7       10  1069 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:443
8       15   776 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
...

修改规则-replace

修改指定规则号(rule-number)的配置规则,以修改端口限制规则为例。

$ iptables -R INPUT 1 -p tcp -m multiport --dport 20,21 -j ACCEPT

$ iptables -L -nv --line-numbers
Chain INPUT (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            0.0.0.0/0            multiport dports 20,21
2     1070 2021K ACCEPT     all  --  *      *       127.0.0.1            127.0.0.1           
3    10800 1144K ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
4        8   436 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22
5        0     0 DROP       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22 state NEW recent: UPDATE seconds: 60 hit_count: 10 TTL-Match name: SSH side: source mask: 255.255.255.255
6     1937  116K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80
7       10  1069 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:443
8       18   940 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
...

复杂规则:使用模块匹配的扩展包功能

使用连接状态跟踪-state

此模块,当与连接跟踪结合使用时,允许访问包的连接跟踪状态。

   --state state
          这里`state`是一个逗号分割的匹配连接状态列表。可能的状态是:`INVALID`(表示包是未知连接),`ESTABLISHED`(表示是双向传送的连接),`NEW`(表示包为新的连接,否则是非双向传送的),而`RELATED`(表示包由新连接开始但是和一个已存在的连接在一起,如FTP数据传送,或者一个ICMP错误。).

允许已建立的或相关连的链接通行

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

使用TCP规则扩展-tcp

-p tcp 被指定,且其他匹配的扩展未被指定时,这些扩展被装载。

tcp提供以下选项:

--source-port [!] [port[:port]] :源端口或端口范围指定。这可以是服务名或端口号。使用格式端口:端口也可以指定包含的(端口)范围。如果首端口号被忽略,默认是"0",如果末端口号被忽略,默认是"65535"。这个选项可以使用 `--sport`的别名。
--destionation-port [!] [port:[port]] :目标端口或端口范围指定。这个选项可以使用 `--dport`别名来代替。
--tcp-flags [!] mask comp : 匹配指定的TCP标记。第一个参数是我们要检查的标记,一个用逗号分开的列表, 第二个参数是用逗号分开的标记表,是必须被设置的。标记如下:SYN ACK FIN RST URG PSH ALL NONE。因此这条命令:iptables -A FORWARD -p tcp --tcp-flags SYN, ACK, FIN, RST SYN只匹配那些SYN标记被设置而ACK、FIN和RST标记没有设置的包。
[!] --syn : 只匹配那些设置了SYN位而清除了ACK和FIN位的TCP包。这些包用于TCP连接初始化时发出请求;例如,大量的这种包进入一个接口发生堵塞时会阻止进入的TCP连接 ,而出去的TCP连接不会受到影响。这等于 --tcp-flags SYN, RST, ACK SYN。如果 "--syn"前面有"!"标记,表示相反的意思。
--tcp-option [!] number : 匹配设置了TCP选项的。

丢弃异常的TCP连接包(可以屏蔽ACK扫描)

iptables -A FORWARD -p TCP ! --syn -m state --state NEW -j DROP

多端口匹配-multiport

这个模块匹配一组源端口或目标端口,最多可以指定15个端口。只能和-p tcp 或者 -p udp 连着使用。

   --source-port [port[, port]]
          如果源端口是其中一个给定端口则匹配

   --destination-port [port[, port]]
          如果目标端口是其中一个给定端口则匹配

   --port [port[, port]]
          若源端口和目的端口相等并与某个给定端口相等,则匹配。

允许防火墙本机对外开放TCP端口20、21、25、110以及被动模式FTP端口1250-1280 :

iptables -A INPUT -p tcp -m multiport --dport 20,21,25,110,1250:1280 -j ACCEPT

使用速率限制-limit

这个模块匹配标志用一个标记桶过滤器一一定速度进行匹配,它和LOG 目标结合使用来给出有限的登陆数.当达到这个极限值时,使用这个扩展 包的规则将进行匹配.

   --limit rate
          最大平均匹配速率:可赋的值有'/second', '/minute', '/hour', or '/day'这样的单位,默认是3/hour。

   --limit-burst number
          待匹配包初始个数的最大值:若前面指定的极限还没达到这个数值,则该数字加1.默认值为5
iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT # 设置ICMP包过滤,允许每秒1个包,限制触发条件是10个包.

限制IP地址范围访问-iprange

此模块可以匹配一个范围IP地址段

   [!] --src-range from[-to]
          Match source IP in the specified range.

   [!] --dst-range from[-to]
          Match destination IP in the specified range.

禁止1.2.3.0-1.2.3.254 地址范围访问22端口:

iptables -A INPUT -p tcp -dport 22 -m iprange --src-range 1.2.3.0-1.2.3.254 -j DROP

连接频率限制-connlimit

限制单个IP的最大连接数,避免连接过多导致服务器压力过大。

   --connlimit-upto n :  匹配连接数小于n的连接
   --connlimit-above n : 匹配连接数大于n的连接
   --connlimit-mask prefix_length : IPv4取值为0-32,IPv6取值范围0-128,不指定默认取最大长度。
   --connlimit-saddr :  应用限制到源IP地址组,不指定`--connlimit-daddr`时使用此选项为默认情况。
   --connlimit-daddr :  应用限制到目标IP地址组
# 限制每个客户端的SSH服务连接数
iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 2 -j REJECT
iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-upto 2 -j ACCEPT

# 限制每个客户端的HTTPS服务连接数
iptables -A INPUT -p tcp --syn --dport 443 -m connlimit --connlimit-above 20 -j REJECT
iptables -A INPUT -p tcp --syn --dport 443 -m connlimit --connlimit-upto 20 -j ACCEPT

记录日志规则配置

LOG 动作这个功能是通过内核的rsyslogd日志工具完成的,LOG现有5个选项:

--log-level

  debug,info,notice,warning,warn,err,error,crit,alert,emerg,panic

--log-prefix

  在记录的信息前加上前缀

--log-tcp-sequence

  把包的TCP序列号和其他的日志信息一起记录下来

--log-tcp-options

  记录TCP包中字段大小不变的选项

--log-ip-options

  记录ip包头中字段大小不变的选项
iptables -I INPUT -p tcp -m tcp --dport 22 -j LOG --log-prefix "iptables:" --log-level warning

配置内核进行日志文件单独输出方法:

新建/etc/rsyslog.d/rsyslog.conf文件,添加内容为:

kern.warning            /var/log/iptables

配置后,重启rsyslog服务:

systemctl restart rsyslog

为了让日志文件可以滚动保存,进行如下配置:

修改文件/etc/logrotate.d/syslog,添加如下:

/var/log/iptables

保存退出即可,默认一个星期滚动一次。

最后

扩展模块还有很多,具体使用时可以查看man iptables-extensions文档了解更多更详细的使用帮助信息。

转载本文时请注明出处及本文链接地址不会使用iptables配置防火墙?看完这篇文章保证你能学会iptables配置方法!

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注