服务器架设篇 - RedHat 9

番外篇-小州老师的 iptables 补充说明

番外篇-小州老师的 iptables 补充说明

最近更新时间: 200x/xx/xx

本文数据主要针对 RedHat 9 的系统进行说明,要注意的是,RedHat 9 与 Red Hat Enterprise Linux (RHEL) 是完全不同的东西!RedHat 9 在 2003 年推出,在 2004 年就不再维护了!这部份网站更新到 2005 年,也没有再维护过! 因此,建议您前往本站查找最新版本的 Linux distribution 文章来阅读,比较不会浪费时间。那为何还需要编辑 RedHat 9 的数据呢? 鸟哥只想要做个自己曾经撰写过的文档内容保存而已啰! ^_^!最新文章请前往鸟站首页查阅啰!


[文档]使用 iptables 设置使用 NAT 分享网络带宽
作者: kenduest (小州) 站内: LinuxNetwork
标题: [文档]使用 iptables 设置使用 NAT 分享网络带宽
时间: Tue May 15 19:09:03 2001

Linux 上使用 IP-Masquerade 所谓的 IP 儰装以便于达成该功能。

Linux 上的 IPMASQ 因为 kernel 一些内核功能有调整过,所以相关的设置工具
因为不同的内核版本所以不同.

kernel 2.0.x 时代,是使用 ipfwadm 程序。(这个说法不算是完全正确)

kernel 2.1.x/2.2.x 时代,则是使用 ipchains 程序

kernel 2.3.x/2.4.x 时代,使用 netfilter 过滤机制, 是使用
iptables 程序。

演进来看,目前 kernel 2.4 配合使用 netfilter 内核过滤机制,
可以达到的功能相当棒.... 那 netfilter 提供那些机制呢?
比方:

1. 传统 ipchains 的任何功能(基本来源与目的封包过滤、导向、伪装)
2. 提供 Source NAT 与 Destination NAT 的功能
3. 可以针对特定用户、群组、PID 等限制网络链接的过滤访问
4. 可以设置封包在 Routing Table 进出前时先预先处理
5. 提供可以让 UserSpace 的程序处理 filter 部分。
6. 可以针对外面自动创建、与现有连接有关这类连接过滤处理...
7. 可以针对 Mac 卡号处理。

ipmasq 的文档,那边可以阅读呢? linux 本身提供的 howto 很足够了...

使用 ipfwadm/ipchains 等程序的 kernel 环境,可以参考:

http://www.linux.org.tw/CLDP/IP-Masquerade-HOWTO.html

不过该版文档中文翻译已经太久没有更新了,建议找原文的
IP-Masquerade-HOWTO 文档。那边找呢?可以上这里找找:

http://www.linuxdoc.org

里面提到了包含 port forward 等相关重要的信息。比方
ipmasqadm 等程序的使用。

若是您目前使用 kernel 2.3/2.4,可以参考这给篇中译文:

http://www.linux.org.tw/CLDP/NAT-HOWTO.html

http://www.linux.org.tw/CLDP/Packet-Filtering-HOWTO.html

相同的,原文部份,上 http://www.linuxdoc.org 也有喔..

当然,若是您的 linux dist 版本是最近的,那系统安装好的
HOWTO 文档应该也可以找到..

ok.. 若是您目前要使用 nat 功能的话,首先就是确定您的内核是支持
linux firewall 与 ip masquerade 功能... 不过目前许多 Linux
Distribution 都已经把 IP Masquerade 支持编入到 kernel 内了,
所以重编 kernel 的部份可以略过....

当然啦,目前 kernel 2.4.0 正式 release 出没有多久,所以若是
您打算使用 netfilter 提供的一些先进的机制,那您需要先更新
内核到 2.4,编译内核时要选择把 netfilter 提供的一些功能打开..
(可以选择编入内核 或者是编译成为 module)

这里环境,假设:

对外 internet 链接的 ip 是: 210.1.1.1
对内的部份,使用 192.168.1.1

当然,您需要两张网络卡,一张就是设置 210.1.1.1,另外一张
就是设置 192.168.1.1 (netmask: 255.255.255.0)

