在Debian上使用Squid 4进行透明代理
使用Debian制作的路由器,安装squid的步骤。结果发现安卓LINE应用完全忽略了代理设置,将奇怪的通信流量注入到443端口上。当阻塞外部TCP端口号时,安卓LINE应用将无法使用。以下内容是在Debian Linux Bullseye(版本11)上执行的,但在Ubuntu 20.04或其他类似系统上应该基本相同。还提供了使用squid和nftables启用tproxy(透明代理)的步骤。如果不执行这些步骤,而是在防火墙中阻断外部的TCP 80端口和443端口,LINE将无法使用。
鱿鱼的安装和配置
安装鱿鱼
用apt-get命令并附带–no-install-recommends参数安装squid即可。
Squid的设置
以下类似这样的感觉行吗?
http_access allow localnet # これ書かないとLANの他の機器から使えない
on_unsupported_protocol tunnel all # LINE の謎通信を通すため
# ↓外部インターネットに露出した機器で動作させるなら必ずLAN内のIPアドレスを明示する
http_port 192.168.1.2:3128
# 透過プロキシは異なるポート番号で要求を受け付ける必要がある
http_port 192.168.1.2:3129 tproxy
http_port 192.168.1.2:3130 tproxy
# ファイアーウォールで外向きTCP 80番と443番を遮断している場合、特別に通信を許可された
# 送信元アドレスからSquidにウェブサーバーをアクセスさせるように次の2行を書く
tcp_outgoing_address 外部と通信できるIPv6アドレス
tcp_outgoing_address 外部と通信できるIPv4アドレス
udp_incoming_address DNSの応答を受け付けられるアドレス(できればプライベートアドレス)
# ↓デフォルトでディスクキャッシュは無効なのでメモリーキャッシュはデフォルト値より大きくしてよい
cache_mem 512 MB
maximum_object_size_in_memory 10 MB
# euiはイーサネットMACアドレス
logformat mycombined %>a %>eui %<A %<p %tl "%rm %ru HTTP/%rv" %>Hs %<st "%{Referer}>h" "%{User-Agent}>h" %Ss:%Sh
access_log daemon:/var/log/squid/access.log mycombined
log_mime_hdrs on
relaxed_header_parser warn
# ↓タイムアウトを短くしたほうがすぐにエラーが返ってくる
forward_timeout 10 seconds
connect_timeout 9 seconds
write_timeout 10 seconds
request_timeout 10 seconds
request_start_timeout 1 minute
shutdown_lifetime 12 seconds
mail_program /usr/sbin/sendmail
persistent_connection_after_error off
detect_broken_pconn on
# 使用するDNSがedns0に対応し巨大なパケットを受け付けるなら最大パケットサイズを大きくすべき
dns_packet_max 63 KB
dns_nameservers 127.0.0.1
connect_retries 3
retry_on_error on
uri_whitespace encode
pipeline_prefetch 100
通过代理(tproxy)设置
假设不使用iptables,而是使用apt-get install nftables命令和systemctl enable nftables.service命令来进行整体的包过滤处理设置,这些设置会在/etc/nftables.conf文件中进行。透明代理的目的是为了应对一些应用程序,像Android的LINE应用一样,它会忽略系统的代理设置,或者像家中使用的ONKYO的互联网收音机兼容CD播放器一样,该设备本身就不支持代理设置。使用iptables的具体步骤在tproxy搭建备忘录中有详细说明。
nftables 的配置
只要按照Linux kernel附带文档中的说明,在/etc/nftables.conf中添加以下内容即可。
# IPv6 パケットにも透過プロキシする場合は次行の ip をinetにする必要あり
table ip my_tproxy {
chain PREROUTING {
type filter hook prerouting priority mangle;
meta l4proto tcp socket transparent 1 meta mark set 300 counter accept
tcp dport 80 ip daddr != 192.168.1.0/24 tproxy to 192.168.1.2:3129 meta mark set 300 counter log prefix "tproxy " level debug flags all
tcp dport 443 ip daddr != 192.168.1.0/24 tproxy to 192.168.1.2:3130 meta mark set 300 counter log prefix "tproxy " level debug flags all
}
}
使用ip rule和ip route进行配置
为了使得Linux内核运行下面的策略路由,并在systemd启动时执行脚本,需要执行systemctl daemon-reload && systemctl enable tproxyroute.service。
[Unit]
Description=Set Routes for Transparent Proxy by Squid
After=network-online.target nftables.service
Requires=network-online.target nftables.service
Before=squid.service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/sbin/ip rule add fwmark 300 lookup 100
ExecStart=/sbin/ip route add local 0.0.0.0/0 dev lo table 100
[Install]
WantedBy=multi-user.target
只使用systemd配置文件代替IP的示例。
如果你的系统上安装了较新的systemd版本,可以使用下面这个tproxyroute.service的替代方式。
[Match]
Name=lo
[Link]
RequiredForOnline=yes
[RoutingPolicyRule]
FirewallMark=300
Table=100
Family=ipv4
[Route]
Table=100
Destination=0.0.0.0/0
Type=local
可以创建这个文件。
安卓手机的代理设置
基本上,根据谷歌的说明是正确的,但我们的手机和平板电脑如果要设置代理服务器来连接已有的WiFi,必须先删除该连接信息,然后重新进行连接设置,否则就无法在下面的界面上点击”详细”按钮…即使进行了这样的设置,一些不良的应用程序如LINE等仍会无视代理设置,因此需要上述透明代理。此外,不管如何尝试,我们的手机一直有故障,无法运行自动代理设置。
