iptables 常用使用命令

目录

1 iptables 入门介绍

1.1 iptables 介绍

1.2 iptables 安装

1.3 iptables 服务管理

1.4 命令参数

1.5 显示规则

1.6 删除/插入规则

2 iptables 实例

2.1 清空当前的所有规则和计数

2.2 配置允许 ssh 端口连接

2.3 配置白名单

2.4 开启相应的服务端口

2.5 列出已设置的规则

2.6 删除已添加的规则

2.7 开放指定的端口

2.8 屏蔽 IP

2.9 查看已添加的规则

2.10 启动网络转发规则

2.11 端口映射

2.12 字符串匹配

2.13 防止攻击

2.14 连接管理

2.15 ssh & http管理

2.16 包管理



1 iptables 入门介绍


1.1 iptables 介绍


iptables 使用三个不同的链来允许或阻止流量:输入(input)、输出(output)和转发(forward)

  • 输入(input) —— 此链用于控制传入连接的行为
  • 输出(output) —— 此链用于传出连接
  • 转发(forward) —— 这条链用于传入的连接,这些连接实际上不是在本地传递的,比如路由和 NATing

1.2 iptables 安装


centos
CentOS 7 上默认安装了 firewalld 作为防火墙,使用 iptables 建议关闭并禁用 firewalld。

$ systemctl stop firewalld
$ systemctl disable firewalld



安装 iptables

$ yum install -y iptables-services



Ubuntu
安装 iptables

apt-get install iptables

1.3 iptables 服务管理
$ systemctl status iptables  # 查看服务状态
$ systemctl enable iptables  # 启用服务
$ systemctl disable iptables # 禁用服务
$ systemctl start iptables   # 启动服务
$ systemctl restart iptables # 重启服务
$ systemctl stop iptables    # 关闭服务