另外提到,有人会说到也许可以使用 ip aliases 达到一张网络卡
就可以有两个 ip .. 当然,这是可行的.. 不过弟不建议使用在
nat 的环境下.. 一者是因为一般 nat 多半充当 firewall,而
若是使用 ip aliases 后对外与对内的封包都跑在同一个 interface
上,那就失去封包过滤功能了... 而不同区段的封包跑在一起,网络
性能也是会变差的...

OK.. 目前要启动 nat/ipmasq 功能的话,首先就是只要 Linux 主机把
IP Forwarding 打开 (ip 转送),并使用 ipchains/iptables 等这类程序
设置好后,Client 端就可以通过 Linux 这台 gateway 主机的协助而上网了。

kernel 2.2.x :

echo "1" > /proc/sys/net/ipv4/ip_forward
ipchains -P forward DENY
ipchains -A forward -i eth0 -j MASQ -s 192.168.1.0/24
ipchains -M -S 86400 86400 360 <-- 这是让 timeout 拉长一点
modprobe ip_masq_ftp <-- 挂入 ftp 等 module 处理 ftp 相关链接问题

当然,我想另外的一些 ipmasq module 一起挂入也许比较完整一点...

ip_masq_cuseeme、ip_masq_irc、ip_masq_mfw、ip_masq_pptp、
ip_masq_quake、ip_masq_raudio、ip_masq_user、ip_masq_vdolive ..

kernel 2.3.x/2.4.x :

echo "1" > /proc/sys/net/ipv4/ip_forward
modprobe ip_tables # 这是编译内核是选择 module 才需要
modprobe ip_nat_ftp # 同上,处理 ftp 等链接问题
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobn ip_conntrack_irc
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.0/24 -j MASQUERADE

上面等使用上,请先注意各位系统目前缺省每个 INPUT、OUTPUT、FORWARD CHAIN
是不是为 ACCEPT ,而不是 DROP/DENY 或者是 REJECT。

for kernel 2.2 :

ipchains -P input ACCEPT
ipchains -P output ACCEPT
ipchains -P forward ACCEPT

若是要把就有规则清除,可以补上:

ipchains -F
ipchains -X

for kernel 2.4 :

iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

若是要把就有规则清除,可以补上:

iptables -F
iptables -X
iptables -F -t nat
iptables -X -t nat

上面很单纯的提供 nat/ipmasq 服务,没有针对一些安全性考量,比方
声称来自内部网络的 ip 范围,是由 eth0 这个对外 interface 进入的话那就
应该拒绝.... 比方像是位于 eth1 上 192.168.1.x 这段虚拟 ip 区段就
是一个例子。所以这里要说的是,若是要严谨一点的话,额外的设置是很需要的...

另外补充的,就是 port forward 部份,kernel 2.2.x 内是使用
ipmasqadm 达成:

ipmasqadm portfw -a -P tcp -L 210.1.1.1 25 -R 192.168.1.100 25

该 ipmasqadm 叙述,提供让 nat 对外主机,可以让他人使用
210.1.1.1 port 25 进行 tcp 服务链接,而该链接请求会转给内部主机
192.168.1.100 port 25 .. 简单说,这行叙述是给有一台 mail server
是放在 nat 架构内使用虚拟 ip,然后通过 nat 主机设置 port 重导
到内部的真实主机。

若是使用 kernel 2.4 的话,iptables 指令则是:

iptables -A PREROUTING -t nat -p tcp -d 210.1.1.1 \
--dport 25 -j DNAT --to 192.168.1.100:25

当然,以前有人提到,外面使用 telnet 210.1.1.1 25 的确是可以 work,
不过内部 192.168.1.x 的电脑若是 telnet 210.1.1.1 25 就不行..
那补上下面的叙述:

iptables -A OUTPUT -t nat -p tcp -d 210.1.1.1 \
--dport 25 -j DNAT --to 192.168.1.100:25

上面说的是单一 port 重导.. 若是需要的功能是全部 port 都
重导的话,比方就是使用:

iptables -A PREROUTING -t nat -p all -d 210.1.1.1 \
-j DNAT --to 192.168.1.1

ok.. 此外几点要说明的是:

