我有一个 VPS,已成功设置 VPN。我使用 OpenVPN 客户端连接。VPN 服务器接口为 10.8.0.1,客户端接收 10.8.0.? IP。我可以 ping 10.8.0.1。我似乎还可以 telnet 到 10.8.0.1:80、10.8.0.1:443 等标准端口,这些端口上有可用的服务,但不能 telnet 到 10.8.0.1:3306。
这是 ifconfig 打印的 VPN 连接:
tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:10.8.0.1 P-t-P:10.8.0.2 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:383 errors:0 dropped:0 overruns:0 frame:0
TX packets:358 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:29356 (28.6 KiB) TX bytes:149232 (145.7 KiB)
MySQL 不绑定任何 IP,因此它可以从任何地方接收连接。我想通过 IPTABLES 降低它的可见性。
然后我将这些规则添加到IPTABLES:
# allow connections from the vpn
iptables -A INPUT -s 10.8.0.0/24 -p tcp --dport 3306 -j ACCEPT
# allow local connections eg your scripts running locally
iptables -A INPUT -s 127.0.0.1 -p tcp --dport 3306 -j ACCEPT
# deny any other attempts of connecting to mysql
iptables -A INPUT -p tcp --dport 3306 -j DROP
现在我可以从服务器本身连接到 127.0.0.1。我无法通过其公共 IP 连接到服务器。我无法通过 10.8.0.1(VPN IP)连接到它。
这是我的完整 IPTABLES:
[root@ddinvps mail]# iptables -L -n
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:1723
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
icmp_packets all -- 0.0.0.0/0 0.0.0.0/0
tcp_packets all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 10.8.0.0/24 0.0.0.0/0 tcp dpt:3306
ACCEPT tcp -- 127.0.0.1 0.0.0.0/0 tcp dpt:3306
DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:3306
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain icmp_packets (1 references)
target prot opt source destination
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 icmp type 0
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 icmp type 3
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 icmp type 11
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 icmp type 8
DROP icmp -- 0.0.0.0/0 0.0.0.0/0
Chain tcp_packets (1 references)
target prot opt source destination
ACCEPT all -- 127.0.0.1 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:53
ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:53
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:25
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:26
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
ACCEPT tcp -- 10.3.124.200 0.0.0.0/0 tcp dpt:9102
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:143
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:993
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:110
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:10000
DROP tcp -- 0.0.0.0/0 0.0.0.0/0
DROP udp -- 0.0.0.0/0 0.0.0.0/0
有任何想法吗?
答案1
数据包正在被tcp_packets
链过滤。这是因为您的iptables -A
命令已将新规则添加到链的末尾,并且过滤器在第一次匹配获胜时起作用。解决问题的最简单方法是使用以下命令INPUT
将您的规则添加到链的开头,例如INPUT
iptables -I
iptables -I INPUT -s 10.8.0.0/24 -p tcp --dport 3306 -j ACCEPT
等等,这会将您的新规则插入到链的开头。
答案2
很明显,您的 tcp_packets 链在达到您的规则之前会丢弃流量。
将此规则添加到 tcp_packets 链的开头,或者在 INPUT 链中,但在跳转 tcp_packets 之前