Tcp Wrappers

1.哪些服务支持
由super daemon (xinetd) 所管理的服务
支持libwrap.so模块的服务
yum install xinetd
chkconfig xinetd on //要先进行此命令才能看到下面的
chkconfig --list //列出的结果都可以使用tcp wrappers 来管理
ldd $(which rsyslogd sshd xinetd httpd)
for name in rsyslogd sshd xinetd httpd;do echo $name;ldd $(which $name) |grep libwrap;done//是否包含libwrap这个库

/etc/hosts.{allow|deny}的设置方式
先以/etc/hosts.allow进行优先比较,该规则符合就予以放行
再以/etc/hosts.deny比对,规则符合就予以抵挡
若不在这两个文件内,亦即规则都不符合,最终则予以放行

例子:开放本机的127.0.0.1可以进行任何本机的服务,让局域网(192.168.1.0/24可以使用rsync,同时10.0.0.100也能够使用rsync,但其他来源则不允许使用rsync\
cat /etc/xinetd.d/rsysc

vim /etc/hosts.allow
All:127.0.0.1
rsync:192.168.1.0/255.255.255.0 10.0.0.100

vim /etc/hosts.deny
rsync:All

Linux的数据包过滤软件 iptables
不同linux内核版本的防火墙软件 uname -a //查看内核版本
version2.0:使用ipfwadm
version2.2:使用ipchains这个防火墙机制
version2.4与2.6:主要使用iptables这个防火墙机制

2.iptables语法
iptables [-t tables] [-L] [-nv]
选项与参数:
-t:后面接table,例如nat或filter,若省略此项目,则使用默认的filter
-L:列出目前的table的规则
-n:不进行IP与HOSTNAME的反查,显示信息的速度会快很多
-v:列出更多的信息,包括通过该规则的数据包总位数,相关的网络接口
范例:列出filter table 3 条链的规则
iptables -L -n
范例:列出nat table 3 条链的规则
iptables -t nat -L -n
target:代表进行的操作,ACCEPT是放行,而REJECT则是拒绝,此外,尚有DROP(丢弃)的项目
prot:代表使用的数据包协议,主要有TCP、UDP及ICMP3中数据包格式
opt:额外的选项说明
source:代表此规则是针对哪个来源IP进行限制
destination:代表此规则是针对哪个目标IP进行限制
iptables-save [-t table] //会列出完整的防火墙规则,只是并没有格式化输出而已
选项与参数:
-t:可以仅针对某些表格来输出,例如仅针对NAT或Filter等

iptables-save
iptables [-t tables] [-FXZ]
选项与参数:
-F:清除所有的已定制的规则
-X:除掉所有用户自定义的chain(应该说的是tables)
-Z:将所有的chain的计数与流量统计都归零
范例:清除本机防火墙(filter)的所有规则
iptables -F
iptables -X
iptables -Z

定义默认策略
当数据包不在我们设置的规则之内时,则该数据包的通过与否,是以Policy的设置为准
iptables [-t nat] -P [INPUT,OUTPUT,FORWARD] [ACCEPT,DROP]
选项与参数:
-P:定义策略(Policy)。注意,这个P为大写
ACCEPT:该数据包可接受
DROP:该数据包直接丢弃,不会让Client端知道为何丢弃
范例:将本机的INPUT设置为DROP,其他设置未ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables-save

数据包的基础比对:ip、网络及接口设备
iptables [-AI 链名] [-io 网络接口] [-p 协议] [-s 来源IP/网络] [-d 目标IP/网络] -j [ACCEPT|DROP|REJECT|LOG]
选项与参数:
-AI 链名:针对某条链进行规则的插入或累加
-A:新增加一条规则,该规则增加在原规则的最后面。例如原来已经有四条规则,使用-A就可以加上第五条规则
-I:插入一条规则。如果没有指定此规则的顺序,默认是插入变成第一条规则。例如原本有四条规则,使用-I则该规则变成第一条,原本四条变成2-5条
链:有input/output/forward等,此链名称又与-io有关
-io:网络接口,设置数据包进出的接口规范
-i:数据包所进入的那个网络接口,例如eth0、lo等接口。需要INPUT链配合
-o:数据包所传出的那个网络接口,需要与output配合
-p:协定:设置此规则适用于哪种数据包格式
主要的数据包格式有:tcp udp icmp 及 all
-s:来源 IP/网络,设置此规则之数据包的来源地址,可指定当单纯的ip或网络,例如:

IP:192.168.0.100
网络:192.168.0.0/24 192.168.0.0/255.255.255.0
若规范为不许时,则加上!即可,例如 -s ! 192.168.100.0/24 表示不接受192.168.100.0/24
-d:目标 IP/网络 同 -s ,只不过这里指的是目标的IP或网络
-j:后面接操作,主要的操作有接受ACCEPT 丢弃DROP、拒绝REJECT 及记录LOG
范例:设置lo成为受细嫩的设备,亦即进出lo的数据包都予以接受
iptables -A INPUT -i lo -j ACCEPT
范例:只要是来自网络的192.168.100.0/24的数据包就通通接受
iptables -A INPUT -i eth1 -s 192.168.100.0/24 -j ACCEPT
范例:只要是来自192.168.100.10就接受,但来自192.168.100.230 这个恶意来源的就丢弃
iptables -A INPUT -i eth1 -s 192.168.100.10 -j ACCEPT
iptables -A INPUT -i eth1 -s 192.168.100.230 -j DROP
iptables-save //查看
如果已经放行了192.168.100.0/24,那这个 192.168.100.230 -j DROP 就不会被用到了,如果想要记录
iptables -A INPUT -s 192.168.2.200 -j LOG
iptables -L -n

TCP、UDP的规则比对:针对端口设置
iptables [-AI 链] [-io 网络接口] [-p tcp,udp] [-s 来源IP/网络] [--sport 端口范围] [-d 目标IP/网络] [--dport 端口范围] -j [ACCEPT|DROP|REJECT]
选项与参数:
--sport 端口范围:限制来源的端口号码,端口号码可以是连续的,例如1024:65535
--dport 端口范围:限制目标的端口号码
想要使用--dport --sport时,需要加上-p tcp或-p udp的参数才能成功
范例:想要连接进入本机port 21 的数据包都阻挡掉
iptables -A INPUT -i eth0 -p tcp --dport 21 -j DROP
范例:想连接到本台主机的网上邻居(udp port 137,138 tcp port 139 445)就放行
iptables -A INPUT -i eth0 -p udp --dport 137:138 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 139 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 445 -j ACCEPT
范例:只要来自192.168.1.0/24的1024:65535端口的数据包,且想要连接到本机的ssh port就予以阻挡,可以这样做
iptables -A INPUT -i eth0 -p tcp -s 192.168.1.0/24 --sport 1024:65535 --dport ssh -j DROP
范例:将来自任何地方来源 port 1:1023的主动连接到本机端的1:1023连接丢弃 ,主动连接的SYN标志
iptables -A INPUT -i eth0 -p tcp --sport 1:1023 --dport 1:1023 --syn -j DROP

iptables 外挂模块:mac与state
iptables -A INPUT [-m state] [--state 状态]
选项与参数:
-m:一些iptables的外挂模块,主要常见的有
state:状态模块
mac:网卡硬件地址
--state:一些数据包的状态,主要有
INVALID:无效的数据包,例如数据破损的数据包状态
ESTABLISHED:已经连接成功的连接状态
NEW:想要新建立连接的数据包状态
RELATED:这个最常用、表示这个数据包是与主机发送出去的数据有关
范例:只要已建立连接或与已发出请求相关的数据包就予以通过,不合法数据就丢弃
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -m state --state INVALID -j DROP
范例:针对局域网内的aa:bb:cc:dd:ee:ff 主机开放其连接
iptables -A INPUT -m mac --mac-source aa:bb:cc:dd:ee:ff -j ACCEPT //--mac-source:就是来源主机的mac

ICMP数据包规则的比对:针对是否响应ping来设置
iptables -A INPUT [-p icmp] [--icmp-type 类型] -j ACCEPT
选项与参数:
--icmp-type:后面必须要接ICMP的数据包类型,也可以使用代号,例如 8 代表 echo request 的意思
范例:让0,3,4,11,12,14,16,18的icmp type可以进入主机
vim somefile
!/bin/bash
icmp_type = "0,3,4,11,12,14,16,18"
for typeicmp in $icmp_type
do
iptables -A INPUT -i eth0 -p icmp --icmp-type $icmp_type -j ACCEPT
done

sh somefile

超简单的客户端防火墙设计与防火墙规则存储
规则: 规则清零 默认策略 信任本机 回应数据包 信任用户
vim bin/firewall.sh
!/bin/bash
PATH=/sbin:/bin:/usr/sbin/:/usr/bin;export PATH
1.清除规则
iptables -F
iptables -X
iptables -Z

2.设置策略
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
3-5 指定各项规则
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT

iptables -A INPUT eth0 -s 192.168.0.1/24 -j ACCEPT0
6 写入防火墙规则配置文件
/etc/init.d/iptables save

sh bin/firewall.sh //执行脚本

IPv4的内核管理功能:/proc/sys/net/ipv4/*
/proc/sys/net/ipv4/tcp_syncookies
echo "1" > /proc/sys/net/ipv4/tcp_syncookies
当启动SYN Cookie 时,主机在发送SYN/ACK确认数据包前,会要求Client端在短时间内回复一个序号,包括IP PORT等。若正确,则为可信任的。
不适合用在负载很高的服务器内。

2./proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
内核取消ping回应的设置值有两个,分别是/proc/sys/net/ipv4内的icmp_echo_ignore_broadcasts(仅有ping broadcast地址时才取消ping的回应)及icmp_echo_ignore_all(全部的ping都不回应).建议设置icmp_echo_ignore_broadcasts
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

3./proc/sys/net/ipv4/conf/网络接口/*
例如 /proc/sys/net/ipv4/conf/eth0/内
rp_filter:称为你想路径过滤,可以通过分析网络接口的路由信息,配合数据包的来源地址,分析数据包是否为合理.不合理则予以丢弃,建议启动
log_martisans:这个设置数据可以用来启动记录不合法的ip来源的功能

设置单机防火墙的一个实例
外部网络使用eth0(如果是拨号,有可能使用ppp0)
内部网络使用eth1,且内部使用192.168.100.0/24这个class
主机默认开放的服务有www ssh https等
实际设置
iptables.rule:设置最基本的规则,包括清除防火墙规则、加载模块、设置服务可接受等.
iptables.deny:设置独挡某些而已主机的进入
iptables.allow:设置允许某些自定义的后门来源主机进入

mkdir -p /usr/local/action/iptables
cd /usr/local/action/iptables
vim iptables.rule
!/bin/bash
请先输入您的相关参数,不要输入错误了!
EXTIF="eth0" # 这个是可以连上 Public IP 的网络接口
INIF="eth1" # 内部 LAN 的连接接口;若无则写成 INIF=""
INNET="192.168.100.0/24" # 若无内部网域接口,请填写成 INNET=""
export EXTIF INIF INNET

第一部份,针对本机的防火墙设定!

  1. 先设定好核心的网络功能:
    echo "1" > /proc/sys/net/ipv4/tcp_syncookies
    echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
    for i in /proc/sys/net/ipv4/conf//{rp_filter,log_martians}; do
    echo "1" > $i
    done
    for i in /proc/sys/net/ipv4/conf//{accept_source_route,accept_redirects,\
    send_redirects}; do
    echo "0" > $i
    done

  2. 清除规则、设定默认政策及开放 lo 与相关的设定值
    PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin; export PATH
    iptables -F
    iptables -X
    iptables -Z
    iptables -P INPUT DROP
    iptables -P OUTPUT ACCEPT
    iptables -P FORWARD ACCEPT
    iptables -A INPUT -i lo -j ACCEPT
    iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

  3. 启动额外的防火墙 script 模块
    if [ -f /usr/local/virus/iptables/iptables.deny ]; then
    sh /usr/local/virus/iptables/iptables.deny
    fi
    if [ -f /usr/local/virus/iptables/iptables.allow ]; then
    sh /usr/local/virus/iptables/iptables.allow
    fi
    if [ -f /usr/local/virus/httpd-err/iptables.http ]; then
    sh /usr/local/virus/httpd-err/iptables.http
    fi

  4. 允许某些类型的 ICMP 封包进入
    AICMP="0 3 3/4 4 11 12 14 16 18"
    for tyicmp in $AICMP
    do
    iptables -A INPUT -i $EXTIF -p icmp --icmp-type $tyicmp -j ACCEPT
    done

  5. 允许某些服务的进入,请依照你自己的环境开启
    iptables -A INPUT -p TCP -i $EXTIF --dport 21 --sport 1024:65534 -j ACCEPT # FTP
    iptables -A INPUT -p TCP -i $EXTIF --dport 22 --sport 1024:65534 -j ACCEPT # SSH
    iptables -A INPUT -p TCP -i $EXTIF --dport 25 --sport 1024:65534 -j ACCEPT # SMTP
    iptables -A INPUT -p UDP -i $EXTIF --dport 53 --sport 1024:65534 -j ACCEPT # DNS
    iptables -A INPUT -p TCP -i $EXTIF --dport 53 --sport 1024:65534 -j ACCEPT # DNS
    iptables -A INPUT -p TCP -i $EXTIF --dport 80 --sport 1024:65534 -j ACCEPT # WWW
    iptables -A INPUT -p TCP -i $EXTIF --dport 110 --sport 1024:65534 -j ACCEPT # POP3
    iptables -A INPUT -p TCP -i $EXTIF --dport 443 --sport 1024:65534 -j ACCEPT # HTTPS

第二部份,针对后端主机的防火墙设定!###############################

  1. 先加载一些有用的模块
    modules="ip_tables iptable_nat ip_nat_ftp ip_nat_irc ip_conntrack
    ip_conntrack_ftp ip_conntrack_irc"
    for mod in $modules
    do
    testmod=lsmod | grep "^${mod} " | awk '{print $1}'
    if [ "$testmod" == "" ]; then
    modprobe $mod
    fi
    done

  2. 清除 NAT table 的规则吧!
    iptables -F -t nat
    iptables -X -t nat
    iptables -Z -t nat
    iptables -t nat -P PREROUTING ACCEPT
    iptables -t nat -P POSTROUTING ACCEPT
    iptables -t nat -P OUTPUT ACCEPT

  3. 若有内部接口的存在 (双网卡) 开放成为路由器,且为 IP 分享器!
    if [ "$INIF" != "" ]; then
    iptables -A INPUT -i $INIF -j ACCEPT
    echo "1" > /proc/sys/net/ipv4/ip_forward
    if [ "$INNET" != "" ]; then
    for innet in $INNET
    do
    iptables -t nat -A POSTROUTING -s $innet -o $EXTIF -j MASQUERADE
    done
    fi
    fi
    如果你的 MSN 一直无法联机,或者是某些网站 OK 某些网站不 OK,
    可能是 MTU 的问题,那你可以将底下这一行给他取消批注来启动 MTU 限制范围
    iptables -A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -m tcpmss \
    --mss 1400:1536 -j TCPMSS --clamp-mss-to-pmtu

  4. NAT 服务器后端的 LAN 内对外之服务器设定
    iptables -t nat -A PREROUTING -p tcp -i $EXTIF --dport 80 -j DNAT --to-destination 192.168.1.210:80 # WWW

  5. 特殊的功能,包括 Windows 远程桌面所产生的规则,假设桌面主机为 1.2.3.4
    iptables -t nat -A PREROUTING -p tcp -s 1.2.3.4 --dport 6000 -j DNAT --to-destination 192.168.100.10
    iptables -t nat -A PREROUTING -p tcp -s 1.2.3.4 --sport 3389 -j DNAT --to-destination 192.168.100.20

  6. 最终将这些功能储存下来吧!
    /etc/init.d/iptables save

------------------------ 脚本end

假如我要让一个 140.116.44.0/24 这个网域的所有主机来源可以进入我的主机的话,那么这个档案的内容可以写成这样:

[root@www iptables]# vim iptables.allow

!/bin/bash
底下则填写你允许进入本机的其他网域或主机啊!
iptables -A INPUT -i $EXTIF -s 140.116.44.0/24 -j ACCEPT

底下则是关于抵挡的档案设定法!
[root@www iptables]# vim iptables.deny

!/bin/bash
底下填写的是『你要抵挡的那个咚咚!』
iptables -A INPUT -i $EXTIF -s 140.116.44.254 -j DROP

[root@www iptables]# chmod 700 iptables.*

范例:假设对外的 IP 固定为 192.168.1.100 ,若不想使用伪装,该如何处理?

iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 192.168.1.100

范例:假设你的 NAT 服务器对外 IP 有好几个,那你想要轮流使用不同的 IP 时,又该如何设定?举例来说,你的 IP 范围为 192.168.1.210~192.168.1.220

iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 192.168.1.210-192.168.1.220

范例:假设内网有部主机 IP 为 192.168.100.10 ,该主机是可对 Internet 开放的 WWW 服务器。你该如何透过 NAT 机制,将 WWW 封包传到该主机上?

假设 public IP 所在的接口为 eth0 ,那么你的规则就是:

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.100.10:80

-j REDIRECT --to-ports

这个也挺常见的,基本上,就是进行本机上面 port 的转换就是了!
不过,特别留意的是,这个动作仅能够在 nat table 的 PREROUTING 以及
OUTPUT 链上面实行而已喔!

范例:将要求与 80 联机的封包转递到 8080 这个 port

[root@www ~]# iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080

这玩意最容易在你使用了非正规的 port 来进行某些 well known 的协议,
例如使用 8080 这个 port 来启动 WWW ,但是别人都以 port 80 来联机,
所以,你就可以使用上面的方式来将对方对你主机的联机传递到 8080 啰!