1. 目前许多人都使用 adsl 宽带,若是使用计时制的话要注意的是,
因为通过 pppoe 这类程序拨接后,会产生一个 ppp0 的 interface,
然后再通过一个网络卡接口作封包的传输,所以先前的指令有指定
eth0 的叙述要改成 ppp0 才正确....

2. 使用 nat 后,使用虚拟 ip 连上网络的电脑,一般使用上应该是
不大会有问题的... 不过若是想与 internet 上的电脑玩网络
游戏对战的话,可能会发生一些问题.... 因为许多 game 的网络连接
的运作方式在 nat 架构下多半无法工作.... 一般解决方式,找看看
是否有专人写出了 ipmasq 的 module,挂入后就可以解决了...
或者是找出相关的 game 是有那些 port 的链接,然后设置好 port
forwarding 的动作即可。

关于 port forwarding 部份,这里有个链接提供很好的信息:

http://www.tsmservices.com/masq

许多 ap 程序、game 等等都有提供相关解决设置,不过都是针对
kernel 2.2.x 内配合使用 ipmasqadm 程序.. 若是是使用 kernel 2.4
的话,研究一下 iptables 指令的用法后,同样也是可以完成的。

3. 有人无法使用 icq 传文件,甚至无法正确传消息?我建议更新
icq 到 2000 等版本,然后把链接设置改成在 firewall 后面
使用,那就没有问题了...

4. 要观察目前设置规则,请使用 iptables -L 。若是当初有使用 -t xxxx
的话,请使用 iptables -L -t xxx 。ex: iptables -L -t nat

5. 先前 netfilter 内核机制有一些 bug (Connection State,Related state
bug) 会导致一些安全性的问题,see:

http://www.tempest.com.br/advisories/01-2001.html

http://netfilter.samba.org/security-fix/

(Mandrake 8.0 , the kernel is ok )

6. 若是遇到先前使用 kernel 2.2 都可以正常连接到一些站台,但是用了
kernel 2.4 后却不行得情况... 实际例子可能就是,可以 ping 到对方,
不过却连不上对方主机。

echo 0 > /proc/sys/net/ipv4/tcp_ecn

see: http://www.tux.org/lkml for more information

7. 该篇文章省略设置网络卡的步骤...

大概就是这样子了,有问题请告知,也欢迎大家讨论。

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
现代人普遍的现象: 「小学而大遗」、「舍本而逐末」
「以偏而盖全」、「因噎而废食」
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
--
※ Origin: 硕诚信息 <bbs.cynix.com.tw> 



作者: kenduest (小州) 站内: LinuxNetwork
标题: [文档]使用 iptables 设置一些安全防护功能 (1)
时间: Tue Feb 27 23:55:46 2001
 

常看到有人乱使用 port scan 软件,(ex:nmap) 来乱扫他人的 port,
实在很讨厌 @_@

这里提供几个方式,通过 linux kernel 2.4 的新内核机制 + iptables
来进行一些设限:

# NMAP FIN/URG/PSH
iptables -A INPUT -i eth0 -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP

# Xmas Tree
iptables -A INPUT -i eth0 -p tcp --tcp-flags ALL ALL -j DROP

# Another Xmas Tree
iptables -A INPUT -i eth0 -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP

# Null Scan(possibly)
iptables -A INPUT -i eth0 -p tcp --tcp-flags ALL NONE -j DROP

# SYN/RST
iptables -A INPUT -i eth0 -p tcp --tcp-flags SYN,RST SYN,RST -j DROP

# SYN/FIN -- Scan(possibly)
iptables -A INPUT -i eth0 -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP

这是针对一些像是使用 scan 软件,配合所谓的 Stealth 等机制去乱扫他人
主机时,可以把这些封包丢弃不处理。那对方一扫就卡死了,或者是
要等连接 timeout 才能够继续工作,拉长 scan 所需的时间。

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

现代人普遍的现象: 「小学而大遗」、「舍本而逐末」
「以偏而盖全」、「因噎而废食」
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
--
※ Origin: 硕诚信息 <bbs.cynix.com.tw> 



作者: kenduest (小州) 站内: LinuxNetwork
标题: [文档]使用 iptables 设置一些安全防护功能 (2)
时间: Wed Feb 28 00:13:17 2001
 

