我正在尝试在 PS3 上玩一款日本卡拉 OK 游戏,但延迟太可怕了,下载歌曲需要很长时间。我得到的一个建议是将我的笔记本电脑变成 SOCKS 代理,通过 OpenSSH 登录到我朋友在日本的服务器。
[服务器]----(ssh 隧道)---[wlan0 < 笔记本电脑 > eth0]---[PS3]
所以我是这么做的:
ssh -ND 4711 [email protected]
当时我尝试使用 Firefox(使用 SOCKS 代理设置)从我的笔记本电脑访问 google.com,结果被重定向到 google.co.jp。太棒了。
然后我想通过以太网将我的 PS3 连接到我的笔记本电脑。
我首先使用以下命令为 eth0 分配一个静态 IP:
ip link set dev eth0 up
ip addr add 139.96.30.100/24 dev eth0
然后我在笔记本电脑上启动了 DHCP 服务器,为 PS3 分配一个 IP:
systemctl start dhcp4.service
最后我使用一些 iptables 魔法启用了 NAT:
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
我进入“网络设置”,测试了 PS3 的连接,看起来一切正常。我启动了网络浏览器,google.com 被重定向到 google.fr。真是愚蠢,我忘了将连接转发到正确的端口。
通过 iptables 进行了大量连接转发但均无效后,我决定尝试使用透明代理:redsocks。http://darkk.net.ru/redsocks/
安装后,我修改了 /etc/redsocks.conf 以满足我的需求:
redsocks {
local_ip=0.0.0.0; // documentation says: "use 0.0.0.0 if you want to listen on every interface"
local_port=31388;
ip=127.0.0.1;
port=4711;
}
其余部分则保留在https://github.com/darkk/redsocks/blob/master/redsocks.conf.example
我使用了所安装包中提供的基本 redsocks.rules:
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:REDSOCKS - [0:0]
# Redirect all output through redsocks
-A OUTPUT -p tcp -j REDSOCKS
# Whitelist LANs and some other reserved addresses.
# https://en.wikipedia.org/wiki/Reserved_IP_addresses#Reserved_IPv4_addresses
-A REDSOCKS -d 0.0.0.0/8 -j RETURN
-A REDSOCKS -d 10.0.0.0/8 -j RETURN
-A REDSOCKS -d 127.0.0.0/8 -j RETURN
-A REDSOCKS -d 169.254.0.0/16 -j RETURN
-A REDSOCKS -d 172.16.0.0/12 -j RETURN
-A REDSOCKS -d 192.168.0.0/16 -j RETURN
-A REDSOCKS -d 224.0.0.0/4 -j RETURN
-A REDSOCKS -d 240.0.0.0/4 -j RETURN
# Redirect everything else to redsocks port
-A REDSOCKS -p tcp -j REDIRECT --to-ports 31338
COMMIT
这使得我可以停止使用 Firefox 和 luakit 上的 SOCKS 代理设置,我已通过 google.com 变为 google.co.jp 测试确认了这一点。
我认为我仍然必须启用 NAT,因此我重做了:
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
PS3 显然绕过了系统范围的代理,google.com 被重定向到 google.fr。然后我照原样使用 redsocks.rules 文件,没有伪装。我相信无论如何我都不需要 NAT,因为 redsocks 服务器显然会监听每个接口。
我尝试再次连接 PS3,但收到以下消息(PS3 从我的 DHCP 服务器获取 IP 后,无法获取互联网连接):
“与服务器通信时发生错误。这是 DNS 错误。”
这就是我现在的情况。不过我猜这可能是 redsocks 的问题,因为它使用一个名为 dnstc 的 DNS 服务器,根据文档,该服务器执行以下任务:
dnstc {
// fake and really dumb DNS server that returns "truncated answer" to
// every query via UDP, RFC-compliant resolver should repeat same query
// via TCP in this case.
local_ip = 127.0.0.1;
local_port = 5300;
}
我猜测我的 PS3 通过 UDP 请求 DNS 解析,而 dnstc 总是回复“截断答案”。如果我理解正确的话,它应该通过 TCP 重新发送请求,但显然它会产生 DNS 错误?
我该怎么办?或者更准确地说:
- redsocks 是不是没有必要?我是不是对 iptables 一窍不通?
- 我应该安装 DNS 服务器并转发 DNS 请求吗?如果是,该怎么做?
感谢您阅读这段文字!希望第一个问题不会太糟糕...
答案1
你可以将 PS3 设置为使用静态 DNS 服务器。你可以尝试开放DNS,其服务器位于208.67.222.222
和208.67.220.220
,或尝试Google 的公共 DNS 服务器上8.8.8.8
和8.8.4.4
。