防火墙常用命令
·
Dayup
·
约 22 分钟
·
速查
/
命令 目录
1. nftables
- (nftables 使用教程:https://www.cnblogs.com/ryanyangcs/p/11611730.html)
sudo apt update
sudo apt install nftables
sudo systemctl enable nftables
sudo systemctl start nftables
sudo systemctl status nftables
sudo systemctl stop iptables
sudo systemctl disable iptables
sudo nft list ruleset #查看现有规则
# 过滤
sudo nft add table inet filter
sudo nft add chain inet filter input { type filter hook input priority 0 \; }
sudo nft add chain inet filter output { type filter hook output priority 0 \; }
# 允许来自192.168.1.100和192.168.1.101的主机访问端口22,80,443
sudo nft add rule inet filter input ip saddr { 192.168.1.100, 192.168.1.101 } tcp dport { 22, 80, 443 } accept
# 允许输出到192.168.2.100和192.168.2.101的端口8080,8443
sudo nft add rule inet filter output ip daddr { 192.168.2.100, 192.168.2.101 } tcp dport { 8080, 8443 } accept
# 屏蔽所有来源的80端口TCP流量
sudo nft add rule inet filter input tcp dport 80 drop
# 更严格的版本:记录被丢弃的包(可选)
sudo nft add rule inet filter input tcp dport 80 counter drop
# 转发(需开启IP转发 echo 1 > /proc/sys/net/ipv4/ip_forward)
sudo nft add table nat
sudo nft add chain nat prerouting { type nat hook prerouting priority -100 \; }
sudo nft add chain nat postrouting { type nat hook postrouting priority 100 \; }
# DNAT规则:将入站流量转发到远程服务器
sudo nft add rule nat prerouting tcp dport 8080 dnat to 1.2.3.4:80
# SNAT规则:修改返回流量的源地址
sudo nft add rule nat postrouting ip daddr 1.2.3.4 masquerade
# 允许转发
sudo nft add rule inet filter forward ct state related,established accept
sudo nft add rule inet filter forward ip daddr 1.2.3.4 accept
# 导出规则
sudo nft list ruleset > /etc/nftables-export.conf
# 导入规则
sudo nft list ruleset > nftables-backup.nft #备份规则
sudo nft -c -f /etc/nftables-export.conf #检查规则
sudo nft flush ruleset #清空规则
sudo nft -f /etc/nftables-export.conf #导入规则
# 查看规则 -a或--handle查看规则的句柄
sudo nft list chain inet filter input
sudo nft -a list chain inet filter input
sudo nft delete rule inet filter input handle 3
# 删除规则
sudo nft delete rule [family] [table] [chain] handle [num]
sudo nft delete rule
# 清除所有规则
sudo nft flush ruleset
2. iptables
#查看已有规则
iptables -nvL --line-numbers #查看已添加的iptables规则
iptables -t nat -S #查看 nat 表的所有规则
iptables -t nat -S POSTROUTING #查看具体链的规则
iptables-save > iptables-backup.txt # 备份当前规则
iptables-restore < iptables-backup.txt # 恢复规则
#开放
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 -A FORWARD -j REJECT #禁止其他未允许的规则访问
#删除已添加的iptables规则
比如要删除INPUT里序号为8的规则,执行:
iptables -D INPUT 8
#屏蔽IP
iptables -I INPUT -s 123.45.6.7 -j DROP #屏蔽单个IP的命令
iptables -I INPUT -s 123.0.0.0/8 -j DROP #封整个段即从123.0.0.1到123.255.255.254的命令
iptables -I INPUT -s 124.45.0.0/16 -j DROP #封IP段即从123.45.0.1到123.45.255.254的命令
iptables -I INPUT -s 123.45.6.0/24 -j DROP #封IP段即从123.45.6.1到123.45.6.254的命令是
禁止所有IP访问端口80
iptables -A INPUT -p tcp --drop 80 -j DROP //此规则将本机收到的所有80端口的TCP流量数据包丢弃。
仅允许指定IP访问80
iptables -A INPUT -s 172.168.1.110 -p tcp --dport 80 -j ACCEPT //此规则允许源IP地址为172.168.1.110的TCP流量访问端口80。
添加指定端口的拒绝规则
iptables -I INPUT -p tcp -m multiport --dport 80 -j REJECT
删除指定端口的拒绝规则
iptables -D INPUT -p tcp -m multiport --dport 80 -j REJECT //此命令将删除TCP端口80的拒绝规则。
在输入链中插入拒绝TCP端口52395的规则
iptables -t filter -I INPUT -p tcp -m tcp --dport 52395 -j DROP //此命令将在INPUT链开头插入一条拒绝TCP端口52395的规则。
在输出链中插入拒绝TCP端口63556的规则
iptables -t filter -I OUTPUT -p tcp -m tcp --dport 63556 -j DROP //此命令将在OUTPUT链开头插入一条拒绝TCP端口63556的规则。
在输入链中插入拒绝TCP端口9999的规则
iptables -I INPUT -p tcp --dport 9999 -j DROP //此命令将在INPUT链开头插入一条拒绝TCP端口9999的规则。
允许指定IP访问TCP端口9999
iptables -I INPUT -s 172.20.1.3 -p tcp --dport 9999 -j ACCEPT //此规则将来源IP地址为172.20.1.3的TCP流量访问端口9999
包转发
打开包转发功能:echo 1 > /proc/sys/net/ipv4/ip_forward
打开包转发功能:net.ipv4.ip_forward = 1 #/etc/sysctl.conf
iptables -t nat --line-numbers
TCP转发
iptables -t nat -A PREROUTING -p tcp --dport 123 -j DNAT --to-destination <指定IP>
iptables -t nat -A POSTROUTING -p tcp -d <指定IP> --dport 123 -j MASQUERADE
将本机的 7777 端口转发到 6666 端口。
iptables -t nat -A PREROUTING -p tcp --dport 7777 -j REDIRECT --to-port 6666
1.6通过1.168的6666端口访问1.8的7777端口
sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A PREROUTING -p tcp --dport 6666 -j DNAT --to-destination 192.168.1.8:7777
iptables -t nat -A POSTROUTING -p tcp -d 192.168.1.8 --dport 7777 -j SNAT --to-source 192.168.1.168
TCP转发
iptables -t nat -A PREROUTING -d 10.10.10.1 -p tcp --dport 100 -j DNAT --to-destination 192.168.1.1:80
iptables -t nat -A POSTROUTING -d 192.168.1.1 -p tcp --dport 80 -j SNAT --to 10.10.10.1
iptables -A FORWARD -o eth0 -d 192.168.1.1 -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -i eth0 -s 192.168.1.1 -p tcp --sport 80 -j ACCEPT
UDP转发 xxx-> 10.10.10.1:100->192.168.1.1:80
iptables -t nat -A PREROUTING -d 10.10.10.1 -p udp --dport 100 -j DNAT --to-destination 192.168.1.1:80
iptables -t nat -A POSTROUTING -s 192.168.1.1 -p udp --dport 80 -j SNAT --to-source 10.10.10.1:100
iptables -A FORWARD -o eth0 -d 192.168.1.1 -p udp --dport 80 -j ACCEPT
iptables -A FORWARD -i eth0 -s 192.168.1.1 -p udp --sport 80 -j ACCEPT
iptables -t nat -A PREROUTING -d 10.10.10.1 -p tcp --dport 100 -j DNAT --to-destination 192.168.1.1:80
iptables -t nat -A POSTROUTING -s 192.168.1.1 -p tcp --dport 80 -j SNAT --to-source 10.10.10.1:100
iptables -A FORWARD -o eth0 -d 192.168.1.1 -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -i eth0 -s 192.168.1.1 -p tcp --sport 80 -j ACCEPT
# 示例:docker容器中的DNS转发到指定dockerd进程端口
# 如果容器中iptables转发规则不存在,可自行添加以下规则
iptables -t nat -N DOCKER_OUTPUT
iptables -t nat -N DOCKER_POSTROUTING
iptables -t nat -A OUTPUT -d 127.0.0.11/32 -j DOCKER_OUTPUT
iptables -t nat -A POSTROUTING -d 127.0.0.11/32 -j DOCKER_POSTROUTING
iptables -t nat -A DOCKER_OUTPUT -d 127.0.0.11/32 -p udp -m udp --dport 53 -j DNAT --to-destination 127.0.0.11:51755
iptables -t nat -A DOCKER_POSTROUTING -s 127.0.0.11/32 -p udp -m udp --sport 51755 -j SNAT --to-source :53
iptables -t nat -A DOCKER_OUTPUT -d 127.0.0.11/32 -p tcp -m tcp --dport 53 -j DNAT --to-destination 127.0.0.11:43107
iptables -t nat -A DOCKER_POSTROUTING -s 127.0.0.11/32 -p tcp -m tcp --sport 43107 -j SNAT --to-source :53
#iptables集成在 Linux 内核中的包过滤防火墙系统 https://developer.aliyun.com/article/888704
iptables [-t 表名] 命令选项 [链名] [条件匹配] [-j 目标动作]
表名:filter,nat,mangle,raw,security # filter:默认,过滤数据包使用 nat:进行网络地址转换 mangle:修改数据包的内容(例如,修改TTL值) raw:连接跟踪之前处理数据包 security:实施强制访问控制策略,例如,在SELinux环境中
链名:INPUT,OUTPUT,FORWARD,PREROUTING,POSTROUTING #FORWARD:Linux主机转发需要设置内核参数/proc/sys/net/ipv4/ip_forward
命令:-N ∶ 创建一条用户指定的新链
命令:-I ∶ 在指定链的开头插入规则
命令:-A ∶ 在指定链的末尾追加规则
命令:-D ∶ 删除指定链中规则
命令:-R ∶ 在指定链中替换规则
命令:-L ∶ 列出指定链中所有的规则,若未指定链名则针对表中的所有链 如-t nat可指定nat表,默认为filter表
命令:-F ∶ 清空指定链中的所有规则,若未指定链名则针对表中的所有链 如-t nat可指定nat表
命令:-P ∶ 设置指定链的默认策略(–policy)
参数:-v ∶ 表示输出详细信息,包含通过该规则的数据包数量、总字节数以及相应的网络接口。
参数:-n ∶ 显示 IP 地址而不是主机名
参数:-x ∶ 禁止字节单位自动转换
参数:-i ∶ 指定输入网卡流量
参数:-o ∶ 指定输出网卡流量
参数:-p ∶ 指定协议类型tcp,udp,icmp
参数:-S ∶ 等同--list-rules 以规则命令格式(rule-specification format)显示当前规则,这种格式可以直接作为 iptables 命令重新执行。
参数:-s ∶ 指定源地址 IP、网段、域名
参数:-d ∶ 指定目标地址
参数:--sport ∶ 指定源端口或端口段 :2000表示0:2000
参数:--dport ∶ 指定目标端口
参数:--to-source ∶ 指定数据包的新源IP地址
参数:--to-destination ∶ 指定数据包的新目标IP地址
参数:-m ∶ 指定扩展匹配模块 https://blog.51cto.com/u_14487231/6794214
- -m state --state RELATED,ESTABLISHED #包状态匹配
- -m mac --mac-source xx:xx:xx:xx:xx:xx #来源MAC地址匹配
- -m limit --limit 50/s #每秒抓发50个包 具体需要搭配其他规则使用
- -m multiport <--sports|--dports|--ports> 端口1[,端口2,..,端口n]
目标动作Target
ACCEPT:允许,接收流量包继续传递给后续规则和链路
DROP:丢弃,不再继续传递
REJECT:拒绝,同时回复拒绝的原因,可使用–reject-with选择拒绝类型(icmp-net-unreachable、icmp-host-unreachable、icmp-port-unreachable默认)
RETURN:返回。类似函数调用,退出当前链的规则匹配执行,返回之前链的调用点继续执行下一条规则,或者不是被调用的则以默认策略执行
SNAT:源地址转换(数据包的源地址从内部网络的IP地址转换为外部IP地址,场景:多个内部设备共享一个外部IP地址访问互联网)
DNAT:目标地址转换(数据包的目标地址从外部IP地址转换为内部网络的某个IP地址,场景:将外部请求重定向到内部网络中的特定服务,如私网服务端接收公网请求的问题)
MASQUERADE:动态源地址转换(MASQUERADE是一种特殊形式的SNAT,会自动选择出口网卡的IP地址进行源地址,自动转换性能会稍差,通常在POSTROUTING链中使用,用于修改离开防火墙的数据包的源地址。)
LOG:记录日志/var/log/messages,然后传递给下一条规则
REDIRECT:可进行本机端口映射
XXXXXXXXXXXXXXXXXX
XXX Network XXX
XXXXXXXXXXXXXXXXXX
+
|
v
+-------------+ +------------------+
|table: filter| <---+ | table: nat |
|chain: INPUT | | | chain: PREROUTING|
+-----+-------+ | +--------+---------+
| | |
v | v
[local process] | **************** +--------------+
| +---------+ Routing decision +------> |table: filter |
v **************** |chain: FORWARD|
**************** +------+-------+
Routing decision |
**************** |
| |
v **************** |
+-------------+ +------> Routing decision <---------------+
|table: nat | | ****************
|chain: OUTPUT| | +
+-----+-------+ | |
| | v
v | +-------------------+
+--------------+ | | table: nat |
|table: filter | +----+ | chain: POSTROUTING|
|chain: OUTPUT | +--------+----------+
+--------------+ |
v
XXXXXXXXXXXXXXXXXX
XXX Network XXX
XXXXXXXXXXXXXXXXXX
3. firewall
# 基本操作
sudo firewall-cmd --reload //更新防火墙规则(设置端口后需要执行)
sudo firewall-cmd --zone=public --list-ports //查看所有打开的端口
sudo firewall-cmd --version //查看版本
sudo firewall-cmd --state //查看状态
# 端口操作
sudo firewall-cmd --zone=public --query-port=80/tcp //查看某端口状态
sudo firewall-cmd --zone=public --remove-port=80/tcp --permanent //关闭端口
sudo firewall-cmd --zone=public --add-port=80/tcp --permanent //开放80端口 --permanent永久生效
sudo firewall-cmd --permanent --zone=public --add-port=100-500/tcp //开放端口段
# 防火墙服务
systemctl status firewalld.service //查看状态
systemctl start firewalld.service //启动
systemctl stop firewalld.service //停止
systemctl restart firewalld.service //重启
systemctl enable firewalld.service //开机启动
systemctl disable firewalld.service //关闭开机启动
systemctl is-enabled firewalld.service //查看是否开机启动
← 返回速查