下面是我设置 iptables 的一些简单规则,可以参考一下。(与 NAT 无关喔)

# 挂入相关 module
modprobe ip_tables
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_conntrack_irc

# 重设
iptables -F
iptables -X
iptables -F -t nat
iptables -X -t mangle

# 把 FORWARD 关闭
iptables -P FORWARD DROP

# 这是打开让自己网域可以方便链接,也就是该网域不设防

iptables -A INPUT -p all -s ip_net/netmask -j ACCEPT

# 允许相关链接服务

iptables -A INPUT -i eth0 -p tcp --dport 20 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 23 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 25 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 53 -j ACCEPT
iptables -A INPUT -i eth0 -p udp --dport 53 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 110 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 113 -j ACCEPT

iptables -A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -m state --state NEW,INVALID -j DROP

上面是打开允许 port 20、21、22、23、25、53、110、113 等服务才能够
被外面所连接。

port 20、21 : ftp 使用的。
port 22 : ssh 连接
port 23 : telnet 连接。方便使用,其实不开放比较安全。
port 25 : sendmail 使用。让信件可以寄进来。
port 53 : dns 使用。dns 需要打开 udp 使用。
port 110 : pop3 使用
port 113 : auth 身份确认。我打开是让一些使用该 113 确认身份的主机
不至于反查时会卡住很久。

最后一行是对于主动连接或者是不合法连接,一律通通拒绝掉。

这个 script 内容,很适用只允许外面链接特定的 port 服务,剩下的其余
port 就拒绝外面主动创建的连接。比方使用 Modem 拨接,只希望里面可以
正常连接出去,外面都无法连接进来这个需求。(ps: modem 是使用 ppp0
等这些接口,上面的 eth0 要改成 ppp0 )

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

现代人普遍的现象: 「小学而大遗」、「舍本而逐末」
「以偏而盖全」、「因噎而废食」
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
--
※ Origin: 硕诚信息 <bbs.cynix.com.tw> 



作者: kenduest (小州) 站内: LinuxNetwork
标题: [文档]使用 iptables 设置一些安全防护功能 (3)
时间: Tue May 15 19:28:55 2001

防止 sync flood 攻击的设置:

iptables -N synfoold
iptables -A synfoold -p tcp --syn -m limit --limit 1/s -j RETURN
iptables -A synfoold -p tcp -j REJECT --reject-with tcp-reset
iptables -A INPUT -p tcp -m state --state NEW -j synfoold

这个方式对于一个很忙碌的站台来说,这个设置方式会不会有不良影响呢?
测试过一个很忙碌的站台用这个设置,老实说并不好....
所以也许可以调整时间与次数的触发值。

防止 Ping of Death :

iptables -N ping
iptables -A ping -p icmp --icmp-type echo-request -m limit --limit \
1/second -j RETURN
iptables -A ping -p icmp -j REJECT
iptables -I INPUT -p icmp --icmp-type echo-request -m state --state NEW \
-j ping

这里只有把 icmp 的 echo request 部份拒绝掉,可以视情况再调整。

或者是直接设置主机不回应 echo request 。

/proc/sys/net/ipv4/icmp_echo_ignore_all

--
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

现代人普遍的现象: 「小学而大遗」、「舍本而逐末」
「以偏而盖全」、「因噎而废食」
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
--
※ Origin: 硕诚信息 <bbs.cynix.com.tw> 



Eric 的补充心得

iptables 机制是逐条检查...
但是假设当一个封包要通过时,第一条规则已经放行通过,封包的命运已经定下来,剩余规则就不会再检查,就算剩余规则中有要挡下这个封包时也无效!

例:
规则 1 : 放行所有 80 port 的封包
规则 2 : 拒绝 210.58.221.241 80 port 封包
规则 3 ........

像这样子时,根本无法挡下 210.58.221.241 80 port 封包...
因为第 1 条规则已经先放行所有 80 port 的封包了,所以该封包早就先通过了......
正确的写法应该将规则 1 与规则 2 互换.....

其他链接
环境工程模式篇
鸟园讨论区
鸟哥旧站

今日 人数统计
昨日 人数统计
本月 人数统计
上月 人数统计