1.4 命令参数
基本语法:$ iptables(选项)(参数)
-P    设置默认策略:
iptables -P INPUT (DROP
-F    清空规则链
-L    查看规则链
-A    在规则链的末尾加入新规则
-I    num 在规则链的头部加入新规则
-D    num 删除某一条规则
-s    匹配来源地址 IP/MASK
加叹号"!"表示除这个 IP 外
-d    匹配目标地址
-i    网卡名称 匹配从这块网卡流入的数据
-o    网卡名称 匹配从这块网卡流出的数据
-p    匹配协议,如 tcp,udp,icmp
--dport num    匹配目标端口号
--sport num    匹配来源端口号
$ iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> --sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 动作


1.5 显示规则
详细打印出所有活动的 iptables 规则

$ iptables -n -L -v
具有行号的相同输出:

$ iptables -n -L -v --line-numbers
最后,相同的数据输出但与 INPUT/OUTPUT 链相关:$ iptables -L INPUT -n -viptables -L OUTPUT -n -v --line-numbers


 


1.6 删除/插入规则
按链条和编号删除规则

$ iptables -D INPUT 10
按规范删除规则

$ iptables -D INPUT -m conntrack --ctstate INVALID -j DROP
刷新所有规则,删除所有链,并接受所有$ iptables -P INPUT ACCEPT
$ iptables -P FORWARD ACCEPT
$ iptables -P OUTPUT ACCEPT
$ iptables -t nat -F
$ iptables -t mangle -F
$ iptables -F
$ iptables -X
# 冲洗所有链
$ iptables -F
# 刷新单链
$ iptables -F INPUT
# 插入规则
$ iptables -I INPUT 2 -s 202.54.1.2 -j DROP


 


2 iptables 实例

2.1 清空当前的所有规则和计数
$ iptables -F  # 清空所有的防火墙规则
$ iptables -X  # 删除用户自定义的空链
$ iptables -Z  # 清空计数


2.2 配置允许 ssh 端口连接
$ iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT
22 为你的 ssh 端口, -s 192.168.1.0/24 表示允许这个网段的机器来连接,其它网段的 ip 地址是登陆不了你的机器的。-j ACCEPT 表示接受这样的请求

2.3 配置白名单
# 允许机房内网机器可以访问
$ iptables -A INPUT -p all -s 192.168.1.0/24 -j ACCEPT 
# 允许机房内网机器可以访问
$ iptables -A INPUT -p all -s 192.168.140.0/24 -j ACCEPT 
# 允许 183.121.3.7 访问本机的3380端口
$ iptables -A INPUT -p tcp -s 183.121.3.7 --dport 3380 -j ACCEPT

2.4 开启相应的服务端口
# 开启 80 端口,因为web对外都是这个端口
$ iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# 允许被 ping
$ iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
# 已经建立的连接得让它进来
$ iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

2.5 列出已设置的规则
$ iptables -L [-t 表名][链名]
四个表名 raw,nat,filter,mangle
五个规则链名 INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING
filter 表包含INPUT、OUTPUT、FORWARD三个规则链
# 列出 nat 上面的所有规则
$ iptables -L -t nat                
#            ^ -t 参数指定,必须是 raw, nat,filter,mangle 中的一个
# 规则带编号
$ iptables -L -t nat  --line-numbers
$ iptables -L INPUT
# 查看,这个列表看起来更详细
$ iptables -L -nv

2.6 删除已添加的规则
# 添加一条规则
$ iptables -A INPUT -s 192.168.1.5 -j DROP
将所有 iptables 以序号标记显示,执行:

$ iptables -L -n --line-numbers
比如要删除 INPUT 里序号为 8 的规则,执行:

$ iptables -D INPUT 8

2.7 开放指定的端口
# 允许本地回环接口(即运行本机访问本机)
$ 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
# 允许访问22端口
$ iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 允许访问80端口
$ iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# 允许ftp服务的21端口
$ iptables -A INPUT -p tcp --dport 21 -j ACCEPT
# 允许FTP服务的20端口
$ iptables -A INPUT -p tcp --dport 20 -j ACCEPT
# 禁止其他未允许的规则访问
$ iptables -A INPUT -j reject
# 禁止其他未允许的规则访问
$ iptables -A FORWARD -j REJECT


2.8 屏蔽 IP
# 屏蔽恶意主机(比如,192.168.0.8
$ iptables -A INPUT -p tcp -m tcp -s 192.168.0.8 -j DROP
# 屏蔽单个IP的命令
$ iptables -I INPUT -s 123.45.6.7 -j DROP
# 封整个段即从123.0.0.1到123.255.255.254的命令
$ iptables -I INPUT -s 123.0.0.0/8 -j DROP
# 封IP段即从123.45.0.1到123.45.255.254的命令
$ iptables -I INPUT -s 124.45.0.0/16 -j DROP
# 封IP段即从123.45.6.1到123.45.6.254的命令是
$ iptables -I INPUT -s 123.45.6.0/24 -j DROP

2.9 查看已添加的规则
$ iptables -L -n -v
Chain INPUT (policy DROP 48106 packets, 2690K bytes)
 pkts bytes target     prot opt in     out     source               destination
 5075  589K ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0
 191K   90M ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:22
1499K  133M ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:80
4364K 6351M ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
 6256  327K ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
Chain OUTPUT (policy ACCEPT 3382K packets, 1819M bytes)
 pkts bytes target     prot opt in     out     source               destination
 5075  589K ACCEPT     all  --  *      lo      0.0.0.0/0            0.0.0.0/0


 



2.10 启动网络转发规则
公网210.14.67.7让内网192.168.188.0/24上网

$ iptables -t nat -A POSTROUTING -s 192.168.188.0/24 -j SNAT --to-source 210.14.67.127


 



2.11 端口映射
本机的 2222 端口映射到内网 虚拟机的 22 端口

$ iptables -t nat -A PREROUTING -d 210.14.67.127 -p tcp --dport 2222  -j DNAT --to-dest 192.168.188.115:22

2.12 字符串匹配
比如,我们要过滤所有 TCP 连接中的字符串test,一旦出现它我们就终止这个连接,我们可以这么做:$ iptables -A INPUT -p tcp -m string --algo kmp --string "test" -j REJECT --reject-with tcp-reset
$ iptables -L
# Chain INPUT (policy ACCEPT)
# target     prot opt source          destination
# REJECT     tcp  --  anywhere        anywhere        STRING match "test" ALGO name kmp TO 65535 reject-with tcp-reset
#
# Chain FORWARD (policy ACCEPT)
# target     prot opt source          destination
#
# Chain OUTPUT (policy ACCEPT)
# target     prot opt source          destination


2.13 防止攻击
阻止 Windows 蠕虫的攻击
$ iptables -I INPUT -j DROP -p tcp -s 0.0.0.0/0 -m string --algo kmp --string "cmd.exe"
防止 SYN 洪水攻击
$ iptables -A INPUT -p tcp --syn -m limit --limit 5/second -j ACCEPT
防止端口扫描
$ iptables -N port-scanningiptables -A port-scanning -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s --limit-burst 2 -j RETURNiptables -A port-scanning -j DROP
SSH 暴力破解保护
$ iptables -A INPUT -p tcp --dport ssh -m conntrack --ctstate NEW -m recent --setiptables -A INPUT -p tcp --dport ssh -m conntrack --ctstate NEW -m recent --update --seconds 60 --hitcount 10 -j DROP
同步泛洪保护
$ iptables -N syn_floodiptables -A INPUT -p tcp --syn -j syn_floodiptables -A syn_flood -m limit --limit 1/s --limit-burst 3 -j RETURN
$ iptables -A syn_flood -j DROPiptables -A INPUT -p icmp -m limit --limit  1/s --limit-burst 1 -j ACCEPT
$ iptables -A INPUT -p icmp -m limit --limit 1/s --limit-burst 1 -j LOG --log-prefix PING-DROP:
$ iptables -A INPUT -p icmp -j DROPiptables -A OUTPUT -p icmp -j ACCEPT
使用 SYNPROXY 缓解 SYN 泛洪
$ iptables -t raw -A PREROUTING -p tcp -m tcp --syn -j CT --notrack
$ iptables -A INPUT -p tcp -m tcp -m conntrack --ctstate INVALID,UNTRACKED -j SYNPROXY --sack-perm --timestamp --wscale 7 --mss 1460
$ iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
阻止非 SYN 的新数据包
$ iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP

阻止带有虚假 TCP 标志的数据包
$ iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
$ iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,SYN FIN,SYN -j DROP
$ iptables -t mangle -A PREROUTING -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
$ iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,RST FIN,RST -j DROP
$ iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,ACK FIN -j DROP
$ iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,URG URG -j DROP
$ iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,FIN FIN -j DROP
$ iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,PSH PSH -j DROP
$ iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL ALL -j DROP
$ iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL NONE -j DROP
$ iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL FIN,PSH,URG -j DROP
$ iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL SYN,FIN,PSH,URG -j DROP
$ iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP


2.14 连接管理
允许环回连接
$ iptables -A INPUT -i lo -j ACCEPTiptables -A OUTPUT -o lo -j ACCEPT
允许已建立和相关的传入连接
$ iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
允许已建立的传出连接
$ iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT
内部到外部
$ iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
丢弃无效数据包
$ iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
阻止 IP 地址
$ iptables -A INPUT -s 192.168.1.10 -j DROP
阻止和 IP 地址并拒绝
$ iptables -A INPUT -s 192.168.1.10 -j REJECT
阻止与网络接口的连接
$ iptables -A INPUT -i eth0 -s 192.168.1.10 -j DROP

2.15 ssh & http管理
允许传出 SSH
$ iptables -A OUTPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
$ iptables -A INPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT
允许所有传入的 SSH
$ iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
$ iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT
允许来自特定 IP 地址或子网的传入 SSH
$ iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
$ iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate ESTABLISHED -j ACCEPT

允许传入 HTTP
$ iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
$ iptables -A OUTPUT -p tcp --sport 80 -m conntrack --ctstate ESTABLISHED -j ACCEPT
允许传入 HTTPS
$ iptables -A INPUT -p tcp --dport 443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
$ iptables -A OUTPUT -p tcp --sport 443 -m conntrack --ctstate ESTABLISHED -j ACCEPT
允许传入 HTTP 和 HTTPS
$ iptables -A INPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
$ iptables -A OUTPUT -p tcp -m multiport --dports 80,443 -m conntrack --ctstate ESTABLISHED -j ACCEPT


 


2.16 包管理
记录和丢弃数据包
$ iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j LOG --log-prefix "IP_SPOOF A: "
$ iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
默认情况下,所有内容都记录到 /var/log/messages 文件中:

$ tail -f /var/log/messagesgrep --color 'IP SPOOF' /var/log/messages
丢弃或接受来自 Mac 地址的流量
$ iptables -A INPUT -m mac --mac-source 00:0F:EA:91:04:08 -j DROP
$ iptables -A INPUT -p tcp --destination-port 22 -m mac --mac-source 00:0F:EA:91:04:07 -j ACCEPT
阻止或允许 ICMP Ping 请求
$ iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
$ iptables -A INPUT -i eth1 -p icmp --icmp-type echo-request -j DROP
使用 random* 或 nth* 进行负载平衡
_ips=("172.31.250.10" "172.31.250.11" "172.31.250.12" "172.31.250.13")for ip in "${_ips[@]}" ; do  iptables -A PREROUTING -i eth0 -p tcp --dport 80 -m state --state NEW -m nth --counter 0 --every 4 --packet 0 \    -j DNAT --to-destination ${ip}:80 done
or
_ips=("172.31.250.10" "172.31.250.11" "172.31.250.12" "172.31.250.13")for ip in "${_ips[@]}" ; do  iptables -A PREROUTING -i eth0 -p tcp --dport 80 -m state --state NEW -m random --average 25 \    -j DNAT --to-destination ${ip}:80 done

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值