Linux 作为路由器:我有 3 个 Internet 提供商,每个提供商都有自己的调制解调器。
Provider1,网关地址 192.168.1.1
连接linux路由器eth1 /192.168.1.2
Provider2,网关地址192.168.2.1
连接linux路由器eth2 /192.168.2.2
Provider3,网关地址192.168.3.1
连接linux路由器eth3 /192.168.3.2
________
+------------+ /
| | |
+----------------------+ Provider 1 +--------|
__ |192.168.1.2 |192.168.1.1 | /
___/ \_ +------+-------+ +------------+ |
_/ \__ | eth1 | +------------+ /
/ \ eth0| |192.168.2.2 | | |
|Client network -----+ ROUTER eth2|--------------+ Provider 2 +------| Internet
\10.0.0.0/24 __/ | | |192.168.2.1 | |
\__ __/ | eth3 | +------------+ \
\___/ …Run Code Online (Sandbox Code Playgroud) I'd like to redirect local requests to port which is translated with NAT. I have following rules:
iptables -t nat -A PREROUTING -p tcp --dport 9020 -j DNAT --to 10.0.3.11:80
Run Code Online (Sandbox Code Playgroud)
however request coming from localhost are rejected:
wget http://127.0.0.1:9020
Connecting to 127.0.0.1:9020... failed: Connection refused.
Run Code Online (Sandbox Code Playgroud)
当我从任何其他计算机连接时,它可以工作。有没有办法在不重新编译内核的情况下做到这一点CONFIG_IP_NF_NAT_LOCAL=y?https://wiki.debian.org/Firewalls-local-port-redirection(似乎已过时)。
更新:
iptables -L -v -n --line-numbers -t nat:
Chain PREROUTING (policy ACCEPT 26 packets, 3230 bytes)
num pkts bytes target prot opt in out source destination
4 0 0 …Run Code Online (Sandbox Code Playgroud) 我做了两个实验。这是他们俩的网络:
[private network] [public network]
A -------------------- R ----------------- B
192.168.0.5 192.168.0.1|192.0.2.1 192.0.2.8
Run Code Online (Sandbox Code Playgroud)
一个的默认网关[R 。R有 IPv4 转发活动和以下 iptables 规则:
iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 50000
Run Code Online (Sandbox Code Playgroud)
目的是,来自A 的任何 TCP都将使用R的端口 50000屏蔽为 192.0.2.1 。
我在B上的端口 60000 上使用nc -4l 192.0.2.8 60000.
然后我从A打开了一个连接:nc -4 192.0.2.8 60000
A开始发送如下所示的数据包:
192.168.0.5:53269 -> 192.0.2.8:60000
Run Code Online (Sandbox Code Playgroud)
R将其翻译成
192.0.2.1:50000 -> 192.0.2.8:60000
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好。
然后我试图打开下面的客户端- [R :nc -4 192.0.2.8 60000 …
我试图弄清楚 NAT 和 iptables 是如何工作的。当我处于学习它的反复试验阶段时,我发现了两个有点矛盾的方法。
一种方法是使用脚本iptables一个接一个地调用规则。该脚本似乎被命名和存储,以便它在系统启动期间尽早执行,我认为一个问题可能是其他脚本可能会在它之后调用并撤消其意图。我什至认为我在使用备份(00-firewall-old)保存并重命名原始脚本(00-firewall)时偶然做了一次。Howto 的示例脚本是:
#!/bin/sh
PATH=/usr/sbin:/sbin:/bin:/usr/bin
#
# delete all existing rules.
#
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X
# Always accept loopback traffic
iptables -A INPUT -i lo -j ACCEPT
# Allow established connections, and those not coming from the outside
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state NEW -i ! eth1 -j ACCEPT
iptables -A FORWARD -i eth1 …Run Code Online (Sandbox Code Playgroud) 我使用来自 OpenWRT 的自动生成规则作为 NAT 反射(NAT 环回)的示例。
所以让我们假设有一个网络 192.168.1.0/24 有两个主机(+ 路由器):192.168.1.100 和 192.168.1.200。路由器有两个接口 LAN(br-lan)和 WAN(eth0)。LAN 接口的 IP 为 192.168.1.1,WAN 接口的 IP 为 82.120.11.22(公共)。192.168.1.200 上有一个 www 服务器。我们想使用公共 IP 地址从 192.168.1.100 连接到 Web 服务器。
如果您想重定向 WAN->LAN 以便互联网上的人可以访问 Web 服务器,您可以将以下规则添加到 iptables:
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.1.200:80
Run Code Online (Sandbox Code Playgroud)
我知道规则是什么意思。但是还有另外两条规则负责 NAT 反射。其中之一对我来说不像上面的那么清楚。所以第一条规则是这样的:
iptables -t nat -A PREROUTING -i br-lan -s 192.168.1.0/24 -d 82.120.11.22/32 -p tcp -m …Run Code Online (Sandbox Code Playgroud) 最近在学习iptables,我知道有5个独立的表,其中两个是filter和nat表。而且我有时会查看netatat -rorroute表,我知道ip命令可以修改这个路由表。我对这两种表有点困惑:
他们都可以对数据包流量做一些事情,看起来他们可以做类似的事情,有人可以告诉我有什么区别吗?提前致谢。
在 Ubuntu 下可以有两个 VPN 连接吗?
设想:
所以我想做的是:
我尝试过但不起作用的事情:
尝试直接打开到我们组的交换机/路由器的公共 IP 地址的 VPN 连接。连接甚至从未到达交换机,即,不会由组织的路由器路由。
我尝试在我的 Linux/Ubuntu 系统中建立第一个 VPN 连接,在 Virtual Box 中启动另一个系统实例,然后在虚拟化系统中打开一个到我们网络的 VPN 连接。我认为这应该有效,但事实并非如此。
有什么方法可以创建一个 VPN 连接,而不是使用物理 DSL 连接,而是使用现有的 VPN 连接?
或者还有其他更简单的解决方案吗?我个人认为 VPN 是可行的方法,因为我需要访问多个网络服务(数据库、共享,甚至打印机),但我不确定。
我有一个双端口以太网 NIC,假设我已将两个端口连接到一个循环中,并将以下 IP 分配给 2 个以太网接口:
我想通过物理网络将流量从一个端口发送到另一个端口,例如 ping 192.168.3.1from 192.168.2.1. 但是,Linux 内核中的 TCP/IP 堆栈识别出这两个地址是本地地址,而是将流量发送到环回适配器,因此流量永远不会到达物理网络。
我最接近解决方案的是 Anastasov 的send-to-self patch,不幸的是,它自内核 3.6 以来已停止使用,因此它不适用于我的 Ubuntu 13.10(内核 3.11)。我已经尝试为 3.11 重写补丁,但我似乎无法在 Ubuntu 发行版中找到这些补丁:
有没有办法让发送给自己的补丁工作,或者替代解决方案?
我的家庭拓扑:
router1 (192.168.1.1) - D-Link dsl2540u 服务器,具有可从 Internet 获得的静态 IP(通过 ppoe 的 ADSL)。4个局域网端口。
router2 (192.168.1.2) - 带有 OpenWRT 的 D-Link DIR-300。扮演 WiFi 接入点的角色。4 个 LAN 端口 + WAN 端口。
家用 PC(通过 DHCP 连接到 router1)
|
互联网------路由器1-----
|
router2(OpenWRT 上的 OpenVPN 服务器)
在 router1 上,我设置了 NAT 虚拟服务器,并且可以通过 SSH 或 OpenVPN(443 端口上的 tcp)连接到我的路由器

OpenVPN 服务器工作正常,连接后所有流量都通过 tun 接口。
OpenVPN 服务器配置(如果重要):
--脚本安全2 模式服务器 开发屯 端口 443 协议协议 服务器 10.0.0.0 255.255.255.0 推“重定向网关def1” push "dhcp-option DNS 192.168.1.1" # 将此更改为路由器的 LAN IP 地址 push "route 192.168.1.0 255.255.255.0" …
所以,我们不关心为什么,更关心如何,我想看看有没有人知道我在这里哪里出错了。
基本上,我想将所有前往端口 80 的数据包转发到我已别名为环回设备 (169.254.169.254) 的 IP 上,以便转发到另一个 IP 上的端口 8080,这恰好是该 IP 的公共 IP同一个框(我们将使用 1.1.1.1 来解决这个问题)。这样做,我应该[表面上]能够跑
telnet 169.254.169.254 80
Run Code Online (Sandbox Code Playgroud)
并达到 1.1.1.1:8080,但是,这并没有发生。
这是我在 iptables 中的 nat 表:
~# iptables -nvL -t nat
Chain PREROUTING (policy ACCEPT 66 packets, 3857 bytes)
pkts bytes target prot opt in out source destination
0 0 DNAT tcp -- * * 0.0.0.0/0 169.254.169.254 tcp dpt:80 to:1.1.1.1:8080
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy …Run Code Online (Sandbox Code Playgroud)