Linux iptables
语法
iptables [-t 表] [操作命令] [链] [规则匹配器] [-j 目标动作]
[-t filter] #是指操作的表,filter、nat、mangle或raw, 默认使用filter
[-AI INPUT,OUTPUT,FORWARD] #子命令,定义对规则的管理
[-io interface] # 指明链路
CRETIRIA # 匹配的条件或标准
ACTION #操作动作
-p 协议 #指定匹配数据包的协议
-s 源地址 #指定匹配数据包的源IP
-j 目标 #指定跳转的目标
-i 网络接口 #指定数据包进入本机的网络端口
-o 网路接口 #指定数据包离开本机的网络接口
-c 包计数 # 执行插入,追加和替换操作初始化计数器和字节计数器
常用指令
### 读取iptables文件,使规则生效
iptables-restore < /etc/syscofig/iptables
# 当前iptables规则写入文件,使规则生效
iptables-save > /etc/syscofig/iptables
# 查看已有规则
iptables -t nat -nL --line
iptables -t nat -D PREROUTING 2
# 删除所有规则
iptables -F -t nat
# 将iptables以序号标记显示
iptables -L -n --line-numbers
# 删除指定序号规则
iptables -D INPUT 8
iptables 端口转发
1、本地端口转发
将外网访问本地的808端口的流量转发到本地的9001端口:
-A PREROUTING -p tcp -m tcp --dport 808 -j REDIRECT --to-ports 9001
将本地访问本地的808端口的流量转发到本地的9001端口:
-A OUTPUT -p tcp -m tcp --dport 808 -j REDIRECT --to-ports 9001
2、分流
通过PREROUTING链,将172.16.250.1网段访问4444端口的包转发到本机22端口,其他网段则正常访问4444端口,MASQUERADE类似于SNAT,只是不用写源地址。
iptables -t nat -A PREROUTING --source 172.16.250.1 -p tcp --dport 4444 -j DNAT --to-destination 172.16.250.3:22
iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE
iptables -t nat -A POSTROUTING --dst 172.16.250.3 -p tcp --dport 22 -j MASQUERADE
3、远程端口转发
同样也需要改配置文件,使iptables允许ipv4转发
假如我们想使用192.168.171.139:5555去访问192.168.171.1:9999端口,那么需要在192.168.171.139的机器上执行下面的命令:
iptables -F -t nat
iptables -t nat -A PREROUTING --dst 192.168.171.139 -p tcp --dport 5555 -j DNAT --to-destination 192.168.171.1:9999
iptables -t nat -A POSTROUTING --dst 192.168.171.1 -p tcp --dport 9999 -j SNAT --to-source 192.168.171.139
# 限制匹配数据包中的字符
iptables -I OUTPUT -m string --algo bm --string "gay" -j REJECT
# 限制IP可建立的连接数
iptables -I INPUT -d 172.16.0.7 -p tcp --syn --dport 22 -m connlimit --connlimit-above 2 -j REJECT
使用示例
# 屏蔽一个IP地址
iptables -I INPUT -s IP -j DROP
# 屏蔽整个网段
iptables -I INPUT -s 123.0.0.0/8 -j DROP
# 阻断IP在网卡上所有TCP连接
iptables -A INPUT -i eth0 -p tcp -s IP -j DROP
# 允许在eth0接口接入SSH连接
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
# 允许指定网段接入ssh -p tcp 后 -s 192.168.100.0/24
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
# 不允许10.8.0.0/16网络对80/tcp端口进行访问
iptables -A INPUT -s 10.8.0.0/16 -d 172.26.55.7 -p tcp --dport 80 -j DROP
# 允许本地回环接口
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 端口 -j ACCEPT
# 允许访问22端口
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 禁止其他未允许的规则访问
iptables -A INPUT -j reject / iptables -A FORWARD -j REJECT
链管理
-N, --new-chain chain:新建一个自定义的规则链;
-X, --delete-chain [chain]:删除用户自定义的引用计数为0的空链;
-F, --flush [chain]:清空指定的规则链上的规则;
-E, --rename-chain old-chain new-chain:重命名链;
-Z, --zero [chain [rulenum]]:置零计数器;
-P, --policy chain target, 设置链路的默认策略
规则管理
# 查看iptables列表
iptables -nL
-L, --list [chain]:列出规则;
-v, --verbose:详细信息;
-vv, -vvv 更加详细的信息
-n, --numeric:数字格式显示主机地址和端口号;
-x, --exact:显示计数器的精确值;
--line-numbers:列出规则时,显示其在链上的相应的编号;
-S, --list-rules [chain]:显示指定链的所有规则;
iptables 默认配置
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [39:5103]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -s 192.168.8.205 -p tcp -m tcp --dport 10909 -j ACCEPT
-A INPUT -s 192.168.8.205 -i ens33 -p tcp -m tcp -d 192.168.8.204 --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
四表五链
“四表”是指,iptables的功能——filter, nat, mangle, raw.
# filter, 控制数据包是否允许进出及转发(INPUT、OUTPUT、FORWARD),可以控制的链路有input, forward, output
# nat, 控制数据包中地址转换,可以控制的链路有prerouting, input, output, postrouting
# mangle,修改数据包中的原数据,可以控制的链路有prerouting, input, forward, output, postrouting
# raw,控制nat表中连接追踪机制的启用状况,可以控制的链路有prerouting, output
“五链”是指内核中控制网络的NetFilter定义的五个规则链,分别为
# PREROUTING, 路由前
# INPUT, 数据包流入口
# FORWARD, 转发管卡
# OUTPUT, 数据包出口
# POSTROUTING, 路由后
扩展需求
1、多端口转发修改方案:
#将本地服务器的50000~65535转发至目标IP为1.1.1.1的50000~65535端口
-A PREROUTING -p tcp -m tcp --dport 50000:65535 -j DNAT --to-destination 1.1.1.1
-A PREROUTING -p udp -m udp --dport 50000:65535 -j DNAT --to-destination 1.1.1.1
-A POSTROUTING -d 1.1.1.1/32 -p tcp -m tcp --dport 50000:65535 -j SNAT --to-source [本地服务器IP]
-A POSTROUTING -d 1.1.1.1/32 -p udp -m udp --dport 50000:65535 -j SNAT --to-source [本地服务器IP]
2、非同端口号修改方案:
#使用本地服务器的60000端口来转发目标IP为1.1.1.1的50000端口
-A PREROUTING -p tcp -m tcp --dport 60000 -j DNAT --to-destination 1.1.1.1:50000
-A PREROUTING -p udp -m udp --dport 60000 -j DNAT --to-destination 1.1.1.1:50000
-A POSTROUTING -d 1.1.1.1/32 -p tcp -m tcp --dport 50000 -j SNAT --to-source [本地服务器IP]
-A POSTROUTING -d 1.1.1.1/32 -p udp -m udp --dport 50000 -j SNAT --to-source [本地服务器IP]