Iawen's Blog

我喜欢这样自由的随手涂鸦, 因为我喜欢风......

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 的每一个 “表” 都和不同的数据包处理有关、决定数据包是否可以穿越的是 “链”、而一条 “规则” 在链里面则可以决定是否送往下一条链(或其它的动作)。
0

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