类似 StrongVPN 的 VPN 端点的 iptables 规则

类似 StrongVPN 的 VPN 端点的 iptables 规则

目标:在我自己的 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。

第二和第三条规则删除列出的所有端口并阻止它们通过隧道转发。

相关内容