目标:在我自己的 Debian VPS 上复制 StrongVPN 的功能。使用 StrongVPN,似乎所有提供的公共 IP 上的端口都会转发到客户端,这意味着,例如,来自“外部”的 ssh :22 连接到我的路由器。此外,我路由器客户端上的 upnp / NATPMP 等也能正常工作(skype,返回到我的 mac)。需要注意的是,服务器需要“持续”接收某些端口(22、80 等)上的流量才能保持功能,因此需要通过 IPtables 将这些端口从任何转发设置中“剔除”。
服务器:我有一个 VPS,最新的 Debian 运行 OpenVPN 和 bind9。我有一个 NIC 和一个公共 IP。该服务器还运行 apache,我需要通过 ssh 访问它进行配置。
客户:运行 OpenWRT 的路由器。我目前已将其设置为使用 StrongVPN。我想转而使用自己的 VPS。
必需的:帮助生成一组合适的 iptables 规则。
我有一个基本的、有效的 OpenVPN 配置,如下所示,以及 iptable 规则的开头。
客户端.conf:
remote 46.aaa.xxx.yyy 1194 udp
dev tun
ifconfig 172.19.233.2 172.19.233.1
secret static.key
redirect-gateway def1
服务器.conf:
dev tun
proto udp
port 1194
ifconfig 172.19.233.1 172.19.233.2
secret /etc/openvpn/static.key
ifconfig:
eth0 Link encap:Ethernet HWaddr 52:XXXXXXXXXXXX
inet addr:46.aaa.xxx.yyy Bcast:46.aaa.xxx.xxx Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:34338527 errors:0 dropped:20 overruns:0 frame:0
TX packets:747507 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:2697230329 (2.5 GiB) TX bytes:577951758 (551.1 MiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:18947 errors:0 dropped:0 overruns:0 frame:0
TX packets:18947 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:2143690 (2.0 MiB) TX bytes:2143690 (2.0 MiB)
tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:172.19.233.1 P-t-P:172.19.233.2 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:164495 errors:0 dropped:0 overruns:0 frame:0
TX packets:166083 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:54062402 (51.5 MiB) TX bytes:162532235 (155.0 MiB)
iptables-保存:
# Generated by iptables-save v1.4.14 on Mon Mar 30 21:47:41 2015
*nat
:PREROUTING ACCEPT [2:344]
:INPUT ACCEPT [1:172]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING ! -d 172.19.233.0/24 -s 172.19.233.0/24 -j MASQUERADE
COMMIT
# Completed on Mon Mar 30 21:47:41 2015
# Generated by iptables-save v1.4.14 on Mon Mar 30 21:47:41 2015
*raw
:PREROUTING ACCEPT [413:36237]
:OUTPUT ACCEPT [190:21548]
COMMIT
# Completed on Mon Mar 30 21:47:41 2015
# Generated by iptables-save v1.4.14 on Mon Mar 30 21:47:41 2015
*filter
:INPUT DROP [5239:662523]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [11365:1381174]
:fail2ban-ssh - [0:0]
-A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh
-A INPUT -i lo -j ACCEPT
-A INPUT -i tun+ -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -p tcp -m multiport --dports 22,53,80,123,443,1194 -j ACCEPT
-A INPUT -p udp -m multiport --dports 53,123,1194 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -o tun+ -j ACCEPT
-A OUTPUT -o eth+ -j ACCEPT
-A fail2ban-ssh -j RETURN
COMMIT
# Completed on Mon Mar 30 21:47:41 2015
更新 以下行可以帮助流量从 VPN 传输到互联网,而不是进行伪装:
iptables -t nat -A POSTROUTING ! -d 172.19.233.0/24 -j SNAT --to-source 46.aaa.xxx.yyy
为了使流量从互联网流向 VPN 客户端,下面的方法似乎有效:
iptables -t nat -A PREROUTING -p tcp -m multiport ! --dports 22,53,80,123,443,1194 -j DNAT --to-destination 172.19.233.2
iptables -t nat -A PREROUTING -p udp -m multiport ! --dports 53,123,1194 -j DNAT --to-destination 172.19.233.2
这些行反映了过滤表中 INPUT 上接受的端口。然后,将 VPN 客户端更改为侦听 ssh / http 等的备用端口,这意味着到例如 46.aaa.xxx.yyy:2222 的流量将传递到客户端。
但我不确定这是否适合需要打开某些端口的服务(例如 Skype/BTMM)。
答案1
您的内容看起来不错。为了使其更具可读性和可维护性,我将为您的客户端创建一个 DNAT 链。它会创建更多规则,但将来读取和添加/删除/更改端口会容易得多。
iptables -t nat -N DNAT_NET2VPN
iptables -t nat -A DNAT_NET2VPN -p tcp --dport 22 -j RETURN
iptables -t nat -A DNAT_NET2VPN -p tcp --dport 53 -j RETURN
iptables -t nat -A DNAT_NET2VPN -p tcp --dport 80 -j RETURN
iptables -t nat -A DNAT_NET2VPN -p tcp --dport 123 -j RETURN
iptables -t nat -A DNAT_NET2VPN -p tcp --dport 443 -j RETURN
iptables -t nat -A DNAT_NET2VPN -p tcp --dport 1194 -j RETURN
iptables -t nat -A DNAT_NET2VPN -p udp --dport 53 -j RETURN
iptables -t nat -A DNAT_NET2VPN -p udp --dport 123 -j RETURN
iptables -t nat -A DNAT_NET2VPN -p udp --dport 1194 -j RETURN
iptables -t nat -A DNAT_NET2VPN -j DNAT --to-destination 172.19.233.2
iptables -t nat -I PREROUTING -i eth0 -d 46.aaa.xxx.yyyy -j DNAT_NET2VPN
理想情况下,您可以从托管服务提供商处获取第二个 IP,以用作 VPN 流量的公共源/目标,但是只有 1 个 IP,您只能像这样拆分端口范围。
答案2
所需的 3 条规则是:
iptables -t nat -A POSTROUTING -o eth0 -s 172.19.233.0/24 -j SNAT --to-source 46.aaa.xxx.bbb
iptables -t nat -A PREROUTING -i eth0 -p tcp -m multiport ! --dports 22,53,80,123,443,1194 -j DNAT --to-destination 172.19.233.2
iptables -t nat -A PREROUTING -i eth0 -p udp -m multiport ! --dports 53,123,1194 -j DNAT --to-destination 172.19.233.2
第 1 条规则是主 SNAT 规则,用于将源 IP 更改为公网 IP。
第二和第三条规则删除列出的所有端口并阻止它们通过隧道转发。