红联Linux门户
Linux帮助

菜鸟redhat9调试笔记(linux下的防火墙)

发布时间:2006-02-05 10:22:06来源:红联作者:reing
最近忙于研究LFS和Gentoo,所以好久没写调试笔记,大家一定等者我的下一篇吧!
今天给大家将iptables,即linux下的防火墙


1. 安装我不讲了,RH9的rpm安装方式非常简单,大家只要在rh的安装源盘找到相应的rpm包就行。

然后 rpm -Uvh iptables-?.i386.rpm


2. 我们今天调试的环境是一台双网卡的服务器,通过DDN固定ip地址上网,两块网卡分别是
eth0: 211.101.251.4 外部ip地址,直接上网
eth1: 192.168.0.1 内部网卡地址,连接192.168.0.0/255.255.255.0网断局域网

3.客户端A是台WWW,地址是192.168.0.2。我们将利用后面的DNAT功能,让外面的机器能访问这台机器的www服务。其他客户端都在192.168.0.0/24网段,且网关都指向192.168.0.1

4. 如果大家要使用iptables的NAT功能,之前我们要确保系统内核配置的是正确的,我的iptables好几次就因为内核编译错误,造成客户端不能正常使用SNAT功能,甚至不能加载ip_tables模块。这是一般的内核配置,基本上iptables的NAT功能能正常使用,内核版本不同可能显示不一样,大家灵活掌握就行,应该不会出现麻烦。


引用:
Networking options --->
[*] Network packet filtering (replaces ipchains)
[*] TCP/IP networking
IP: Netfilter Configuration --->
Connection tracking (required for masq/NAT) (NEW)
FTP protocol support (NEW)
IP tables support (required for filtering/masq/NAT) (NEW)
limit match support (NEW)
MAC address match support (NEW)
netfilter MARK match support (NEW)
Multiple port match support (NEW)
TOS match support (NEW)
tcpmss match support (NEW)
Connection state match support (NEW)
Packet filtering (NEW)
REJECT target support (NEW)
Full NAT (NEW)
MASQUERADE target support (NEW)
REDIRECT target support (NEW)
Packet mangling (NEW)
TOS target support (NEW)
MARK target support (NEW)
LOG target support (NEW)
TCPMSS target support (NEW)
ipchains (2.2-style) support (NEW)
< > ipfwadm (2.0-style) support (NEW)



5. 我们要打开ip_forward,
直接修改/etc/sysctl.conf 这个文档,把net.ipv4.ip_forward= 1 并把前面的#去掉,或者
echo "1" > /proc/sys/net/ipv4/ip_forward ,但是下次重起还是变0,所以还是直接修改文档的好。

6. 我们在使用iptables之前,先要了解iptables的参数:

ACCEPT
接受这个封包,也就是可以通过规则检验而放行、顺利通过这个链。

DROP
丢弃这个封包,也就不能通过规则检验而被挡掉。

REJECT
与 DROP 一样,但会向来源地送出 ICMP 封包,告之对方‘ port unreachable ’的错误信息。

REDIRECT
将封包重导至 本机端 的其它 port 。

SNAT / DNAT / MASQUERADE
这些都是 NAT 的处理,视要求而修改为特定的 Source Socket 或 Destination Socket 、或动态的根据路由判断後的界面而修改 Source Socket 。

建立一个新的(自定)链 ( -N )。
删除一个空的(自定)链 ( -X )。
改变一个内建链的原则 ( -P )。
列出一个链中的规则 ( -L )。
清除一个(内建)链中的所有规则 ( -F )。
在一个链的最後面新增( append ) 一条规则 ( -A )。
在链内某个位置插入( insert ) 一条新规则( -I )。
在链内某个位置替换( replace ) 一条规则 ( -R )。
在链内某个位置删除( delete ) 一条规则 ( -D )。
删除(delete) 链内第一条符合的规则 (-D)。
在 iptables 中,要指定规则是欲作用在那一个规则表上(使用 -t 来指定,如 -t nat),若不指定,则预设是作用在 filter 这个表。


封包于防火墙中的流向 ( INPUT、OUTPUT、FORWARD )
相关界面 ( -i 或 -o )
所属协定 ( -p )
连线类型 ( -m state )
封包类型 ( --syn )
来源地 ( -s )
来源端口 ( --sport )
目的地 ( -d )
目的地端口 ( --dport )


好了,开始工作!

首先查看一下机器上的有关于iptables的设定情况
作法如下:

iptables -L -n 或者 iptablse -t nat -L -n

定义参数

$DDN_IP="211.101.251.4"

如果你以前调试过iptables那么我们先清除先前的设定

iptables -F 清除预设表 filter 中,所有规则链中的规则

iptables -X 清除预设表 filter 中,使用者自订链中的规则

iptables -F -t mangle 清除mangle表中,所有规则链中的规则

以此类推:

iptables -t mangle -X 清除mangle表中,使用者自订链中的规则

iptables -F -t nat 清除nat表中,所有规则链中的规则

iptables -t nat -X 清除nat表中,使用者自订链中的规则

首先我们来设置 filter table 的预设策略

引用:
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT


当然我们也可以使用DROP,但一般我们不会这么做

接下来配置nat tables表

&&一个典型的例子IP 伪装(SNAT应用),即局域网网所有的机器都通过eth0做的透明网关出去,不做其他限制,

