Mac OS X 10.10에서 pfctl
및 dnctl
.
nc
나는 더미넷 파이프 조절이 올바르게 작동하는지 확인하기 위해 netcat() 및 합성 무작위 페이로드 파일을 사용하여 간단한 테스트 서버와 클라이언트를 구현했습니다 . 지금까지 dummynet 파이프를 구성하려고 시도했습니다.무루스 방화벽 GUI 앱트래픽을 올바르게 제한하지 않는 것 같습니다(64MB 전송은 ~200ms 내에 완료됨).
다음은 완전한 예인 OSX bash 쉘 스크립트( brew install coreutils
에 필요)입니다. gdate
하나의 터미널에서 다음과 같이 실행하면:
./throttle-test.sh server
그리고 또 하나는
./throttle-test.sh client
그들은 인터페이스를 통해 64MB 페이로드를 전송하려고 시도합니다 en0
( lo0
거대한 MTU가 WAN 트래픽과 유사하지 않기 때문에 사용하지 않음).
또한 파일을 원격 Linux 랩톱으로 전송하여 로컬 IP인 원본 및 대상 IP가 모두 조절을 우회하는지 확인했지만 LAN/WiFi의 원격 컴퓨터에도 속도가 조절 제한보다 훨씬 빠릅니다.
내 질문은 이 파일 전송을 특정 대역폭 제한(예: 8mbps)으로 구성 pfctl
하고 제한하는 올바른 스크립트가 무엇인지입니다 . dnctl
제한 범위는 특정 TCP 포트일 수 있습니다.
참고 OS X 10.10에는 더 이상 포함되지 ipfw
않으므로 pfctl
및 dnctl
.
throttle-test.sh
내 파일 은 다음과 같습니다 .
#!/bin/bash
set -o errexit # always exit on error
set -o errtrace # trap errors in functions as well
set -o pipefail # don't ignore exit codes when piping output
set -o posix # more strict failures in subshells
# set -x # enable debugging
IFS="$(printf "\n\t")"
setup_payload() {
local payload_path="$1"
local size_kbytes="$2"
mkdir -p $(basename "${payload_path}")
if [[ -f "${payload_path}" ]]; then
local on_disk=$(wc -c < "${payload_path}")
fi
if [[ ${on_disk} -ne $((${size_kbytes} * 1024)) ]]; then
echo "creating payload file ${payload_path}"
dd if=/dev/urandom of="${payload_path}" \
bs=1024 count="${size_kbytes}" &> /dev/null
fi
}
start_server() {
local payload_path="$1"
local ip="$2"
local port="$3"
while true; do
echo "Starting netcat server for ${payload_path} on ${ip}:${port}"
nc -l "${ip}" "${port}" < "${payload_path}"
sleep 1
done
}
hash() {
shasum -a 256 "$1" | cut -d " " -f 1
}
verify_hashes() {
# Sanity check no funny business
from_hash=$(hash "$1")
to_hash=$(hash "$2")
if [[ "${from_hash}" != "${to_hash}" ]]; then
echo "checksums did not match ${from_hash} ${to_hash}" 1>&2
exit 10
fi
}
client() {
local payload_path="$1"
local ip="$2"
local port="$3"
# time how long it takes to transfer the payload file
start=$(gdate +%s%3N)
nc -d "${ip}" "${port}" > "${payload_path}.client"
stop=$(gdate +%s%3N)
verify_hashes "${payload_path}" "${payload_path}.client"
local duration=$((${stop} - ${start}))
echo "${duration}"
}
main() {
local size_kbytes=$((64 * 1024)) # 64 MB
local payload_path="/tmp/throttle-test/data-${size_kbytes}.bin"
local port="${PORT-9112}"
# You may need to change this if you are on linux
local interface="${INTERFACE-en0}"
local ip=$(ipconfig getifaddr "${interface}")
setup_payload "${payload_path}" "${size_kbytes}"
case "$1" in
server)
start_server "${payload_path}" "${ip}" "${port}"
;;
client)
local duration=$(client "${payload_path}" "${ip}" "${port}")
echo "Transfered ${size_kbytes} kbytes in ${duration} ms"
;;
*)
echo "Usage: $0 <server|client>"
;;
esac
}
main "$@"
업데이트
여기 내가 지금까지 가지고 있는 것이 있다. 이것은 다운로드 방향에서는 올바르게 작동하는 것 같지만 업로드 방향에서는 전혀 제한되지 않습니다.
throttle_start() {
local down_mbps="$1"
local up_mbps="$2"
local delay=$(($3 / 2))
sudo dnctl pipe 1 config bw "${down_mbps}Mbit/s" delay "${delay}"
sudo dnctl pipe 2 config bw "${up_mbps}Mbit/s" delay "${delay}"
(cat /etc/pf.conf && \
echo 'dummynet-anchor "throttle"' && \
echo 'anchor "throttle"') | sudo pfctl -f -
cat << EOF | sudo pfctl -a throttle -f -
dummynet in quick proto tcp from any port = 9112 to any pipe 1
dummynet out quick proto tcp from any to any port = 9112 pipe 2
EOF
sudo pfctl -q -e
}
답변1
다음은 El Capitan 10.11에서 어느 정도 성공한 스크립트입니다.
#!/bin/bash
# Reset dummynet to default config
dnctl -f flush
# Compose an addendum to the default config: creates a new anchor
(cat /etc/pf.conf &&
echo 'dummynet-anchor "my_anchor"' &&
echo 'anchor "my_anchor"') | pfctl -q -f -
# Configure the new anchor
cat <<EOF | pfctl -q -a my_anchor -f -
no dummynet quick on lo0 all
dummynet out proto tcp from any to any port 1:65535 pipe 1
EOF
# Create the dummynet queue
dnctl pipe 1 config bw 40000byte/s
# Activate PF
pfctl -E
# to check that dnctl is properly configured: sudo dnctl list
관련된 유일한 차이점은 과 같습니다 no dummynet quick on lo0 all
. 실제로 무엇을 하는지는 모르겠지만 여기에서 찾을 수 있습니다.https://www.reddit.com/r/osx/comments/3g7dim/limiting_bandwidth_per_application/