0. 规则设置理论
- 规则清零
- 预设规则
- 信任本机
- 回应封包
1. iptables 安装
1.1 关闭firewall
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动
1.2 安装iptables防火墙
iptables 是一个通过控制 Linux 内核的 netfilter 模块来管理网络数据包的流动与转送的应用软件, 其功能包括不仅仅包括防火墙的控制出入流量, 还有端口转发等等。iptables 内部有表 tables、链 chains、规则 rules 这三种概念。iptables 的每一个 “表” 都和不同的数据包处理有关、决定数据包是否可以穿越的是 “链”、而一条 “规则” 在链里面则可以决定是否送往下一条链(或其它的动作)。
yum install iptables-services #安装
vim /etc/sysconfig/iptables#编辑防火墙配置文件
service iptables save
service iptables restart
2. iptables 管理
2.1 查看规则:
[root@ ~]# iptables -nvL --line-number
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 6 240 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:21
2 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:20
3 166 16678 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
4 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
5 167 19847 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
6 45 2886 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
7 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:21
8 3 120 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpts:30000:40000
9 4 240 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT 5 packets, 728 bytes)
num pkts bytes target prot opt in out source destination
2.2 iptable 参数说明:
参数 | 说明 |
---|---|
-t | 后面接table, 例如: net, filter, 默认为filter |
-L | 列出目前table 的guiz |
-n | 不进行IP 与 HOSTNAME的反查 |
-v | 列出更多信息 |
-A | 是添加到规则的末尾 |
-I | 可以插入到指定位置, 没有指定位置的话默认插入到规则的首部 |
-io | 网络接口, 例如: eth0, lo等, 需要与INPUT链配合 |
-p | 协议, 例如: tcp, udp, icmp 及 all |
-s | 来源IP或网域, 例如: 192.168.0.100, 192.168.0.0/24 若规范为不许, 加上!, 例如: -s ! 192.168.100.0/24 |
-d | 目标 IP/网域 |
-j 动作 | 主要有: ACCEPT, DROP, REJECT及记录 LOG, SNAT, DNAT |
-j SNAT–to-source | 例如: –to-source 192.168.1.210-192.168.1.220 |
-j DNAT–to–destination | 例如: –to-destination 192.168.1.18: 80 |
-j REDIRECT –to-ports | |
–sport | 来源端口或范围, 如: –sport 1024:65535 |
–dport | 目标的端口或范围 |
–syn | 主动联机的SYN |
-m | iptables 的外挂模块, 主要有: state 状态模块 mac 网络硬件地址 |
–state | 一些封包的状态, 主要有: INVALID 无效的封包, 例如数据破损的封包状态 ESTABLISHED 已经联机成功的联机状态 NEW 想要新建立联机的封包状态 RELATED 与主机发送出去的封包有关 |
–mac-source | |
–icmp-type |
2.3 针对FTP:
加入iptables 的 ip_nat_ftp, ip_conntrack_ftp 两个模块
# /etc/sysconfig/iptables-config
IPTABLES_MODULES="ip_nat_ftp ip_conntrack_ftp"
2.4 常用设置脚本:
#!/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin;
export PATH
# clear all
iptables -F
iptables -X
iptables -Z
# set default policy
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -N WHITELIST
iptables -N ANTI_DDOS
# common rules
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -j WHITELIST
iptables -A INPUT -j ANTI_DDOS
# 放行常用服务, SSH, HTTP, HTTPS, FTP
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -p tcp --dport 8081 -j ACCEPT
# iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
# whitelist example
iptables -A WHITELIST -s 192.168.139.1 -p all -j ACCEPT
# ANTI_DDOS example
iptables -A ANTI_DDOS -s 192.168.139.1 -p all -j DROP
icmp_type="0 3 3/4 4 8 11 12 14 16 18"
for typeicmp in $icmp_type
do
iptables -A INPUT -p icmp --icmp-type $typeicmp -j ACCEPT
done
# save
if [ -e /etc/redhat-release ]
then
service iptables save
service iptables restart
fi
# ubuntu ifupdown
if [[ `head -1 /etc/issue` = Ubuntu* ]]
then
echo "pre-up iptables-restore < /etc/network/iptables.up.rules" >> /etc/network/interfaces
echo "post-down iptables-save > /etc/network/iptables.up.rules" >> /etc/network/interfaces
fi
2.5 删除规则:
删除用-D参数
iptables -D INPUT 5
2.6 进阶设置NAT
# 端口转发 8080 -> 80
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j REDIRECT --to-ports 80
2.7 UFW(Uncomplicated Firewall)
是Ubuntu系统上配置iptables防火墙的工具。UFW提供一个非常友好的命令用于创建基于IPV4, IPV6的防火墙规则。由于Ubuntu下的iptables操作起来比较复杂, 依赖关系比较多, 所以使用UFW时可以简化很多操作。
sudo ufw enable # 启用
sudo ufw default deny # 作用: 开启了防火墙并随系统启动同时关闭所有外部对本机的访问(本机访问外部正常)。
sudo ufw disable # 关闭
sudo ufw status # 查看防火墙状态
sudo ufw reset # 重置所有规则
# ---
# 慎重使用iptables – 来清空所有链的规则, 尽量避免ufw与iptables同时使用。
# ---
2.8 ubuntu 1.8+ 设置自动保存和加载
2.8.1 设置 /etc/netplan/50-cloud-init.yaml
network:
version: 2
renderer: networkd
# netplan apply
2.8.2 networkd-dispatcher 配置启动脚本
- up脚本/etc/networkd-dispatcher/routable.d/50-ifup-hooks
- down脚本/etc/networkd-dispatcher/off.d/50-ifdown-hooks
#!/bin/sh
for d in up pre-up; do
hookdir=/etc/network/if-${d}.d
[ -e $hookdir ] && /bin/run-parts $hookdir
done
exit 0
#!/bin/sh
for d in down post-down; do
hookdir=/etc/network/if-${d}.d
[ -e $hookdir ] && /bin/run-parts $hookdir
done
exit 0
2.8.3 iptable启动和关闭示例
# 在/etc/network/if-pre-up.d 下新建iptable文件
#!/bin/sh
iptables-restore < /etc/iptables.up.rules
# 在/etc/network/if-post-down.d 下新建iptable文件
#!/bin/sh
iptables-save > /etc/iptables.up.rules
3. 其他安全设置
3.1 /etc/hosts.deny 和 /etc/hosts.allow
3.1.1 hosts.deny 和hosts.allow 配置
# 拒绝所有的ip链接ssh服务
# 在/etc/hosts.deny中加入
sshd:all
# 拒绝单个IP
sshd:xx.xx.xxx.xxx:deny
#在/etc/hosts.allow中加入
sshd:all
#允许单个IP
ssh:xxx.xxx.xxx.xxx:allow
3.1.2 hosts.deny 和hosts.allow 配置不生效
/etc/hosts.allow 与 /etc/hosts.deny 只对调用了 tcp_wrappers 的才起作用。
- 寻找了
libwrap.so
在起效果机器下, 执行如下命令:
ldd /usr/sbin/sshd | grep libwrap.so
libwrap.so.0 => /lib/x86_64-linux-gnu/libwrap.so.0 (0x00007f545056d000)
- 在生效的机器上执行:
rpm -qf /lib64/libwrap.so.0
tcp_wrappers-libs-7.6-77.el7.x86_64
- 在不生效的机器上
yum install -y tcp_wrappers
安装后, 用ldd /usr/sbin/sshd | grep libwrap.so
还是没有内容
- 在不生效机器上, 继续
yum list |grep openssh
Repodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fast
openssh.x86_64 7.4p1-21.el7 @base
openssh-clients.x86_64 7.4p1-21.el7 @base
openssh-server.x86_64 7.4p1-21.el7 @base
gsi-openssh.x86_64 7.4p1-5.el7 epel
gsi-openssh-clients.x86_64 7.4p1-5.el7 epel
gsi-openssh-server.x86_64 7.4p1-5.el7 epel
lxqt-openssh-askpass.x86_64 0.14.1-3.el7 epel
lxqt-openssh-askpass-l10n.noarch 0.11.2-3.el7 epel
lxqt-openssh-askpass-l10n.x86_64 0.14.1-3.el7 epel
openssh-askpass.x86_64 7.4p1-21.el7 base
openssh-cavs.x86_64 7.4p1-21.el7 base
openssh-keycat.x86_64 7.4p1-21.el7 base
openssh-ldap.x86_64 7.4p1-21.el7 base
openssh-server-sysvinit.x86_64 7.4p1-21.el7 base
于是, 执行:
yum update -y openssh
再次执行:
ldd /usr/sbin/sshd | grep libwrap.so
有结果显示了。
别的服务器链接该服务器, 也会报下面的错误
ssh_exchange_identification: Connection closed by remote host
vim /etc/ssh/sshd_config
#UsePrivilegeSeparation sandbox , 注释掉
重启sshd进程, service sshd restart