iptables -t nat -A POSTROUTING -o eth0 -s 192.168.0.0/24 -j MASQUERADE

假如你的上网方式是adsl拨号上网,adsl接口是ppp0,那么也可以这么设置
iptables -t nat -A POSTROUTING -o ppp0 -s 192.168.0.0/24 -j MASQUERADE


好了,现在我们要把这些命令保存为策略文件,好让iptables认出

/etc/rc.d/init.d/iptables save 系统会根据你刚才输入的命令保存为一个策略配置文件/etc/sysconfig/iptables

然后我们运行/etc/rc.d/init.d/iptables start 启动iptables,并加载配置文件

好了现在你的局域网客户端都可以通过这台服务器上网,ftp,qq,www都没有限制,因为我们现在设置的是透明的防火墙。我们总结一下刚才的命令是:


引用:
源码:--------------------------------------------------------------------------------
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.0.0/24 -j MASQUERADE
/etc/rc.d/init.d/iptables save
/etc/rc.d/init.d/iptables start
--------------------------------------------------------------------------------



&&另外一个典型的例子是DNAT,利用转址、转 port 的方式,使外网的封包,可以到达内网中的服务器主机,俗称虚拟主机。这种方式可保护服务器主机大部份的 port 不被外界存取,只开放公开服务的通道(如 Web Server port 80),因此安全性较高。

比如: 凡对 211.101.251.4:80 连线者, 则转址至 192.168.0.2:80

iptables -t nat -A PREROUTING -i eth0 -p tcp -d 211.101.251.4 --dprot 80 -j DNAT --to-distination 192.168.0.2:80

同样DNAT还可以利用在DMZ区域的mail,FTP等服务,大家就安需自己写吧!

以上讲的策略对大多数朋友来说已经绰绰有余了,但有些公司的老板可不是这么想,老板们往往希望员工好好工作,除了能上网收信以外,其他的诸如FTP,QQ一律静止,这样的话iptables的设置就比较大,我们不能简单的MASQUERADE。比如我们现在只开放53(dns)80,25,110三个端口用来平时的www和mail服务,那么我们就可以这样设置


源码:--------------------------------------------------------------------------------
ptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
iptables -t nat -P POSTROUTING ACCEPT

iptables -t nat -A POSTROUTING -o eth0 -s 192.168.0.0/24 -j SNAT --to-source 211.101.251.4
1192.168.0.0/24 这个网段,伪装成 211.101.251.4 出去。

iptables -A OUTPUT -o eth0 -p tcp -s 211.101.251.4 --sport 1024:65535 -d any/0 --dport 80 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 80 -d 211.101.251.4 --dport 1024:65535 -j ACCEPT
开放内网可以观看外网的网站。

iptables -A OUTPUT -o eth0 -p tcp -s 211.101.251.4 --sport 1024:65535 -d any/0 --dport 25 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 25 -d 211.101.251.4 --dport 1024:65525 -j ACCEPT
你可以送信给别人

iptables -A OUTPUT -o eth0 -p tcp -s 211.101.251.4 --sport 1024:65535 -d any/0 --dport 110 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 110 -d 211.101.251.4 --dport 1024:65535 -j ACCEPT
开放内网可以对外网的 POP3 server 取信件。

iptables -A OUTPUT -o eth0 -p udp -s 211.101.251.4 --sport 1024:65535 -d any/0 --dport 53 -j ACCEPT
iptables -A INPUT -i eth0 -p udp -s any/0 --sport 53 -d 211.101.251.4 --dport 1024:65535 -j ACCEPT
开放查询外网的 DNS 主机

iptables -A OUTPUT -o eth0 -p icmp -s 211.101.251.4 --icmp-type 8 -d any/0 -j ACCEPT
iptables -A INPUT -i eth0 -p icm -s any/0 --icmp-type 0 -d 211.101.251.4 -j ACCEPT
开放 ping功能



好了,差不多了大家学的怎么样,反正这些已经够你用了,其他的你就举一反三吧!

这里还要讲的是我的服务器是运行着squid服务,由于带宽有限,所以虽然开了透明SNAT功能,但还是希望客户端特别是www的访问还是使用squid服务,这样可以节省不少带宽资源,这里我们就可以用到iptables的Transparent功能,让iptables的客户端80端口的访问强行转移到squid的3128端口,

首先,修改 /etc/squid/squid.conf,找到下面几行,并修改为如下样子:

httpd_accel_host redhat.frankhome.com # 请修改为您的 squid 主机名称
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on
然后/etc/rc.d/init.d/squid restart

接着添加以下策略:
iptables -t nat -A PREROUTING -i eth1 -p tcp -s 192.168.0.0/24 --dport 80 -j REDIRECT --to-ports 3128

这时候,您的 Transparent Proxy 就起来了!如果您要测试它,可以取消 client 端的 proxy 设定,并将 squid关闭,然後测试是否不能连线(建议用一个未曾浏览过的网址来测试)?然则,再将 squid打开,如果能这样又能恢复连线的话,那就已经成功了!这样有一个好处是:以後您再也不必跑到 client 那边设定 proxy;而且,更好的地方在於:重复性的连线再也无需占用宝贵的对外频宽,速递当然也能'假性'的获得提高

ok!今天就写到这里,大家学了多少?一定要慢慢消化哦!:)
文章评论

共有 0 条评论