iptables应用
环境 centos7
-
iptables-services安装
[root@localhost ~]# yum -y install iptables-services #centos7系统中默认存在iptables命令,此命令仅为简单查询及操作命令,不包含配置文件,安装iptablesservices后,将直接生成配置文件,便于配置保存。包含ipv4及ipv6。
-
设置服务开启
[root@localhost ~]# systemctl start iptables.service
-
设置开机自启动
[root@localhost ~]# systemctl enable iptables.services
-
查看配置文件
[root@localhost ~]# rpm -ql iptables-services
-
保存规则
[root@localhost ~]# iptables-save > /etc/sysconfig/iptables
-
重载
[root@localhost ~]#iptables-restore < /etc/sysconfig/iptables
-
基本配置
iptables -F #删除现有规则 iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT DROP #配置默认链策略
-
案例:白名单
[root@localhost ~]# iptables -t filter -F [root@localhost ~]# iptables -P INPUT DROP [root@localhost ~]# iptables -t filter -I INPUT -p tcp --dport=22 -j ACCEPT [root@localhost ~]# iptables -t filter -I INPUT -p tcp --dport=80 -j ACCEPT
-
案例:黑名单
[root@localhost ~]# iptables -P INPUT ACCEPT [root@localhost ~]# iptables -F [root@localhost ~]# iptables -t filter -A INPUT -s 192.168.2.20/24 -p tcp --dport 80 -j DROP
-
案例:通过lo访问本机数据
[root@localhost ~]# iptables -I INPUT -d 127.0.0.1 -p tcp --dport=9000 -i lo -j ACCEPT [root@localhost ~]# iptables -I INPUT -i lo -j ACCEPT #允许通过本地回环网卡访问本机
-
案例:允许连接态产生衍生态
[root@localhost ~]# iptables -I INPUT -m state --state ESTABLISHED,1 RELATED -j ACCEPT
-
iptables filter表应用案例
-
案例1
[root@localhost ~]# yum -y install httpd vsftpd sshd [root@localhost ~]# systemctl start httpd vsftpd sshd [root@localhost ~]# iptables -t filter -F [root@localhost ~]# iptables -I INPUT -p tcp --dport 80 -j ACCEPT [root@localhost ~]# iptables -I INPUT -p tcp --dport 20:21 -j ACCEPT [root@localhost ~]# iptables -I INPUT -p tcp --dport 22 -j ACCEPT [root@localhost ~]# iptables -A INPUT -j REJECT #在存问题 本机无法访问本机 例如:ping 127.0.0.1 解决方法 [root@localhost ~]# iptables -I INPUT -i lo -j ACCEPT 本机无法访问其它主机 例如:ssh remote_host 解决方法 [root@localhost ~]# iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
FTP无法访问 解决方法1: [root@localhost ~]# iptables -I INPUT -p tcp --dport 20:21 -j ACCEPT [root@localhost ~]# vim /etc/vsftpd/vsftpd.conf pasv_min_port=50000 pasv_max_port=60000 [root@localhost ~]# iptables -I INPUT -p tcp --dport 50000:60000 -j ACCEPT 解决方法2:使用连接追踪模块 [root@localhost ~]# iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT [root@localhost ~]# iptables -I INPUT -p tcp --dport 20:21 -j ACCEPT [root@localhost ~]# modprobe nf_conntrack_ftp #临时方法,添加连接追踪模块 [root@localhost ~]# vim /etc/sysconfig/iptables-config IPTABLES_MODULES="nf_conntrack_ftp" #启动服务时加载 #针对数据端口连接时,将三次握手第一次状态由NEW识别为RELATED -
案例2:iptables标准流程
[root@localhost ~]# iptables -F [root@localhost ~]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT [root@localhost ~]# iptables -A INPUT -i lo -j ACCEPT [root@localhost ~]# iptables -A INPUT -s 192.168.2.0/24 -j ACCEPT #允许内网任何访问 [root@localhost ~]# iptables -A INPUT -p tcp --syn --dport 80 -j ACCEPT [root@localhost ~]# iptables -A INPUT -p tcp --syn --dport 22 -j ACCEPT [root@localhost ~]# iptables -A INPUT -p tcp --syn --dport 21 -j ACCEPT [root@localhost ~]# iptables -A INPUT -j REJECT [root@localhost ~]# modprobe nf_conntrack_ftp [root@localhost ~]# iptables-save > /etc/sysconfig/iptables [root@localhost ~]# vim /etc/sysconfig/iptables-config IPTABLES_MODULES="nf_conntrack_ftp"
-
案例3:扩展匹配
#-m icmp [root@localhost ~]# iptables -F [root@localhost ~]# iptables -t filter -I INPUT -p icmp -m icmp --icmp-type echo-reply -j ACCEPT #允许ping回应 [root@localhost ~]# iptables -A INPUT -j REJECT
#-m iprange [root@localhost ~]# iptables -t filter -I INPUT -m iprange --src-range 192.168.2.10-192.168.2.100 -j REJECT
#-m multiport [root@localhost ~]# iptables -t filter -I INPUT -p tcp -m multiport --dports 20,21,22,25,80,110 -j ACCEPT
#-m tos 根据ip协议头部 type of service进行过滤 [root@localhost ~]# iptables -F [root@localhost ~]# tcpdump -i eth0 -nn port 22 -vvv
#抓取远程主机访问本机的ssh数据包,观察TOS值 [root@localhost ~]# tcpdump -i eth0 -nn port 22 -vvv
#抓取远程从本机rsync或scp复制文件,观察TOS值 #ssh: tos 0x0 0x10 #scp: tos 0x0 0x8 #rsync: tos 0x0 0x8 [root@localhost ~]# iptables -t filter -A INPUT -p tcp --dport 22 -m tos --tos 0x10 -j ACCEPT [root@localhost ~]# iptables -t filter -A INPUT -j REJECT
#-m tcp 按TCP控制位进行匹配 Flags:SYN ACK FIN RST URG PSH ALL NONE [root@localhost ~]# iptables -t filter -A INPUT -p tcp -m tcp --tcp-flags SYN,ACK,FIN,RST SYN --dport 80 -j ACCEPT [root@localhost ~]# iptables -t filter -A INPUT -p tcp --syn --dport 80 -j ACCEPT
#--tcp-flags SYN,ACK,FIN,RST SYN 检查四个标记位,只有SYN标记位才匹配,即只允许三次握手中的第一次握手,等价于--syn
#-m comment 对规则进行备注说明 [root@localhost ~]# iptables -A INPUT -s 192.168.2.250 -m comment --comment "cloudhost" -j REJECT
#-m mark 使用mangle表的标记方法,配合mangle表使用 [root@localhost ~]# iptables -t filter -A INPUT -m mark 2 -j REJECT -
案例4:扩展动作
#-j LOG 记录至日志中 [root@localhost ~]# grep 'kern.*' /etc/rsyslog.conf #添加kern.* /var/log/kernel.log [root@localhost ~]# systemctl restart rsyslog [root@localhost ~]# iptables -j LOG -h [root@localhost ~]# iptables -t filter -A INPUT -p tcp --syn --dport 22 -j LOG --logprefix " localhost_ssh " [root@localhost ~]# iptables -t filter -A INPUT -p tcp --syn --dport 22 -j ACCEPT [root@localhost ~]# iptables -t filter -A INPUT -j REJECT #-j REJECT 当访问一个未开启的TCP端口时,应该返回一个带有RST标记的数据包 当访问一个未开启的UDP端口,结果返回port xxx unreachable 当访问一个开启的TCP端口,但被防火墙REJECT,结果返回port xxx unreachable [root@localhost ~]# iptables -j REJECT -h [root@localhost ~]# iptables -t filter -A INPUT -p tcp --dport 22 -j REJECT --rejectwith tcp-reset //返回一个自定义消息类型 #-j MARK 进行标记,可在LVS调度器中应用 [root@localhost ~]# iptables -t mangle -L [root@localhost ~]# iptables -j MARK -h [root@localhost ~]# iptables -t mangle -A PREROUTING -s 192.168.2.110 -j MARK --setmark 1 [root@localhost ~]# iptables -t mangle -A PREROUTING -s 192.168.2.25 -j MARK --setmark 2 [root@localhost ~]# iptables -t filter -A INPUT -m mark --mark 1 -j ACCEPT //按照标记匹配 [root@localhost ~]# iptables -t filter -A INPUT -m mark --mark 2 -j REJECT
-
-
iptables nat表应用案例
-
nat表作用
- 导流
-
nat表作用位置
- KVM或OpenStack中虚拟机或云主机与外部通信
- Docker管理的容器与外部通信
-
nat表规则动作所对应的链
- SNAT 源地址转换 应用于出口POSTROUTING
- MASQUERADE 源地址转换 应用于出口POSTROUTING
- DNAT 目标地址转换 应用于进口PREROUTING
- REDIRECT 端口重定向 应用于进口PREROUTING
-
开启路由转发功能
[root@localhost ~]# sysctl -a | grep ip_forward net.ipv4.ip_forward = 1 [root@localhost ~]# cat /proc/sys/net/ipv4/ip_forward 1 #以上为开启 #以下为关闭 [root@localhost ~]# echo 0 > /proc/sys/net/ipv4/ip_forward [root@localhost ~]# cat /proc/sys/net/ipv4/ip_forward 0
-