修订历史 | ||
---|---|---|
修订版 0.09 | 2004-07-21 | 修订者: ts |
修订版 0.08 | 2002-07-11 | 修订者: jpt |
修订版 0.07 | 2002-02-27 | 修订者: jpt |
修订版 0.06 | 2001-09-08 | 修订者: jpt |
修订版 0.05 | 2001-09-07 | 修订者: jpt |
修订版 0.04 | 2001-09-01 | 修订者: jpt |
修订版 0.03 | 2001-07-06 | 修订者: jpt |
所有作者都在 irc.opensource.net 的 #debian 频道
John Tapsell (JohnFlux) 是官方维护者。
如有任何疑问、批评、反馈或约会等,请给我 (John Tapsell) 发邮件。
无耻地借鉴了 David Ranch 的工作 -<dranch@trinnet.net>.
本文档并非 IP 伪装 HOWTO 的替代品,而是对其进行补充,两者应并排阅读。本文档不包含其他 HOWTO 已涵盖的内容,也不解释所有内容的含义或目的。有关更好的指南,请参阅 http://ipmasq.cjb.net 和标准的 Masq-HOWTO。
本文档描述了如何在给定的 Linux 主机上启用 Linux IP 伪装功能。IP Masq 是一种网络地址转换 (NAT) 形式,它允许没有一个或多个已注册 Internet IP 地址的内部联网计算机通过您的 Linux 盒子的单个 Internet IP 地址与 Internet 通信。
本文档受 GNU 自由文档许可证保护
假设外部互联网网卡是 eth0,外部 IP 是 123.12.23.43,内部网卡是 eth1,那么
$> modprobe ipt_MASQUERADE # If this fails, try continuing anyway $> iptables -F; iptables -t nat -F; iptables -t mangle -F $> iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 123.12.23.43 $> echo 1 > /proc/sys/net/ipv4/ip_forward |
或者对于拨号连接
$> modprobe ipt_MASQUERADE # If this fails, try continuing anyway $> iptables -F; iptables -t nat -F; iptables -t mangle -F $> iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE $> echo 1 > /proc/sys/net/ipv4/ip_forward |
然后进行安全设置
$> iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT $> iptables -A INPUT -m state --state NEW -i ! eth0 -j ACCEPT $> iptables -P INPUT DROP #only if the first two are succesful $> iptables -A FORWARD -i eth0 -o eth0 -j REJECT |
或者对于拨号连接(内部网卡为 eth0)
$> iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT $> iptables -A INPUT -m state --state NEW -i ! ppp0 -j ACCEPT $> iptables -P INPUT DROP #only if the first two are succesful $> iptables -A FORWARD -i ppp0 -o ppp0 -j REJECT |
就是这样!要查看规则,请执行“iptables -t nat -L”
编译内核:(使用 2.4.x 或更高版本的内核)
您需要在内核中获得以下支持
在“网络选项”下
网络数据包过滤 (CONFIG_NETFILTER)
在“网络选项”->“Netfilter 配置”下
连接跟踪 (CONFIG_IP_NF_CONNTRACK)
FTP 协议支持 (CONFIG_IP_NF_FTP)
IP 表支持 (CONFIG_IP_NF_IPTABLES)
连接状态匹配支持 (CONFIG_IP_NF_MATCH_STATE)
数据包过滤 (CONFIG_IP_NF_FILTER)
REJECT 目标支持 (CONFIG_IP_NF_TARGET_REJECT)
完整 NAT (CONFIG_IP_NF_NAT)
MASQUERADE 目标支持 (CONFIG_IP_NF_TARGET_MASQUERADE)
REDIRECT 目标支持 (CONFIG_IP_NF_TARGET_REDIRECT)
数据包修改 (CONFIG_IP_NF_MANGLE)
LOG 目标支持 (CONFIG_IP_NF_TARGET_LOG)
首先,如果 iptable 和 masq 模块未编译到内核中且未安装,但作为模块存在,则我们需要安装它们。如果您 insmod ipt_MASQUERADE,它将加载 ip_tables、ip_conntrack 和 iptable_nat。
$> modprobe ipt_MASQERADE |
现在,无论是您的 Intranet 很大,还是您只是想让两三台机器在互联网上工作 - 这两种方式都没有太大区别。
好的,我假设您没有其他规则,所以执行
$> iptables -F; iptables -t nat -F; iptables -t mangle -F |
如果您收到错误提示找不到 iptables,请找到并安装它。如果提示没有名为“nat”的表,请重新编译具有 nat 支持的内核。如果提示没有名为“mangle”的表,请不要担心,MASQ'ing 不需要它。如果提示 iptables 与您的内核不兼容,请获取 > 2.4 并使用 iptables 支持编译它。
那么,如果您有静态 IP,请执行(例如,网卡未使用 DHCP)
$> iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 123.12.23.43 |
或者对于动态 IP(例如,调制解调器 - 您必须先拨打电话号码)
$> iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE |
最后,告诉内核是的,您真的想开始转发数据包:(每个重启只需要执行一次 - 但多做几次也没坏处)
$> echo 1 > /proc/sys/net/ipv4/ip_forward |
一旦您检查了这一切都正常工作(请参阅安装后说明),只允许来自内部网络的伪装 - 您毕竟不想允许互联网上的人使用它:)
首先,允许任何现有连接或任何相关连接(例如,ftp 服务器连接回您)
$> iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT |
如果这给出了错误,那么您很可能在内核中没有状态跟踪 - 请重新编译。然后只允许来自我们的内网(本地/内部网络)的新连接。将 ppp0 替换为 eth0 或任何您的外部设备。(! 表示除了...之外的任何事物)
$> iptables -A INPUT -m state --state NEW -i ! ppp0 -j ACCEPT |
现在拒绝其他一切
$> iptables -P INPUT DROP #only if the first two are succesful |
如果前两个规则中的任何一个失败,那么最后这个规则将阻止伪装完全工作。要撤消此规则,请执行“iptables -P INPUT ACCEPT”。
现在应该一切正常了。别忘了
设置内部网络上的所有客户端,使其网关指向 Linux 内部 IP 地址。(在 Windows 中,右键单击“网络邻居”->“属性”->“网关”,然后将其更改为 Linux 网关内部 IP。)
如果您的 ISP 有 HTTP 代理,请设置所有客户端以使用您的 ISP 的 HTTP 代理,使用透明代理(警告 - 我听说过透明代理在非常大的网络上速度非常慢的报告),或者在您的新 Linux 网关上运行 squid。(这是可选的,但对于大型网络来说更可取)
确保在设置客户端时指定 DNS。否则,您将在客户端上收到错误消息,提示“无法解析地址”等。如果 DNS 过去可以工作(URL 地址可以工作),但在您设置伪装后不起作用,这是因为您的 ISP/网络的 DHCP 服务器无法再告诉您 DNS 地址是什么。
[题外话] 我想知道您是否可以简单地发送 dhcp 广播,该广播仅转发 dns 服务器(以及 http_proxy),而无需设置 dhcp 服务器(即使您这样做)。有人可以给我发邮件关于这个吗?:)
感谢 Richard Atcheson 指出这一点。
现在您应该开始保护它了!首先,关闭一般的转发:“iptables -P FORWARD DROP”,然后学习如何使用 iptables 和/etc/hosts.allow和/etc/hosts.deny来保护您的系统。警告 - 在您使伪装工作之前,不要尝试此提及的 iptables 规则。如果您要将最后一个规则设置为 DENY,则必须显式允许您想要的每个数据包通过。(使用“iptables -P FORWARD ACCEPT”撤消)
允许您希望互联网看到的任何服务通过。
例如,要允许访问您的 Web 服务器,请执行
$> iptables -A INPUT --protocol tcp --dport 80 -j ACCEPT $> iptables -A INPUT --protocol tcp --dport 443 -j ACCEPT |
要允许 ident(用于连接到 irc 等),请执行
$> iptables -A INPUT --protocol tcp --dport 113 -j ACCEPT |
要测试它
尝试使用 IP 从客户端连接到 Web。Google 的 IP 是 216.239.33.100(好吧,这是其中之一),您应该能够从中获得回复。例如,“ping 216.239.33.100” “lynx 216.239.33.100”。
尝试按名称进行完全连接。例如,“ping google.com” “lynx google.com” 或从 Internet Explorer / netscape。
其中 eth0 是外部互联网网卡,123.12.23.43 是该机器的外部 IP。
如何列出到目前为止我拥有的规则?
- 尝试
$> iptables -L $> iptables -t nat -L |
它无法解析 IP!我输入“www.microsoft.com”,它说找不到它!
- 确保将 dns 服务器 IP 添加到所有客户端。
它不起作用!它不喜欢 iptables / NAT / SNAT / MASQ
- 获取最新的内核,并使用 iptables 和完整的 NAT 支持进行编译。
它不起作用!伪装根本不起作用!去死吧,人渣!
- 尝试 echo 1 > /proc/sys/net/ipv4/ip_forward
它不起作用!我根本无法使用网络,我讨厌你!
- 尝试
$> iptables -F $> iptables -t nat -F $> iptables -t mangle -F |
(所有规则都消失了)然后重新运行其他 iptables 规则。
- 尝试 iptables -P FORWARD ACCEPT
它仍然不起作用!
- 嗯,"dmesg | tail" 给出任何错误吗?或者 "cat /var/log/messages | tail" ?虽然我不在乎...
我不明白,它就是不起作用!
- 我不知道.. 但您应该能够
1) From the gateway machine, ping the outside 2) From the gateway ping your internal machines 3) From the internal machines ping the gateway |
这发生在您玩弄伪装之前
我应该把这些东西放在哪里?
- 在/etc/network/interfaces文件或 firewall.rc 中。如果您将其放在 interfaces 文件中,则将其作为外部接口的 pre-up,并将“iptables -t nat -F”作为 post-down。
如何让它仅按需启动 ppp?
- 假设您的 ISP 网关 IP 是 23.43.12.43,为了方便讨论,然后附加如下行
:23.43.12.43
到/etc/ppp/peers/provider在末尾。(这是针对动态 IP - 静态 IP 将是 my.external.ip.number:23.43.12.43 )
然后在该文件的末尾添加一个换行符
demand
Pppd 将保留在后台以按需重拨连接(如果连接断开),直到您执行“ifdown ppp0”或“poff”,除非您添加“nopersist”选项,在这种情况下,pppd 将在连接建立后退出。您还可以添加新行“idle 600”以在空闲 10 分钟后断开连接。
连接一直断开!
- 首先,您是否启用了按需拨号?它是否正在按预期工作?检查/etc/ppp/peers/provider,并确保您的拨号正常工作,然后再尝试伪装。
- 其次,如果没有,那么也许像我一样,有些事情变得很奇怪,您需要回退到 Linux 2.4.3 并查看它是否有效... 我也不知道为什么。
我讨厌自己做这些!我想要一个预制的脚本和 GUI 等。
- 当然: http://shorewall.sourceforge.net/
羡慕吧!
我是否将有线调制解调器算作静态 IP 或动态 IP?
- 好问题.. 不如将其设为动态 IP。
我是否将 DHCP 网卡算作静态 IP 或动态 IP?
- 它们是动态的。
如何处理传入服务?
- 尝试转发或重定向 IP 端口 - 再次确保在需要时使用防火墙保护它。
从客户端,我可以 ping Linux 网关的外部 IP 地址,但无法访问互联网。
- 好的,尝试执行“rmmod iptable_filter” - 更多信息,我会尽快获取。
- 确保您没有运行 routed 或 gated - 要检查,请运行 “ps aux | grep -e routed -e gated”。
如何查看已建立的连接?类似于 netstat...
- 尝试 cat /proc/net/ip_conntrack
我需要更多关于 squid 信息和路由等!
- 尝试高级路由 HOWTO http://www.linuxdoc.org/HOWTO/Adv-Routing-HOWTO.html
这个 howto 太垃圾了!我如何向编写这个的人大喊大叫?
- 前往 irc.opensource.net 上的 #debian,找到并定位 JohnFlux。 - 发邮件给我 (JohnFlux),地址为 tapselj0@cs.man.ac.uk
这个 howto 太垃圾了!我如何查看更好的版本?
- 参考 LDP Masq-HOWTO。
您还在做什么?
目前,我正在编写关于 linux 上反导弹导弹简易指南。目前还没有关于保护您的系统免受新手核攻击的优秀指南。人们似乎认为这是火箭科学之类的东西..