一. 防火墙概述 1. 防火墙简介 Linux防火墙全称:netfilter/iptables netfilter/iptables是unix/Linux(2.4版本内核后)自带的一款优秀且免费的基于包过滤的防火墙工具。 netfilter组件也称为内核空间(kernelspace),是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。 iptables是一种组件工具,也称为用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易。 2. 包过滤防火墙 在网络层对数据包进行控制,主要对数据包所使用的协议、端口、源地址、目标地址等参数来进行过滤。 二. iptables基本概念和使用 1. iptables简介 iptables有3个表: 表名: 包过滤filter 网络地址转换nat 数据包打标记mangle 表动作 INPUT PREROUTING PREROUTING FORWARD POSTROUTING INPUT OUTPUT OUTPUT FORWARD OUTPUT POSTROUTING 2. iptables命令参数 -A 增加一条规则,默认就是在后面增加,append追加 -D 删除 -L 列出规则 -n 以数值显示 -I 在最前面插入规则 -v 显示统计数据,与-L -n一起用,看到的信息更多 -F 清空规则 -t 后接表名 -P policy,默认策略 -p 后接协议名 tcp udp icmp --dport 目标端口 --sport 源端口 -d 目标地址 -s 源地址 -i 接网卡接口, 进入的网卡接口 -o 接网卡接口, 出去的网卡接口 -j 后接动作 动作的分类 ACCEPT 接收数据包 DROP 丢弃数据包 REJECT 拒绝数据包,和DROP的区别就是REJECT会返回错误信息,DROP不会 MASQUEREAD IP地址伪装,使用NAT转换成外网IP,可以PPP拔号(外网IP不固定情况) SNAT 源地址转换,它与MASQUEREAD的区别是SNAT是接一个固定IP DNAT 目标地址转换 LOG 记录日志 iptables -A参数 -p 协议 -j 动作 3. 查看配置规则 iptables -n -v -L --line-number -t filter iptables -n -v -L --line-number -t nat iptables -n -v -L --line-number -t mangle --line-number 可以简写成 --line 如果执行iptables命令时不接 -t 表名,防火阅默认使用filter表 参数说明: -n ip地址以数值显示 -v 详细信息 -L --list,列表 --line-number 规则的行号 --line -t 表,表有:filter、nat、mangle三个表 4. 添加规则 -A 追加规则 -I 在最前面插入 例:对ping的控制 ICMP协议传输过程是双向的,可以对其input或ouput都可以控制 # iptables -A INPUT -p icmp -j REJECT --可以不加-t filter,默认就是对此表进行操作 # iptables -t filter -A INPUT -p icmp -j REJECT --拒绝ping,但别人ping你有返回信息,会告诉他你拒绝了 # iptables -t filter -A OUTPUT -p icmp -j REJECT --拒绝ping,但你ping出去时会返回信息,会告诉你拒绝ping # iptables -t filter -A INPUT -p icmp -j DROP --拒绝ping,无论是你ping出去,还是别人ping进来都没有返回信息 # iptables -t filter -A OUTPUT -p icmp -j DROP --拒绝ping --以上的操作没有写针对谁来控制,默认是所有人 # iptables -t filter -A INPUT -p icmp -s 192.168.1.0/24 -j DROP # iptables -t filter -A OUTPUT -p icmp -d 192.168.1.0/24 -j DROP --这两条其中任意一条都是可以控制192.168.1.0/24这个网段ping不通本机 只允许 192.168.1.70 ping本地,其它都拒绝 # iptables -t filter -A INPUT -p icmp -j REJECT # iptables -t filter -A INPUT -s 192.168.1.70 -p icmp -j ACCEPT --错误写法,因这里是写先拒绝所有,再允许192.168.1.79ping,这是错误的 # iptables -t filter -A INPUT -s 192.168.1.70 -p icmp -j ACCEPT # iptables -t filter -A INPUT -p icmp -j REJECT --正确写法,要先允许谁,再拒绝所有 --如果要把一条规则加到前面,使用 -I参数 # iptables -t filter -A INPUT -p icmp -j REJECT # iptables -t filter -I INPUT -s 192.168.1.70 -p icmp -j ACCEPT --正确写法 # iptables -t filter -I INPUT 2 -s 192.168.1.36 -p icmp -j ACCEPT --把这一条加为第2条(指定数字为第几条) ------------------------------------------------ 规则就是一个访问控制列表(ACL),读取的顺序是从上往下一条一条匹配,匹配一条就不继续往下匹配,所以正确写法应该是把刚才允许192.168.1.70的写到最前面 ----------------------------------------------- 5. 删除规则 方法一: # iptables -t filter -D INPUT -s 192.168.1.35 -p icmp -j ACCEPT --加的时候怎么写,删除时就要怎么写 A 参数换成 D就可以 方法二; # iptables -L -n --line # iptables -D INPUT 2 --在规则比较多或者不好写规则的情况下,可以先用--line或者--line-number列出行号,再用行号删除 方法三: # iptables -t filter -F --直接清空filter表的所有规则 6. 修改规则(用的少) 将第三行规则改为ACCEPT # iptables -R INPUT 3 -j ACCEPT 7. 规则的保存与还原 # /etc/init.d/iptables save --这样是默认保存到/etc/sysconfig/iptables # iptables-save > /etc/sysconfig/iptables --将当前规则保存到这个文件,文件可以自定义 # iptables -F --清空filter表,如果别的表也要清空的话,就加-t 表名都清一次 # iptables-restore < /etc/sysconfig/iptables --把保存的规则还原回去 重启iptables服务,会加载/etc/sysconfig/iptables, 8. 修改默认策略 # iptables -P INPUT DROP --INPUT键默认策略改为DROP,改回来把DROP换成ACCEPT就行了 # iptables -P OUTPUT DROP --OUTPUT键默认策略改为DROP 下面两条定义允许ssh进来 # iptables -A INPUT -p tcp -s 192.168.1.70 --dport 22 -j ACCEPT 进来 协议 从哪来 连接本机的22端口 接受 下面两条定义允许ssh出去 # iptables -A OUTPUT -p tcp -d 192.168.1.70 --sport 22 -j ACCEPT 出去 协议 到哪去 本机的22端口出去 接受 示例:在上例的基础上允许ping自己的IP,本地回环127.0.0.1和192.168.1.151 下面两条自己ping通自己 # iptables -A INPUT -i lo -p icmp -j ACCEPT # iptables -A OUTPUT -o lo -p icmp -j ACCEPT 下面两条定义此服务器和70这台机器可以互ping # iptables -A INPUT -p icmp -s 192.168.1.70 -j ACCEPT # iptables -A OUTPUT -p icmp -d 192.168.1.70 -j ACCEPT 示例:在上面的基础上再加上只允许192.168.1.0/24这个网段访问你的httpd服务 iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 80 -j ACCEPT iptables -A OUTPUT -p tcp -d 192.168.1.0/24 --sport 80 -j ACCEPT 示例:在上面的基础上再加上允许别人访问本台服务器的8080端口 只需要做udp的53端口就可以了,不用写tcp 53(因为tcp 53主要是用于主从DNS服务器同步的) iptables -A INPUT -p udp -s 192.168.1.0/24 --dport 53 -j ACCEPT iptables -A OUTPUT -p udp -d 192.168.1.0/24 --sport 53 -j ACCEPT 9. 规则特殊的写法 连续端口 iptables -A INPUT -p tcp --dport 1:1000 -j ACCEPT --端口1到1000都接受 iptables -A INPUT -p tcp -m multiport --dport 22,80,110 -j ACCEPT -- m参数,接受多个端口 硬件地址 iptables -A INPUT -m mac --mac-source 00:23:CD:95:DA:0B -p all --dport 80 -j ACCEPT iptables -A OUTPUT -p tcp -d 192.168.1.0/24 --sport 80 -j ACCEPT mac-source不能用于OUTPUT链 10. 示例 示例:FTP 主动 被动 用iptables实现ftp的主动模式能够访问 下面两句实现的是命令端口的连接 # iptables -A INPUT -p tcp --dport 21 -j ACCEPT # iptables -A OUTPUT -p tcp --sport 21 -j ACCEPT --不加这两句,客户端访问时都不能登录,加了后可以登录,但用ls列出ftp的共享信息的话就发现不行,这是因为20的数据端口还没有做规则 # iptables -A INPUT -p tcp --dport 20 -j ACCEPT # iptables -A OUTPUT -p tcp --sport 20 -j ACCEPT --主动模式是20端口去主动连接,所以上面两条,实现了主动模式的连接,注意:如果使用linux的ftp命令来做实验的话,注意登录后使用passive命令关掉被动模式再试验 被动模式 客户端连接服务器的随机端口 vim /etc/vsftpd/vsftpd.conf 在最后加上 pasv_enable=YES pasv_min_port=3000 pasv_max_port=3100 --最小端口范围和最大端口范围可以自定义 /etc/init.d/vsftpd restart --重启服务 下面两句就是针对上面的被动配置来设置的允许规则 # iptables -A INPUT -p tcp --dport 3000:3100 -j ACCEPT # iptables -A OUTPUT -p tcp --sport 3000:3100 -j ACCEPT 示例:nfs --因为nfs用到rpc调用,端口不固定,所以需要把端口给固定起来.nis服务也会用到rpc调用,也需要做端口绑定 vim /etc/sysconfig/nfs --在此文件里加上下面四句 LOCKD_TCPPORT=3000 LOCKD_UDPPORT=3000 MOUNTD_PORT=3001 STATD_PORT=3002 /etc/init.d/nfs restart /etc/init.d/portmap restart --这里先把默认策略改成ACCEPT,再启动就可以启动起来,然后再把默认策略改回成DROP,再继续做下面的实验 netstat -ntl |grep 300 去查看,看到rpc.的守护进程的端口为自己绑定的端口 iptables -A INPUT -p tcp --dport 3000:3002 -j ACCEPT iptables -A OUTPUT -p tcp --sport 3000:3002 -j ACCEPT iptables -A INPUT -p udp --dport 3000:3002 -j ACCEPT iptables -A OUTPUT -p udp --sport 3000:3002 -j ACCEPT 还要加上2049(nfs)和111(rpcbind)的端口的规则 iptables -A INPUT -p tcp --dport 2049 -j ACCEPT iptables -A OUTPUT -p tcp --sport 2049 -j ACCEPT iptables -A INPUT -p udp --dport 2049 -j ACCEPT iptables -A OUTPUT -p udp --sport 2049 -j ACCEPT iptables -A INPUT -p tcp --dport 111 -j ACCEPT iptables -A OUTPUT -p tcp --sport 111 -j ACCEPT iptables -A INPUT -p udp --dport 111 -j ACCEPT iptables -A OUTPUT -p udp --sport 111 -j ACCEPT
原文:https://www.cnblogs.com/The-day-of-the-wind/p/12063937.html